O documento compara as linguagens Go e Lua, descrevendo seus principais tipos de dados e características de verificação de tipos. Go possui tipos mais rígidos e verificação estática de tipos, enquanto Lua é fracamente tipada e permite maior flexibilidade. Ambas suportam funções de primeira classe e arrays/mapas associativos, porém diferem nos detalhes de implementação desses tipos.
Partindo além do Java e conhecendo novas linguagens e tecnologias que podem aumentar o seu conjunto de ferramentas.
Palestra apresentada originalmente em 11 de julho de 2011 no N-ésimo encontro do PBJUG.
O documento discute programação concorrente, abordando modelos de comunicação entre tarefas como memória compartilhada e troca de mensagens, além de técnicas para coordenar acesso a recursos compartilhados. Também apresenta linguagens para programação concorrente como Erlang, Limbo e OCCAM, destacando recursos e exemplos de código em cada uma.
The document discusses sexually transmitted diseases (STDs), noting that they can be contracted by having unprotected sex. It explains that using condoms and getting tested can minimize risk, and that risk increases with more sexual partners. The document outlines that STDs can be caused by viruses, bacteria, and parasites, and lists some specific examples. It provides tips for preventing STDs, such as practicing safe sex, limiting partners, avoiding casual sex, and not having sex under the influence of drugs or alcohol. Finally, it states that most STDs can be cured if diagnosed and treated early.
Uma das coisas que mais me chamou atenção na epoca que fiz esta matéria foi exatamente este captulo. Nele vemos diversas meios que são super validos hoje para trabalhar a programação concorrente, resolvi postar este conteudo por que eu acho que se trata um importante assunto que muitos dos meus amigos no qual eu questiono e eles não tiveram a oportunidade de ver isto.
Informações sobre as seguintes linguagens de programação: C, C++, Objective-C, Java, JavaScript, Ruby, PHP e C#. Exposição de algumas aplicações destas linguagens em desenvolvimento: de sistemas operacionais (sistemas baseados em UNIX e Windows), desktop (Windows, Mac OS X e Linux), Web (do lado do servidor e do lado do cliente), para smartphones e tablets (Android, iOS, Windows Phone, Windows Store apps), para a nuvem (Amazon Web Services, Windows Azure, Google App Engine), de jogos para múltiplas plataformas, etc.
Palestra "Plataforma de compiladores .NET, C# 6 e Visual Studio 2015" apresentada no dia 25 de abril de 2015 no evento Global Azure Bootcamp 2015 da Microsoft.
1) O documento discute programação concorrente e como ela se relaciona com programação orientada a objetos. 2) É apresentado um roteiro para o curso de programação concorrente, abordando concorrência, objetos e concorrência, e padrões de projeto. 3) Construtores de execução concorrente como threads, processos e tarefas são comparados considerando autonomia, compartilhamento, agendamento e comunicação.
Partindo além do Java e conhecendo novas linguagens e tecnologias que podem aumentar o seu conjunto de ferramentas.
Palestra apresentada originalmente em 11 de julho de 2011 no N-ésimo encontro do PBJUG.
O documento discute programação concorrente, abordando modelos de comunicação entre tarefas como memória compartilhada e troca de mensagens, além de técnicas para coordenar acesso a recursos compartilhados. Também apresenta linguagens para programação concorrente como Erlang, Limbo e OCCAM, destacando recursos e exemplos de código em cada uma.
The document discusses sexually transmitted diseases (STDs), noting that they can be contracted by having unprotected sex. It explains that using condoms and getting tested can minimize risk, and that risk increases with more sexual partners. The document outlines that STDs can be caused by viruses, bacteria, and parasites, and lists some specific examples. It provides tips for preventing STDs, such as practicing safe sex, limiting partners, avoiding casual sex, and not having sex under the influence of drugs or alcohol. Finally, it states that most STDs can be cured if diagnosed and treated early.
Uma das coisas que mais me chamou atenção na epoca que fiz esta matéria foi exatamente este captulo. Nele vemos diversas meios que são super validos hoje para trabalhar a programação concorrente, resolvi postar este conteudo por que eu acho que se trata um importante assunto que muitos dos meus amigos no qual eu questiono e eles não tiveram a oportunidade de ver isto.
Informações sobre as seguintes linguagens de programação: C, C++, Objective-C, Java, JavaScript, Ruby, PHP e C#. Exposição de algumas aplicações destas linguagens em desenvolvimento: de sistemas operacionais (sistemas baseados em UNIX e Windows), desktop (Windows, Mac OS X e Linux), Web (do lado do servidor e do lado do cliente), para smartphones e tablets (Android, iOS, Windows Phone, Windows Store apps), para a nuvem (Amazon Web Services, Windows Azure, Google App Engine), de jogos para múltiplas plataformas, etc.
Palestra "Plataforma de compiladores .NET, C# 6 e Visual Studio 2015" apresentada no dia 25 de abril de 2015 no evento Global Azure Bootcamp 2015 da Microsoft.
1) O documento discute programação concorrente e como ela se relaciona com programação orientada a objetos. 2) É apresentado um roteiro para o curso de programação concorrente, abordando concorrência, objetos e concorrência, e padrões de projeto. 3) Construtores de execução concorrente como threads, processos e tarefas são comparados considerando autonomia, compartilhamento, agendamento e comunicação.
Este documento apresenta os conceitos básicos de sistemas operacionais. Define o que é um sistema operacional e discute suas principais funções como gerenciar processos, memória e arquivos. Apresenta os tipos de sistemas operacionais e detalha o kernel e as características dos sistemas Windows e Linux. Por fim, descreve recursos básicos do Windows 7.
O documento discute os conceitos básicos de escalonamento de CPU, incluindo: 1) o papel do escalonador em determinar qual processo pronto será executado na CPU disponível; 2) os tipos de escalonamento preemptivo e não preemptivo; 3) o uso de interrupções por tempo para evitar monopolização da CPU.
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplinaHelder Lopes
Aula inaugural da disciplina Fundamentos de Sistemas Operacionais do curso Tecnológico de Análise e desenvolvimento de sistemas - 1º semestre - UNIP Paulista / Paraíso
O documento apresenta as principais linguagens de programação para controladores lógicos programáveis de acordo com o padrão IEC 61131-3, descrevendo Ladder, Bloco de Funções, Funções Sequenciais, Lista de Instruções e Linguagem Estruturada. Exemplos são fornecidos para cada linguagem. A conclusão ressalta que cada situação pode exigir uma linguagem específica e que o programador deve escolher qual melhor se adapta a cada processo.
O documento descreve os principais tipos de sistemas operacionais, incluindo monotarefa, multitarefa, em tempo real e por lotes. Discutem como os sistemas operacionais controlam o acesso aos recursos do computador e permitem a execução simultânea de tarefas.
O documento fornece um resumo histórico sobre linguagens de programação, paradigmas de programação e o paradigma de programação orientada a objetos. Ele discute as principais linguagens desenvolvidas desde a década de 1950 e os respectivos paradigmas, como imperativo, funcional e lógico. O documento também explica conceitos-chave da programação orientada a objetos como abstração de dados, objetos, classes e herança.
Este documento fornece um resumo de uma aula introdutória sobre programação em C. Ele descreve:
1) As informações gerais sobre a disciplina, incluindo carga horária, pré-requisitos e objetivos;
2) O conteúdo programático, dividido em 12 unidades cobrindo tópicos como introdução à linguagem C, variáveis, funções, estruturas de dados e depuração;
3) A metodologia de ensino, que inclui aulas expositivas, atividades práticas e avaliações como provas,
O documento resume a linguagem de programação Ruby, incluindo sua criação, influências, versões, exemplos de uso e características principais como tipagem dinâmica, classes, métodos e variáveis.
Lisp é uma linguagem de programação funcional criada em 1956 por John McCarthy para processamento de listas e aplicações de inteligência artificial. Lisp tem como características principais tipos de dados como átomos e listas, funções de ordem superior, diversos dialetos e implementações, e avaliação independente da ordem das expressões.
O documento apresenta uma introdução à linguagem de programação Java, descrevendo seu histórico, características, tipos primitivos, declaração de variáveis e comentários.
1) O documento é um trabalho escolar sobre linguagens de programação realizado por três alunos da escola secundária de Santo André.
2) O trabalho aborda conceitos básicos de programação, tipos de linguagens, história da linguagem C e suas características e objetivos.
3) Inclui seções sobre código fonte, código máquina, compiladores e interpretadores.
1) O documento é um trabalho escolar sobre linguagens de programação realizado por três alunos da escola secundária de Santo André.
2) O trabalho aborda conceitos básicos de programação, tipos de linguagens, história da linguagem C e suas características e objetivos.
3) Inclui seções sobre código fonte, código máquina, compiladores e interpretadores.
Lua é uma linguagem de script desenvolvida no Brasil na década de 1990 para ser leve, rápida e fácil de usar. Ela é amplamente utilizada em jogos, sistemas embarcados e outras aplicações. Lua oferece gerenciamento automático de memória, tipos de dados básicos e estruturas de controle como if/else e while.
Este documento fornece uma introdução aos principais paradigmas de programação e linguagens de programação. Ele discute brevemente a história das linguagens de programação, introduz os paradigmas imperativo, orientado a objetos, funcional e lógico, e fornece exemplos de linguagens populares em cada paradigma, incluindo C, Java, Lisp e Prolog. O documento também descreve os objetivos do curso e a bibliografia recomendada.
O documento descreve a história e características da linguagem de programação Python. Começa explicando que as linguagens de programação surgiram antes dos computadores e evoluíram para permitir a comunicação entre humanos e máquinas. Em seguida, detalha a criação do Python em 1991, seu código aberto e comunitário, e características como ser de alto nível, interpretada e multiplataforma.
Nesta primeira aula sobre Swift, o documento introduz a linguagem Swift, seus benefícios em relação ao Objective-C, e alguns novos recursos. Apresenta Swift como a principal linguagem de desenvolvimento da Apple, e discute tópicos como por que usar Swift, suas peculiaridades e ferramentas como Playground.
1) O documento é um relatório escolar sobre linguagens de programação feito por três alunos para a disciplina de Programação Web.
2) O relatório discute conceitos básicos de programação, tipos de linguagens de programação, a história da linguagem C e suas características e objetivos.
3) Também aborda código fonte, código de máquina, compiladores e interpretadores.
O documento fornece um resumo sobre linguagens de programação em 3 frases:
1) As linguagens de programação surgiram para descrever mecanismos abstratos e comunicar entre programadores e computadores.
2) Ao longo dos anos, novas linguagens foram criadas para corrigir defeitos de outras ou melhorar desempenho, com foco em áreas como ciência, comércio e inteligência artificial.
3) Linguagens como COBOL, FORTRAN, Pascal, C, C++, Java, Python, entre outras, evolu
O documento discute as linguagens de programação. Aborda a tipologia e tipos de linguagens, incluindo linguagens imperativas, funcionais e baseadas em lógica. Também descreve a evolução das linguagens desde o FORTRAN até linguagens modernas como C++ e Java. Explica a diferença entre código fonte e código máquina, e entre compiladores e interpretadores.
Este documento apresenta os conceitos básicos de sistemas operacionais. Define o que é um sistema operacional e discute suas principais funções como gerenciar processos, memória e arquivos. Apresenta os tipos de sistemas operacionais e detalha o kernel e as características dos sistemas Windows e Linux. Por fim, descreve recursos básicos do Windows 7.
O documento discute os conceitos básicos de escalonamento de CPU, incluindo: 1) o papel do escalonador em determinar qual processo pronto será executado na CPU disponível; 2) os tipos de escalonamento preemptivo e não preemptivo; 3) o uso de interrupções por tempo para evitar monopolização da CPU.
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplinaHelder Lopes
Aula inaugural da disciplina Fundamentos de Sistemas Operacionais do curso Tecnológico de Análise e desenvolvimento de sistemas - 1º semestre - UNIP Paulista / Paraíso
O documento apresenta as principais linguagens de programação para controladores lógicos programáveis de acordo com o padrão IEC 61131-3, descrevendo Ladder, Bloco de Funções, Funções Sequenciais, Lista de Instruções e Linguagem Estruturada. Exemplos são fornecidos para cada linguagem. A conclusão ressalta que cada situação pode exigir uma linguagem específica e que o programador deve escolher qual melhor se adapta a cada processo.
O documento descreve os principais tipos de sistemas operacionais, incluindo monotarefa, multitarefa, em tempo real e por lotes. Discutem como os sistemas operacionais controlam o acesso aos recursos do computador e permitem a execução simultânea de tarefas.
O documento fornece um resumo histórico sobre linguagens de programação, paradigmas de programação e o paradigma de programação orientada a objetos. Ele discute as principais linguagens desenvolvidas desde a década de 1950 e os respectivos paradigmas, como imperativo, funcional e lógico. O documento também explica conceitos-chave da programação orientada a objetos como abstração de dados, objetos, classes e herança.
Este documento fornece um resumo de uma aula introdutória sobre programação em C. Ele descreve:
1) As informações gerais sobre a disciplina, incluindo carga horária, pré-requisitos e objetivos;
2) O conteúdo programático, dividido em 12 unidades cobrindo tópicos como introdução à linguagem C, variáveis, funções, estruturas de dados e depuração;
3) A metodologia de ensino, que inclui aulas expositivas, atividades práticas e avaliações como provas,
O documento resume a linguagem de programação Ruby, incluindo sua criação, influências, versões, exemplos de uso e características principais como tipagem dinâmica, classes, métodos e variáveis.
Lisp é uma linguagem de programação funcional criada em 1956 por John McCarthy para processamento de listas e aplicações de inteligência artificial. Lisp tem como características principais tipos de dados como átomos e listas, funções de ordem superior, diversos dialetos e implementações, e avaliação independente da ordem das expressões.
O documento apresenta uma introdução à linguagem de programação Java, descrevendo seu histórico, características, tipos primitivos, declaração de variáveis e comentários.
1) O documento é um trabalho escolar sobre linguagens de programação realizado por três alunos da escola secundária de Santo André.
2) O trabalho aborda conceitos básicos de programação, tipos de linguagens, história da linguagem C e suas características e objetivos.
3) Inclui seções sobre código fonte, código máquina, compiladores e interpretadores.
1) O documento é um trabalho escolar sobre linguagens de programação realizado por três alunos da escola secundária de Santo André.
2) O trabalho aborda conceitos básicos de programação, tipos de linguagens, história da linguagem C e suas características e objetivos.
3) Inclui seções sobre código fonte, código máquina, compiladores e interpretadores.
Lua é uma linguagem de script desenvolvida no Brasil na década de 1990 para ser leve, rápida e fácil de usar. Ela é amplamente utilizada em jogos, sistemas embarcados e outras aplicações. Lua oferece gerenciamento automático de memória, tipos de dados básicos e estruturas de controle como if/else e while.
Este documento fornece uma introdução aos principais paradigmas de programação e linguagens de programação. Ele discute brevemente a história das linguagens de programação, introduz os paradigmas imperativo, orientado a objetos, funcional e lógico, e fornece exemplos de linguagens populares em cada paradigma, incluindo C, Java, Lisp e Prolog. O documento também descreve os objetivos do curso e a bibliografia recomendada.
O documento descreve a história e características da linguagem de programação Python. Começa explicando que as linguagens de programação surgiram antes dos computadores e evoluíram para permitir a comunicação entre humanos e máquinas. Em seguida, detalha a criação do Python em 1991, seu código aberto e comunitário, e características como ser de alto nível, interpretada e multiplataforma.
Nesta primeira aula sobre Swift, o documento introduz a linguagem Swift, seus benefícios em relação ao Objective-C, e alguns novos recursos. Apresenta Swift como a principal linguagem de desenvolvimento da Apple, e discute tópicos como por que usar Swift, suas peculiaridades e ferramentas como Playground.
1) O documento é um relatório escolar sobre linguagens de programação feito por três alunos para a disciplina de Programação Web.
2) O relatório discute conceitos básicos de programação, tipos de linguagens de programação, a história da linguagem C e suas características e objetivos.
3) Também aborda código fonte, código de máquina, compiladores e interpretadores.
O documento fornece um resumo sobre linguagens de programação em 3 frases:
1) As linguagens de programação surgiram para descrever mecanismos abstratos e comunicar entre programadores e computadores.
2) Ao longo dos anos, novas linguagens foram criadas para corrigir defeitos de outras ou melhorar desempenho, com foco em áreas como ciência, comércio e inteligência artificial.
3) Linguagens como COBOL, FORTRAN, Pascal, C, C++, Java, Python, entre outras, evolu
O documento discute as linguagens de programação. Aborda a tipologia e tipos de linguagens, incluindo linguagens imperativas, funcionais e baseadas em lógica. Também descreve a evolução das linguagens desde o FORTRAN até linguagens modernas como C++ e Java. Explica a diferença entre código fonte e código máquina, e entre compiladores e interpretadores.
O documento apresenta uma introdução sobre linguagens de programação, abordando seus principais conceitos, histórico, relação com disciplinas do curso de Ciência da Computação e oportunidades no mercado de trabalho.
Algoritmos e Logica de programação - #Aula 06 - Linguagens De ProgramaçãoErick L. F.
O documento discute linguagens de programação, dividindo-as em gerações, funcionalidades e tipos. Explica que as linguagens de programação permitem aos computadores serem programados e que existem mais de 2500 linguagens, classificadas em procedurais, declarativas, orientadas a objetos, concorrentes e de consulta.
Este documento apresenta uma aula introdutória sobre programação orientada a objetos em Java. A aula aborda os paradigmas de programação procedural e orientado a objetos, conceitos básicos da linguagem Java como classes, objetos e encapsulamento, e ferramentas de desenvolvimento como NetBeans e Eclipse.
Python é uma linguagem de programação interpretada, de tipagem dinâmica e com gerenciamento automático de memória. É considerada elegante e fácil de aprender, sendo usada em diversos campos como web, ciência de dados e desenvolvimento de jogos.
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
Em determinadas ocasiões, dependendo dos requisitos de uma aplicação, pode ser preciso percorrer todos os elementos de uma árvore para, por exemplo, exibir todo o seu conteúdo ao usuário. De acordo com a ordem de visitação dos nós, o usuário pode ter visões distintas de uma mesma árvore.
Imagine que, para percorrer uma árvore, tomemos o nó raiz como nó inicial e, a partir dele, comecemos a visitar todos os nós adjacentes a ele para, só então, começar a investigar os outros nós da árvore. Por outro lado, imagine que tomamos um nó folha como ponto de partida e caminhemos em direção à raiz, visitando apenas o ramo da árvore que leva o nó folha à raiz. São maneiras distintas de se visualizar a mesma árvore.
Tome a árvore binária a seguir como base para realizar percursos que partirão sempre da raiz (nó 1).
Figura 1 - Árvore binária
Fonte: OLIVEIRA, P. M. de; PEREIRA, R. de L. Estruturas de Dados II. Maringá: UniCesumar, 2019. p. .
Com base na árvore anterior, responda quais seriam as ordens de visitação, partindo da raiz:
a) Percorrendo a árvore pelo algoritmo Pré-Ordem.
b) Percorrendo a árvore pelo algoritmo Em-Ordem.
c) Percorrendo a árvore pelo algoritmo Pós-Ordem.
Obs.: como resposta, informar apenas os caminhos percorridos em cada Situação:
a) Pré-ordem: X - Y - Z.
b) Em-ordem: X - Y - Z.
c) Pós-ordem: X - Y - Z.
ATENÇÃO!
- Você poderá elaborar sua resposta em um arquivo de texto .txt e, após revisado, copiar e colar no campo destinado à resposta na própria atividade em seu STUDEO.
- Plágios e cópias indevidas serão penalizados com nota zero.
- As perguntas devem ser respondidas de forma adequada, ou seja, precisam ser coerentes.
- Antes de enviar sua atividade, certifique-se de que respondeu todas as perguntas e não se esqueceu nenhum detalhe. Após o envio, não são permitidas alterações. Por favor, não insista.
- Não são permitidas correções parciais no decorrer do módulo, isso invalida seu processo avaliativo. A interpretação da atividade faz parte da avaliação.
- Atenção ao prazo de entrega da atividade. Sugerimos que envie sua atividade antes do prazo final para evitar transtornos e lentidão nos servidores. Evite o envio de atividade em cima do prazo.
Em um mundo cada vez mais digital, a segurança da informação tornou-se essencial para proteger dados pessoais e empresariais contra ameaças cibernéticas. Nesta apresentação, abordaremos os principais conceitos e práticas de segurança digital, incluindo o reconhecimento de ameaças comuns, como malware e phishing, e a implementação de medidas de proteção e mitigação para vazamento de senhas.
A linguagem C# aproveita conceitos de muitas outras linguagens,
mas especialmente de C++ e Java. Sua sintaxe é relativamente fácil, o que
diminui o tempo de aprendizado. Todos os programas desenvolvidos devem
ser compilados, gerando um arquivo com a extensão DLL ou EXE. Isso torna a
execução dos programas mais rápida se comparados com as linguagens de
script (VBScript , JavaScript) que atualmente utilizamos na internet
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...Faga1939
Este artigo tem por objetivo apresentar como ocorreu a evolução do consumo e da produção de energia desde a pré-história até os tempos atuais, bem como propor o futuro da energia requerido para o mundo. Da pré-história até o século XVIII predominou o uso de fontes renováveis de energia como a madeira, o vento e a energia hidráulica. Do século XVIII até a era contemporânea, os combustíveis fósseis predominaram com o carvão e o petróleo, mas seu uso chegará ao fim provavelmente a partir do século XXI para evitar a mudança climática catastrófica global resultante de sua utilização ao emitir gases do efeito estufa responsáveis pelo aquecimento global. Com o fim da era dos combustíveis fósseis virá a era das fontes renováveis de energia quando prevalecerá a utilização da energia hidrelétrica, energia solar, energia eólica, energia das marés, energia das ondas, energia geotérmica, energia da biomassa e energia do hidrogênio. Não existem dúvidas de que as atividades humanas sobre a Terra provocam alterações no meio ambiente em que vivemos. Muitos destes impactos ambientais são provenientes da geração, manuseio e uso da energia com o uso de combustíveis fósseis. A principal razão para a existência desses impactos ambientais reside no fato de que o consumo mundial de energia primária proveniente de fontes não renováveis (petróleo, carvão, gás natural e nuclear) corresponde a aproximadamente 88% do total, cabendo apenas 12% às fontes renováveis. Independentemente das várias soluções que venham a ser adotadas para eliminar ou mitigar as causas do efeito estufa, a mais importante ação é, sem dúvidas, a adoção de medidas que contribuam para a eliminação ou redução do consumo de combustíveis fósseis na produção de energia, bem como para seu uso mais eficiente nos transportes, na indústria, na agropecuária e nas cidades (residências e comércio), haja vista que o uso e a produção de energia são responsáveis por 57% dos gases de estufa emitidos pela atividade humana. Neste sentido, é imprescindível a implantação de um sistema de energia sustentável no mundo. Em um sistema de energia sustentável, a matriz energética mundial só deveria contar com fontes de energia limpa e renováveis (hidroelétrica, solar, eólica, hidrogênio, geotérmica, das marés, das ondas e biomassa), não devendo contar, portanto, com o uso dos combustíveis fósseis (petróleo, carvão e gás natural).
Este certificado confirma que Gabriel de Mattos Faustino concluiu com sucesso um curso de 42 horas de Gestão Estratégica de TI - ITIL na Escola Virtual entre 19 de fevereiro de 2014 a 20 de fevereiro de 2014.
As classes de modelagem podem ser comparadas a moldes ou
formas que definem as características e os comportamentos dos
objetos criados a partir delas. Vale traçar um paralelo com o projeto de
um automóvel. Os engenheiros definem as medidas, a quantidade de
portas, a potência do motor, a localização do estepe, dentre outras
descrições necessárias para a fabricação de um veículo
3. 3
HISTÓRICO
Linguagem Go
• Começou a ser projetada em 2007 na Google.
• Projetistas: Ken Thompson, Robert Griesemer, Rob Pike.
• Objetivo: Combinar a facilidade de uma linguagem
interpretada e dinamicamente tipada com a eficiência e
segurança de uma linguagem compilada e estaticamente
tipada.
• Finalidade: Servir
como uma nova linguagem para
programação de sistemas.
4. 4
HISTÓRICO
Linguagem Go
• Paradigmas: concorrente, imperativo, orientado a objetos.
• Influências:
• C: similaridades com a sintaxe;
• Pascal/Modula/Oberon: declarações e pacotes;
• Linguagem formal CSP (Limbo/Alef): concorrência
5. 5
HISTÓRICO
Linguagem Lua
• Criada em 1993 na Tecgraf, PUC-RIO.
• Projetistas: Roberto
Ierusalimschy, Luiz Henrique de
Figueiredo e Waldemar Celes.
• Surgiu
a partir da idéia de que duas linguagens previamente
desenvolvidas na Tecgraf poderiam ser combinadas e
aumentadas para formar uma linguagem de uso geral.
• DEL (Data Entry Language) e SOL (Simple Object
Language) eram essas linguagens.
6. 6
HISTÓRICO
Linguagem Lua
• Objetivo: Criar uma linguagem altamente portável, genérica,
pequena e simples na forma de uma biblioteca.
• Finalidade:
• Permitir que programas já existentes pudessem a incorporar;
• Servir como alternativa a linguagens existentes na época com
propósito similar (LISP, Python, Scheme, Tcl).
• Paradigmas: funcional, imperativo, orientado a objetos (protótipo).
7. 7
HISTÓRICO
Linguagem Lua
• Influências:
• SOL: sintaxe para construção de registros e listas. Também herdou o
conceito de ser implementado como uma biblioteca;
• Modula: sintaxe para estruturas de controle while, if e repeat until;
• CLU: atribuição múltipla e funções que retornam múltiplos valores;
• C++: idéia de que uma variável local pode ser declarada onde ela é
utilizada;
• SNOBOL/Awk: arrays associativos, chamados de tabelas em Lua.
8. 8
HISTÓRICO
Tempo de
2 anos 16 anos
vida
Principal Programação
Extensão
uso de sistemas
Concorrente, Funcional,
imperativo, imperativo,
Paradigmas
orientado a orientado a
objetos objetos
9. 8
HISTÓRICO
Tempo de
2 anos 16 anos
vida
Uso interno na Principal Programação
Google Extensão
uso de sistemas
Concorrente, Funcional,
imperativo, imperativo,
Paradigmas
orientado a orientado a
objetos objetos
10. 8
HISTÓRICO •Scripts para nmap;
•Customização de
Interface no WoW;
•Configuração, UI, e
outros no SimCity 4;
•Customização do
comportamento do
Monotone;
•...
Tempo de
2 anos 16 anos
vida
Uso interno na Principal Programação
Google Extensão
uso de sistemas
Concorrente, Funcional,
imperativo, imperativo,
Paradigmas
orientado a orientado a
objetos objetos
12. 10
TIPOS DE DADOS
•A linguagem Lua conta com apenas 8 tipos:
• nil, boolean, number, string, userdata, thread, function e table.
13. 10
TIPOS DE DADOS
•A linguagem Lua conta com apenas 8 tipos:
• nil, boolean, number, string, userdata, thread, function e table.
array associativo
representa fluxos de execução independentes,
utilizado para implementar corotinas
bloco de memória vindo de um aplicativo em C
cadeia de caracteres de 8 bits
números reais (internamente: ponto flutuante de precisão dupla)
diferente de qualquer outro valor, utilizado para representar ausência
de um valor útil
14. 11
TIPOS DE DADOS
•A linguagem Lua conta com apenas 8 tipos:
• nil, boolean, number, string, userdata, thread, function e table.
• Por outro lado, Go disponibiliza 28 tipos:
• bool, string, array, struct, pointer, function, interface, slice, map,
channel;
15. 11
TIPOS DE DADOS
•A linguagem Lua conta com apenas 8 tipos:
• nil, boolean, number, string, userdata, thread, function e table.
• Por outro lado, Go disponibiliza 28 tipos:
• bool, string, array, struct, pointer, function, interface, slice, map,
channel;
array de caracteres unicode codificados em UTF-8 array associativo
(representação interna em bytes)
fornece um mecanismo de sincronização entre duas tipo dinâmico
funções em execução concorrente
16. 12
TIPOS DE DADOS
•A linguagem Lua conta com apenas 8 tipos:
• nil, boolean, number, string, userdata, thread, function e table.
• Por outro lado, Go disponibiliza 28 tipos:
• bool, string, array, struct, pointer, function, interface, slice, map,
channel;
• Numéricos: uint8, uint16, uint32, uint64, int8, int16, int32,
int64, float32, float64, complex64, complex128, byte (alias
para uint8), uint, int, float, complex, uintptr.
17. 13
TIPOS DE DADOS
Strings
• As duas linguagens fornecem um tipo string imutável.
• Em Lua, operações com strings são realizadas através da biblioteca
“string” da linguagem.
• Versões mais recentes da linguagem (5.1+) permitem um estilo
orientado a objetos: minhastr:lower() ao invés de
string.lower(minhastr).
• Go também contém um pacote (biblioteca) para manipulação de
strings. Porém optou-se por usar uma função “len”, fora desse
pacote, para comprimento de string e outros objetos que podem
ter seu tamanho obtido.
18. 14
TIPOS DE DADOS
Funções
• Ambas linguagens dispõem de um tipo para as funções declaradas,
tratando-as como objetos de primeira classe (em Lua todos os
valores são de primeira classe).
• Isso significa que (SICP):
• Funções podem ser passadas como argumentos;
• Podem ser retornadas como resultado;
• Podem ser nomeadas por uma variável qualquer;
• Também podem ser inclusas em estruturas de dados.
19. 15
TIPOS DE DADOS
Arrays
• Go disponibiliza o tipo array para se construir arrays, enquanto
que Lua utiliza o tipo table para simular arrays.
• As duas linguagens aceitam valores inteiros como subscritos,
sendo que em Go o índice inicia em 0 enquanto que na outra
inicia-se 1.
• Isso é válido em Lua somente enquanto não utilizamos
nenhum “recurso” adicional das tabelas, isto é:
x = {1, 2, 3}; print(x[1]) “1”
x = {[0] = 1, 2, 3}; print(x[1]) “2”
20. 15
TIPOS DE DADOS
Arrays
• Go disponibiliza o tipo array para se construir arrays, enquanto
que Lua utiliza o tipo table para simular arrays.
• As duas linguagens aceitam valores inteiros como subscritos,
sendo que em Go o índice inicia em 0 enquanto que na outra
inicia-se 1.
• Isso é válido em Lua somente enquanto não utilizamos
nenhum “recurso” adicional das tabelas, isto é:
x = {1, 2, 3}; print(x[1]) “1”
x = {[0] = 1, 2, 3}; print(x[1]) “2”
21. 16
TIPOS DE DADOS
Arrays
• EmGo, arrays são especificadas com uma expressão
constante que define seu tamanho. Ex.: var ponto [3]int
• Em tempo de compilação é verificado se acessos com
expressões constantes não ultrapassam o limite da array;
• Em tempo de execução os outros casos de acesso são
verificados.
• Em Lua, arrays são dinâmicos no heap. Ao acessar uma
posição que não pertence ao array é retornado nil.
22. 17
TIPOS DE DADOS
Arrays
• Arrays podem ser inicializadas no momento da declaração nas
duas linguagens:
• Go: z := [10]int {1, 2, 3}
• Lua: z = {1, 2, 3}
• Na Go, os outros elementos (de 3 a 9) são inicializados em 0.
• A linguagem também permite especificar posições específicas
para serem inicializadas:
z := [10]int {0:1, 2:2, 4:3}
23. 18
TIPOS DE DADOS
Arrays
•A biblioteca “table” da Lua fornece operações como de
concatenação (de elementos de uma tabela/array) e ordenação.
• Go optou por realizar ordenação através de um pacote
chamado “sort”.
• Qualquer coleção pode ser ordenada se ela implementa a
interface sort.Interface.
em Go utilizam a sintaxe x[inicio:fim], onde x é um
• Slices
array qualquer e ambos os índices são incluídos. Lua não
disponibiliza slices.
24. 19
TIPOS DE DADOS
Arrays Multidimensionais
• Nenhuma dessas linguagens tem naturalmente o conceito de
arrays multidimensionais como se vê em Matlab (por
exemplo).
• Porém, as duas fornecem meios alternativos:
• Go: var x [2][3]float
• Lua: x = {{}, {}}
• Operaçõesnesses arrays devem ser feitas individualmente em
cada dimensão.
25. 20
TIPOS DE DADOS
Arrays Associativos
•O tipo table em Lua é utilizado para se criar arrays
associativos, Go utiliza o tipo map para essa finalidade.
• Porém, Lua permite que esse tipo contenha pares chave/
valor de todos os tipos (exceto nil como chave) enquanto
Go limita o tipo do par chave/valor ao especificado na
declaração.
são utilizadas também para criar registros, arrays
• tables
comuns, e outros tipos de estruturas. Tabelas são o único
mecanismo de estruturação de dados em Lua.
26. 21
TIPOS DE DADOS
Arrays Associativos
• As duas implementações permitem arrays associativos de tamanho
dinâmico.
• O acesso à elementos ocorre de forma similar à acesso de
elementos de arrays – por subscrito.
• A diferença é que os índices não precisam ser inteiros;
• Na linguagem Go, é possível fazer uso da atribuição múltipla para
obter informação adicional;
• Lua permite uma notação adicional para acesso, equivalente ao
acesso de campos de um registro em C.
27. 22
TIPOS DE DADOS
Ponteiros
• Lua não disponibiliza ponteiros, fato comum a linguagens de sua
classe.
• Go possui o tipo uintptr, que é capaz de armazenar um endereço
qualquer. Diferentemente de C, não há aritmética de ponteiros:
• Com isso, não é possível derivar endereços ilegais;
• Simplifica a implementação do coletor de lixo da linguagem.
• Também não há ponteiros pendurados (dangling pointers) em
Go.
28. 23
TIPOS DE DADOS
Ponteiros
• Porém, o seguinte código compila:
var bp *int = nil; print(*bp)
29. 23
TIPOS DE DADOS
Ponteiros
• Porém, o seguinte código compila:
var bp *int = nil; print(*bp)
dereferencia bp para imprimir
representação da memória apontada
atribui nil para o ponteiro bp
30. 24
TIPOS DE DADOS
Ponteiros
• Porém, o seguinte código compila:
var bp *int = nil; print(*bp)
• Em tempo de execução:
• panic: runtimeerror: invalid memory
address or nil pointer dereference
• “NullReferences: The Billion Dollar
Mistake” - Tony Hoare
32. 26
VERIFICAÇÃO DE TIPOS
• Go é quase fortemente tipada.
• Pacote “unsafe” incluso na linguagem permite violar o sistema de
verificação de tipos.
• Lua é fracamente tipada.
• Linguagem tenta fazer a coerção de string para number em operações
aritméticas:
print("1" + 1, "1" + "1.e7") “2 10000001”
print("1" + "a") attempt to perform arithmetic on a string value
33. 27
VERIFICAÇÃO DE TIPOS
• Go é quase fortemente tipada.
• Pacote “unsafe” incluso na linguagem permite violar o sistema de
verificação de tipos.
• Lua é fracamente tipada.
• Linguagem tenta fazer a coerção de string para number em operações
aritméticas.
• Quantidade de argumentos passados para uma função não é levado em
conta. Um argumento formal é nil se ele não receber um valor; e
argumentos extras são simplesmente ignorados.
35. 29
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Regras de Precedência
* / % << >> & &^ ^
unário
+ - | ^ not # -
!= == < <= > >= * / %
<- + -
&& ..
|| < > <= >= ˜= ==
and
Menor or
36. 29
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Regras de Precedência
* / % << >> & &^ ^
unário
+ - | ^ not # -
!= == < <= > >= * / %
<- + -
&& ..
|| < > <= >= ˜= ==
and
Menor or
37. 29
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Regras de Precedência
exponenciação
bit clear
(bitwise and not) tamanho
xor * / % << >> & &^ ^
unário
ou bitwise not unário + - | ^ not # -
especifica direção != == < <= > >= * / %
de um tipo <- + -
channel && .. concatenação
|| < > <= >= ˜= ==
!=
and
Menor or
38. 30
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Regras de Associação
• Nalinguagem Lua, os operadores de concatenação (“..”) e
exponenciação (“^”) são associativos a direita. Demais
operadores são associativos a esquerda.
• Todos os operadores em Go são associativos a esquerda.
• Asduas linguagens permitem o uso de parênteses para forçar
outra ordem de precedência.
39. 31
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Sobrecarga de Operadores
•A linguagem Go não oferece recursos para sobrecarga de
operadores.
• Atravésde meta métodos em meta tabelas, Lua permite
sobrecarregar operadores.
40. 31
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Sobrecarga de Operadores
•A linguagem Go não oferece recursos para sobrecarga de
operadores.
• Atravésde meta métodos em meta tabelas, Lua permite
sobrecarregar operadores.
pt1 = {x=3, y=2}; pt2 = {x=2, y=-1}
function pt_add (a, b)
return {x = a.x+b.x, y = a.y+b.y}
end
metatabela = {__add = pt_add}
setmetatable(pt1, metatabela)
pt3 = pt1 + pt2
print(pt3.x, pt3.y) “5 1”
41. 32
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Coerções
• Go não fornece conversões implícitas entre tipos numéricos.
• Tipos int e int32 são considerados como tipos distintos mesmo
numa arquitetura de 32 bits;
42. 32
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Coerções
• Go não fornece conversões implícitas entre tipos numéricos.
• Tipos int e int32 são considerados como tipos distintos mesmo
numa arquitetura de 32 bits;
var x int = 6
var y int32 = 4
print(x + y) invalid operation: x + y (type int + int32)
43. 33
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Coerções
• Go não fornece conversões implícitas entre tipos numéricos.
• Tipos int e int32 são considerados como tipos distintos mesmo
numa arquitetura de 32 bits;
• Lua representa todos os números num programa com um único
tipo: number. Logo não há coerções entre tipos numéricos.
• Porém, um tipo string sofre coerção quando um operador
aritmético é aplicado.
44. 34
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Expressões Relacionais
• Lua e Go diferem apenas no operador “não igual”:
• A primeira utiliza ~= e a outra !=
• As duas linguagens produzem um valor de tipo booleano.
• Os operadores relacionais (<, >, <=, >=, ˜=, ==) em Lua não utilizam a coerção de
string para number.
• Na linguagem Go, os operadores == e != podem ser aplicados a quase todos os
tipos (exceto array e struct).
• Demais operadores (<, >, <=, >=) podem ser aplicados somente a inteiros, ponto
flutuante e strings.
45. 35
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Avaliação Curto-Circuito
• Todos os operadores lógicos em Go (&&, ||) e em Lua (and,
or) são avaliados em curto-circuito.
• Operadores lógicos em Lua não podem ser sobre
carregados (não há meta métodos previstos para eles),
garantindo a avaliação curto circuito.
46. 36
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Atribuição em Lua
• Tem a seguinte sintaxe:
Não-terminal
• var {, var} = exp {, exp} Elemento EBNF
Terminal
• Aceita atribuições múltiplas;
• Se houver mais expressões que variáveis, elas são descartadas;
• Se houver mais variáveis que expressões, as excedentes recebem nil;
• Operadores compostos não são aceitos.
• Atribuição não é tratada com uma expressão.
47. 37
EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Atribuição em Go
• Tem a seguinte sintaxe:
+ | - | | |^
• exp {, exp} [add_op | mul_op] = exp {, exp}
*| / | % | << | >> | & | &^
• Aceita atribuições múltiplas;
• Lado esquerdo e direito devem conter a mesma quantidade de valores
após as expressões serem avaliadas;
• Aceita operadores compostos.
• Atribuição não é tratada com uma expressão.
• Cada atribuição deve ser compatível.
http://golang.org/doc/go_spec.html#Properties_of_types_and_values
49. 39
ESTRUTURAS DE CONTROLE
• Estruturas de controle em Lua não possuem múltiplas entradas.
• Go disponibiliza a declaração goto, logo todas as estruturas de
controle podem possuir múltiplas entradas.
• Declarações rotuladas podem ser alvo tanto do goto quanto
de break e continue.
• Uma restrição: executar um goto não pode alterar o ambiente
de referenciamento.
50. 39
ESTRUTURAS DE CONTROLE
• Estruturas de controle em Lua não possuem múltiplas entradas.
• Go disponibiliza a declaração goto, logo todas as estruturas de
controle podem possuir múltiplas entradas.
• Declarações rotuladas podem ser alvo tanto do goto quanto
de break e continue.
• Uma restrição: executar um goto não pode alterar o ambiente
de referenciamento.
goto exit
resultado := 3 Erro! Ao pular para exit, resultado
exit: passou a fazer parte do escopo
51. 40
ESTRUTURAS DE CONTROLE
Seleção bidirecional
• Sintaxe geral em Lua:
• if exp then bloco {elseif exp then bloco} [else bloco] end
• Aceita uma expressão qualquer (aritmética, lógica,
construtor de tabela, ...);
• Se expfor avaliada como false ou nil, a expressão é tida
como falsa.
52. 41
ESTRUTURAS DE CONTROLE
Seleção bidirecional
• Sintaxe geral em Go:
• if [simplestmt ;] [expressão] { {stmt ;} } [else stmt]
expressão condicional
aritmética/lógica
Permite realizar atribuição, declarar novas
variáveis, incrementar/decrementar variável
ou uma expressão qualquer antes de avaliar
a expressão de condição.
53. 42
ESTRUTURAS DE CONTROLE
Seleção múltipla
• Em Lua é possível realizar seleção múltipla somente através
da combinação de seletores bidirecionais.
• Go disponibiliza switch em duas formas:
• switch de expressões;
• switch de tipos.
54. 43
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
case expressão {, expressão} default
55. 44
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
• Expressões de uma cláusula não precisam ser constantes; são
avaliadas da esquerda para direita e de cima para baixo.
56. 45
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
• Somente a última instrução de uma cláusula default ou case
pode ser a declaração fallthrough, indicando que o controle
deve ser passado para o início da próxima cláusula.
• Caso fallthrough não seja utilizado, controle é desviado para
o final do switch.
57. 46
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de tipos:
• switch [simplestmt ;] typeSwitchGuard {{typeSwitchCase : {stmt ;}}}
case type {, type} default
[ident :=] primaryExp . ( type )
58. 47
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de tipos:
• switch [simplestmt ;] typeSwitchGuard {{typeSwitchCase : {stmt ;}}}
• Esse tipo de switch compara tipos ao invés de valores.
• Declaração fallthrough não é permitida aqui.
59. 48
ESTRUTURAS DE CONTROLE
Laços controlados por contador
• Lua disponibiliza duas formas para o comando for, uma delas é a versão
numérica:
• for ident = exp1, exp2 [, exp3] do bloco end
• Iteração inicia com valor de exp1, prosseguindo até exp2 com passos de
tamanho exp3;
• Se exp3 for omitida, o passo é 1;
• As três (ou duas) expressões são avaliadas antes do laço iniciar e todas
devem produzir números;
• A variável criada com nome ident é local ao laço.
60. 49
ESTRUTURAS DE CONTROLE
Laços controlados por contador
• Go disponibiliza quatro formas para o comando for, uma delas pode ser
utilizada como numérica:
• for [simplestmt1] ; [expressão] ; [simplestmt2] { {stmt ;} }
• simplestmt1 pode conter declaração de variável, simplestmt2 não;
• variável(is) declarada(s) em simplestmt1 tem escopo local ao for e podem
ser alteradas dentro do bloco;
• A expressão é avaliada no início de cada iteração, simplestmt1 somente
no início do laço e simplestmt2 após cada execução do bloco;
• Se expressão for omitida, é um loop infinito;
61. 50
ESTRUTURAS DE CONTROLE
Laços controlados logicamente
• Lua disponibiliza duas formas, separando instruções de pré-teste e pós-
teste:
• repeat bloco until exp
• while exp do bloco end
• Duas formas do for da Go servem para controle de repetição baseada em
expressão booleana:
• Na forma do slide anterior, basta omitir a primeira e última parte opcional;
• A outra forma utiliza pré-teste também: for expressao { {stmt ;} }
62. 51
ESTRUTURAS DE CONTROLE
Controle de laço localizado pelo usuário
• As duas linguagens disponibilizam break e continue com a
semântica usual.
• Go permite rotular declarações e permite que break e continue
transfiram o controle para um rótulo específico.
• No caso do break rotulado, o rótulo deve preceder um for
para indicar que o mesmo será encerrado;
• No caso do continue rotulado, o rótulo deve preceder um for
para indicar que o mesmo terá sua execução “pulada”.
63. 52
ESTRUTURAS DE CONTROLE
Laços baseados em estrutura de dados
•Asegunda forma do for disponibilizada pela Lua tem a
seguinte sintaxe:
• for ident {, ident} in exp {, exp} do bloco end
• As expressões são avaliadas uma única vez;
• Osidentificadores criados para guardar os resultados das
expressões são locais ao laço;
64. 52
ESTRUTURAS DE CONTROLE
Laços baseados em estrutura de dados
•Asegunda forma do for disponibilizada pela Lua tem a
seguinte sintaxe:
• for ident {, ident} in exp {, exp} do bloco end
• As expressões são avaliadas uma única vez;
• Osidentificadores criados para guardar os resultados das
expressões são locais ao laço;
equivalentes
for k,v in pairs({42, a = "A"}) do for k,v in next,{42, a = "A"} do
print(k,v) print(k,v)
end end
65. 53
ESTRUTURAS DE CONTROLE
Laços baseados em estrutura de dados
•A terceira forma do for da linguagem Go é utilizada para
iterar sobre todas os elementos de um array, string, slice, map
ou valores recebidos em um channel.
• for expressão {, expressão} (=|:=) range expressão
• Ao utilizar a forma com := as variáveis criadas deixam de
existir no final do laço;
66. 53
ESTRUTURAS DE CONTROLE
Laços baseados em estrutura de dados
•A terceira forma do for da linguagem Go é utilizada para
iterar sobre todas os elementos de um array, string, slice, map
ou valores recebidos em um channel. um desses tipos
• for expressão {, expressão} (=|:=) range expressão
• Ao utilizar a forma com := as variáveis criadas deixam de
existir no final do laço;
67. 53
ESTRUTURAS DE CONTROLE
Laços baseados em estrutura de dados
•A terceira forma do for da linguagem Go é utilizada para
iterar sobre todas os elementos de um array, string, slice, map
ou valores recebidos em um channel. um desses tipos
• for expressão {, expressão} (=|:=) range expressão
• Ao utilizar a forma com := as variáveis criadas deixam de
existir no final do laço;
x := [3]int{1, 2, 3}
sum := 0
for _, v := range x {
ignora índices
retornados sum += v
}
68. 54
ESTRUTURAS DE CONTROLE
Comandos Protegidos
• Não disponível em Lua.
• Go disponibiliza a instrução select:
• Entreum conjunto de comunicações possíveis, escolhe uma
para prosseguir;
• Sintaxe parecida com switch.
69. 54
ESTRUTURAS DE CONTROLE
Comandos Protegidos
• Não disponível em Lua.
• Go disponibiliza a instrução select:
• Entreum conjunto de comunicações possíveis, escolhe uma
para prosseguir;
• Sintaxe parecida com switch.
select { { commCase : { stmt ; } } }
case (recvExpr | sendExpr) default
[ expr (=|:=) ] <- expr expr <- expr
70. 55
ESTRUTURAS DE CONTROLE
Comandos Protegidos em Go
• Exemplo:
package main
func main() {
canal := make(chan int);
go func() {
for { print(<-canal) }
}();
for {
select {
case canal <- 0:
case canal <- 1:
}
}
}
71. 55
ESTRUTURAS DE CONTROLE
Comandos Protegidos em Go
• Exemplo:
package main 00100001000010001110101011011101001100
10011000010110000100011111000111011101
func main() { 10000010001001001010010111111011011010
canal := make(chan int); 11001000111011101000111101110110101110
11011100101110100111101011110010110111
go func() { 00110001011010110100011010100100000010
for { print(<-canal) } 11011001100000010100010001101000101011
}(); 01101010110110011001110100001110000000
11100000000101010101011000011111001001
10001010000100011101100011101001110000
for { 10101001001111000100111001001100101111
01110010000000111111011010011001101110
select { 11110010110111000111100100011000011010
case canal <- 0: 11111000010100110010110110101101010010
case canal <- 1: 00001000110110001100111000100000010010
00101101000101100100000011110000000001
} 01000110011011011111111100001100000110
} 10001101000000101111011011100100101100
...
}
72. 56
ESTRUTURAS DE CONTROLE
Comandos Protegidos em Go
• Todas as expressões recvExpr e sendExpr são avaliadas, assim como o lado
direito das sendExprs, de cima para baixo.
1. Se qualquer uma das comunicações puderem proceder, uma é escolhida
e a respectiva comunicação juntamente com seu bloco de instruções são
avaliados;
2. Se nenhuma comunicação puder proceder ...
2.1. e se houver uma cláusula default, então ela é executada;
2.2. e não houver uma cláusula default, o select bloqueia até o
momento que alguma comunicação puder proceder.
74. 58
MODULARIZAÇÃO
• Asduas linguagens permitem modularização através da
sub-programação.
• gorotinas e funções em Go;
• corotinas e funções em Lua.
• Além disso Go separa os programas em pacotes,
obrigatoriamente.
• Lua permite a criação de módulos.
75. 59
MODULARIZAÇÃO
Pacotes Go
• Início
de um programa é definido como a função chamada
“main” contida no pacote “main”*.
• Todoarquivo pertence a um pacote, e um pacote pode ser
formado por vários arquivos.
• Um arquivo pode importar outros pacotes.
• Apenas identificadores que declaram constantes, tipos,
variáveis ou funções e que iniciam com letra maiúscula são
exportados.
76. 60
MODULARIZAÇÃO
Módulos Lua
• Paracarregar módulos a função require ou loadlib podem
ser utilizadas.
•Aprimeira é frequentemente utilizada para carregar
módulos escritos puramente em Lua;
•A segunda é necessária para carregar módulos escritos em
C na forma de biblioteca (.DLL, .so, .dylib, ...).
77. 61
MODULARIZAÇÃO
Módulos Lua
• Módulos podem ser criados de várias formas.
• Exemplo:
abacate.lua
melancia.lua modulo = {}
module("melancia", package.seeall) function modulo.oi()
function oi() print("oi")
print("oi oi") end
end return modulo
require "melancia"
abacate = require "abacate"
main.lua
abacate.oi()
melancia.oi()
78. 62
MODULARIZAÇÃO
Módulos Lua
• Módulos podem ser criados de várias formas.
• Exemplo:
•A partir da versão 5.1 existe a função module para facilitar a
criação de módulos.
• Elimina código boilerplate;
• Símbolos que não devem ser exportados precisam ser
precedidos de local. Ex.: local x = 3
80. 64
POLIMORFISMO
• Em Go, interfaces são utilizadas para obter polimorfismo
universal de subtipo.
• Interfaces definem um conjunto de métodos.
• Um tipo automaticamente “implementa” uma interface se
possuir um super-conjunto dos métodos definidos na
interface.
• Um parâmetro de tipo interface aceita qualquer tipo que a
implementa.
81. 65
POLIMORFISMO
• Em Go, interfaces são utilizadas para obter polimorfismo
universal de subtipo.
package main
type StrInterface interface { str() string }
type Rã int
type Pato int
func (t *Rã) str() string { return "croac" }
func (t *Pato) str() string { return "quack" }
func imprime(item StrInterface) { println(item.str()) }
func main() {
var r *Rã
var p *Pato
imprime(r); imprime(p)
}
82. 65
POLIMORFISMO
• Em Go, interfaces são utilizadas para obter polimorfismo
universal de subtipo.
package main
Palavra reservada
type StrInterface interface { str() string } Tipo built-in
type Rã int
Nome de função
type Pato int
String
func (t *Rã) str() string { return "croac" } Outros
func (t *Pato) str() string { return "quack" }
func imprime(item StrInterface) { println(item.str()) }
func main() {
var r *Rã
var p *Pato
imprime(r); imprime(p)
croac
} quack
83. 66
POLIMORFISMO
• EmLua, há polimorfismo universal paramétrico implícito –
comum nas linguagens dinamicamente tipadas.
function imprime(item) print(item:str()) end
Ran = {}
ran_mt = {__index = Ran}
function Ran:new() return setmetatable({}, ran_mt) end
function Ran:str() return "croak" end
r = Ran:new()
imprime(r)
imprime({str = function () return "quack" end})
85. 68
TIPOS ABSTRATOS DE DADOS
Exemplo em Go
package main
import "./bintree"
package bintree func main() {
arvore := bintree.NovaÁrvore(42)
type nó struct { arvore.Insere(11, 43, 13, 7)
valor int arvore.EmOrdem()
esq, dir *nó }
}
func NovaÁrvore(valor int) *nó { t := new(nó); t.valor = valor; return t }
func (self *nó) EmOrdem() { em_ordem(self) }
func (self *nó) Insere(valores ... int) {
for i := 0; i < len(valores); i++ { insere(self, valores[i]) }
}
86. 69
TIPOS ABSTRATOS DE DADOS
Exemplo em Go
package bintree
type nó struct {
valor int
esq, dir *nó
}
func NovaÁrvore(valor int) *nó { t := new(nó); t.valor = valor; return t }
func (self *nó) EmOrdem() { em_ordem(self) }
func (self *nó) Insere(valores ... int) {
for i := 0; i < len(valores); i++ { insere(self, valores[i]) }
}
87. 69
TIPOS ABSTRATOS DE DADOS
Exemplo em Go
func em_ordem(x *nó) {
if x.esq != nil { em_ordem(x.esq) }
println(x.valor)
if x.dir != nil { em_ordem(x.dir) }
}
package bintree func insere(x *nó, v int) *nó {
if x == nil { x = NovaÁrvore(v)
type nó struct { } else if v < x.valor { x.esq = insere(x.esq, v)
valor int } else x.dir = insere(x.dir, v)
esq, dir *nó return x
} }
func NovaÁrvore(valor int) *nó { t := new(nó); t.valor = valor; return t }
func (self *nó) EmOrdem() { em_ordem(self) }
func (self *nó) Insere(valores ... int) {
for i := 0; i < len(valores); i++ { insere(self, valores[i]) }
}
88. 70
TIPOS ABSTRATOS DE DADOS
Exemplo em Lua
require "bintree"
x = bintree.arvore:nova(42)
x:insere(11, 43, 13, 7)
x:em_ordem()
module("bintree", package.seeall)
arvore = {}
local mt = {__index = arvore}
function arvore:nova(valor)
return setmetatable({valor = valor, esq = nil, dir = nil}, mt)
end
function arvore:em_ordem() em_ordem(self) end
function arvore:insere(...) for i = 1, #arg do insere(self, arg[i]) end end
89. 71
TIPOS ABSTRATOS DE DADOS
Exemplo em Lua
module("bintree", package.seeall)
arvore = {}
local mt = {__index = arvore}
function arvore:nova(valor)
return setmetatable({valor = valor, esq = nil, dir = nil}, mt)
end
function arvore:em_ordem() em_ordem(self) end
function arvore:insere(...) for i = 1, #arg do insere(self, arg[i]) end end
90. 71
TIPOS ABSTRATOS DE DADOS
Exemplo em Lua
local function em_ordem(x)
if x.esq ~= nil then em_ordem(x.esq) end
print(x.valor)
if x.dir ~= nil then em_ordem(x.dir) end
end
local function insere(x, v)
if x == nil then x = arvore:nova(v)
module("bintree", package.seeall) elseif v < x.valor then x.esq = insere(x.esq, v)
else x.dir = insere(x.dir, v)
end
arvore = {}
return x
local mt = {__index = arvore}
end
function arvore:nova(valor)
return setmetatable({valor = valor, esq = nil, dir = nil}, mt)
end
function arvore:em_ordem() em_ordem(self) end
function arvore:insere(...) for i = 1, #arg do insere(self, arg[i]) end end
91. 72
TIPOS ABSTRATOS DE DADOS
1. Criar uma meta
1. Criar um tipo;
Como definir tabela para o tipo;
2. Definir métodos
um TAD 2. Definir funções
para o tipo.
com prefixo “tipo”.
Encapsulamento Pacotes Módulos
Somente
Não permite ocultar
identificadores
Visibilidade acesso a atributos
exportados são
do tipo
visíveis
92. 73
REFERÊNCIAS
• Blow, J. (2004). Game development: Harder than you think. ACM Queue, pages 31–32.
• Cardelli, L. and Wegner, P. (1985). On understanding types, data abstraction, and polymorphism. ACM Computing
Surveys, 17:471–522.
• Dijkstra, E. W. (1975). Guarded commands, non-determinacy and a calculus for the derivation of programs. In
Proceedings of the international conference on Reliable software, New York, NY, USA. ACM.
• Gabbrielli, M. and Martini, S. (2010). Programming Languages: Principles and Paradigms, chapter 9, pages 265–
275. Springer.
• Go (2010a). The go programming language specification. http://golang.org/doc/go_spec.html. Acessado em 16
de Junho de 2010.
• Go (2010b). Language design faq. http://golang.org/doc/go_lang_faq.html. Acessado em 16 de Junho de 2010.
• Hoare, T. (2009). Null references: The billion dollar mistake. Apresentado na QCon London.
• Ierusalimschy, R., de Figueiredo, L. H., and Celes, W. (2006). Lua 5.1 Reference Manual. Lua.org.
• Ierusalimschy, R., de Figueiredo, L. H., and Celes, W. (2007). The evolution of lua. In: HOPL III: Proceedings of the
third ACM SIGPLAN conference on History of programming languages. ACM Press.
• Sebesta, R. W. (2001). Concepts of Programming Languages. Addison Wesley, 5th edition.
• Taivalsaari, A. (1996). Classes vs. prototypes - some philosophical and historical observations. In Journal of
Object-Oriented Programming, pages 44–50. SpringerVerlag.
Notas do Editor
Explicar o que &#xE9; paradigma concorrente.
Explicar orientado a objetos (prot&#xF3;tipo)
From 1977 until 1992, Brazil had a policy of strong trade barriers (called a &#x201C;market reserve&#x201D;) for computer hardware and software motivated by a nationalistic feeling that Brazil could and should produce its own hardware and software. In that atmosphere, Tecgraf&#x2019;s clients could not afford, either politically or financially, to buy customized software from abroad: by the market reserve rules, they would have to go through a complicated bureaucratic process to prove that their needs could not be met by Brazilian companies. Added to the natural geographical isolation of Brazil from other research and development centers, those reasons led Tecgraf to implement from scratch the basic tools it needed.
DEL n&#xE3;o influenciou no projeto da linguagem Lua. A influ&#xEA;ncia principal da DEL no nascimento da Lua foi a percep&#xE7;&#xE3;o de que grande parte de programas complexos pode ser escrito utilizando
&#x201C;embeddable scripting languages&#x201D;.
* Citar que tipos de aplica&#xE7;&#xF5;es tem sido desenvolvidas com essa linguagens. *
Rob Pike disse que Go tem sido utilizada internamente na Google.
Scripts em Lua para o nmap s&#xE3;o utilizados para (por ex.): explorar vulnerabilidades, verificar servi&#xE7;os de rede e detectar vulnerabilidades.
Monotone &#xE9; um sistema de controle de vers&#xF5;es distribu&#xED;do (como Git, Mercurial, Bazaar, ...). O que o Monotone faz &#xE9; utilizar a linguagem Lua para permitir que hooks tenham seu comportamento modificado.
FarCry e Crysis tamb&#xE9;m utilizam Lua (s&#xF3; para dizer que tem outros jogos famosos que utilizam Lua).
* Citar que tipos de aplica&#xE7;&#xF5;es tem sido desenvolvidas com essa linguagens. *
Rob Pike disse que Go tem sido utilizada internamente na Google.
Scripts em Lua para o nmap s&#xE3;o utilizados para (por ex.): explorar vulnerabilidades, verificar servi&#xE7;os de rede e detectar vulnerabilidades.
Monotone &#xE9; um sistema de controle de vers&#xF5;es distribu&#xED;do (como Git, Mercurial, Bazaar, ...). O que o Monotone faz &#xE9; utilizar a linguagem Lua para permitir que hooks tenham seu comportamento modificado.
FarCry e Crysis tamb&#xE9;m utilizam Lua (s&#xF3; para dizer que tem outros jogos famosos que utilizam Lua).
* Citar que tipos de aplica&#xE7;&#xF5;es tem sido desenvolvidas com essa linguagens. *
Rob Pike disse que Go tem sido utilizada internamente na Google.
Scripts em Lua para o nmap s&#xE3;o utilizados para (por ex.): explorar vulnerabilidades, verificar servi&#xE7;os de rede e detectar vulnerabilidades.
Monotone &#xE9; um sistema de controle de vers&#xF5;es distribu&#xED;do (como Git, Mercurial, Bazaar, ...). O que o Monotone faz &#xE9; utilizar a linguagem Lua para permitir que hooks tenham seu comportamento modificado.
FarCry e Crysis tamb&#xE9;m utilizam Lua (s&#xF3; para dizer que tem outros jogos famosos que utilizam Lua).
* Citar que tipos de aplica&#xE7;&#xF5;es tem sido desenvolvidas com essa linguagens. *
Rob Pike disse que Go tem sido utilizada internamente na Google.
Scripts em Lua para o nmap s&#xE3;o utilizados para (por ex.): explorar vulnerabilidades, verificar servi&#xE7;os de rede e detectar vulnerabilidades.
Monotone &#xE9; um sistema de controle de vers&#xF5;es distribu&#xED;do (como Git, Mercurial, Bazaar, ...). O que o Monotone faz &#xE9; utilizar a linguagem Lua para permitir que hooks tenham seu comportamento modificado.
FarCry e Crysis tamb&#xE9;m utilizam Lua (s&#xF3; para dizer que tem outros jogos famosos que utilizam Lua).
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Em Lua: tables, threads, functions e userdata s&#xE3;o sempre refer&#xEA;ncias (quando s&#xE3;o retornadas de fun&#xE7;&#xF5;es, passadas para fun&#xE7;&#xF5;es em atribui&#xE7;&#xF5;es, etc). Strings n&#xE3;o s&#xE3;o duplicadas internamente, ent&#xE3;o se duas vari&#xE1;veis cont&#xE9;m uma string igual ent&#xE3;o, na verdade, as duas internamente apontam para o mesmo objeto.
Importante observar que somente o tipo interface da Go passa por verifica&#xE7;&#xE3;o em tempo de execu&#xE7;&#xE3;o. Demais s&#xE3;o tratados como numa linguagem de tipagem est&#xE1;tica.
Importante observar que somente o tipo interface da Go passa por verifica&#xE7;&#xE3;o em tempo de execu&#xE7;&#xE3;o. Demais s&#xE3;o tratados como numa linguagem de tipagem est&#xE1;tica.
Importante observar que somente o tipo interface da Go passa por verifica&#xE7;&#xE3;o em tempo de execu&#xE7;&#xE3;o. Demais s&#xE3;o tratados como numa linguagem de tipagem est&#xE1;tica.
Importante observar que somente o tipo interface da Go passa por verifica&#xE7;&#xE3;o em tempo de execu&#xE7;&#xE3;o. Demais s&#xE3;o tratados como numa linguagem de tipagem est&#xE1;tica.
Observa&#xE7;&#xF5;es:
* Muitos tipos num&#xE9;ricos em Go &#xE9; devido ao prop&#xF3;sito da linguagem: Programa&#xE7;&#xE3;o de sistemas costuma conter situa&#xE7;&#xF5;es que exigem tamanhos espec&#xED;ficos (devido a especificidades de dispositivos e/ou consumo de mem&#xF3;ria, por exemplo).
* N&#xFA;meros complexos n&#xE3;o s&#xE3;o diretamente suportados pela Lua.
* nil tamb&#xE9;m est&#xE1; presente na linguagem Go, por&#xE9;m, na forma de um identificador pr&#xE9;-declarado (como NULL em C).
* Verificar se um elemento, em Lua, est&#xE1; presente n&#xE3;o &#xE9; bem definido. Uma chave n&#xE3;o presente retorna nil, por&#xE9;m &#xE9; poss&#xED;vel definir o valor de qualquer outra chave como nil:
x = {oi = nil}; print(x[&#x201C;oi&#x201D;], x[&#x201C;tchau&#x201D;]) --> &#x201C;nil nil&#x201D;
* Remover um elemento de uma table equivale a definir sua chave como nil: tabela[&#x201C;elemento&#x201D;] = nil
* Go utiliza atribui&#xE7;&#xE3;o m&#xFA;ltipla para verificar se um elemento est&#xE1; presente ou n&#xE3;o: _, presente = x[&#x201C;oi&#x201D;]
Vari&#xE1;vel presente &#xE9; um bool que indica se a chave &#x201C;oi&#x201D; est&#xE1; no map x ou n&#xE3;o.
* Ao &#x201C;inverter&#x201D; a atribui&#xE7;&#xE3;o m&#xFA;ltipla, &#xE9; poss&#xED;vel remover o elemento de um map: tabela[&#x201C;elemento&#x201D;] = 0, false
Comentar que em Go todos os tipos, com exce&#xE7;&#xE3;o de tipo interface, passam por verifica&#xE7;&#xE3;o est&#xE1;tica. Interface &#xE9; a exce&#xE7;&#xE3;o, tendo seu uso verificado em tempo de execu&#xE7;&#xE3;o.
Em Lua toda a verifica&#xE7;&#xE3;o &#xE9; feito em tempo de execu&#xE7;&#xE3;o.
Comentar que em Go todos os tipos, com exce&#xE7;&#xE3;o de tipo interface, passam por verifica&#xE7;&#xE3;o est&#xE1;tica. Interface &#xE9; a exce&#xE7;&#xE3;o, tendo seu uso verificado em tempo de execu&#xE7;&#xE3;o.
Em Lua toda a verifica&#xE7;&#xE3;o &#xE9; feito em tempo de execu&#xE7;&#xE3;o.
Operador de nega&#xE7;&#xE3;o (! e not) tamb&#xE9;m &#xE9; um operador l&#xF3;gico, mas n&#xE3;o faz diferen&#xE7;a ele sofrer avalia&#xE7;&#xE3;o curto-circuito ou n&#xE3;o.
Sintaxe EBNF.
Compilador do Go ainda n&#xE3;o verifica a restri&#xE7;&#xE3;o imposta para goto.
Compilador do Go ainda n&#xE3;o verifica a restri&#xE7;&#xE3;o imposta para goto.
Compilador do Go ainda n&#xE3;o verifica a restri&#xE7;&#xE3;o imposta para goto.
* &#x201C;if ... end&#x201D; &#xE9; um comando, n&#xE3;o uma express&#xE3;o.
* bloco &#xE9; uma sequ&#xEA;ncia de comandos opcionalmente separados por ;
* Express&#xE3;o condicional pode ser omitida, sendo tomada como true;
* Obriga o uso de &#x201C;{&#x201D; e &#x201C;}&#x201D; no if, por&#xE9;m :) pela gram&#xE1;tica, o corpo do else n&#xE3;o precisa estar entre &#x201C;{&#x201C; e &#x201C;}&#x201D;. Resolve a ambiguidade do dangling-else!
primaryExp s&#xE3;o express&#xF5;es mais simples: convers&#xE3;o de tipo, chamada de fun&#xE7;&#xF5;es, subscritos, ....
for i = 0, 0 do print(&#x201C;oi&#x201D;) !!
Gerador de bits pseudorand&#xF4;mico.
Observar o uso de gorotina; quarta forma do la&#xE7;o &#x201C;for&#x201D; (la&#xE7;o infinito).
1. Uma comunica&#xE7;&#xE3;o pode proceder quando a express&#xE3;o envolvida retorna true.
* Go diz que no caso de m&#xFA;ltiplas comunica&#xE7;&#xF5;es dispon&#xED;veis, uma &#xE9; escolhida de forma justa e uniforme.
Note que Go realmente obriga separar em pacotes (n&#xE3;o que seja ruim):
SourceFile ::= &#x201C;package&#x201D; ident &#x201C;;&#x201D; { importDecl &#x201C;;&#x201D; } { topLevelDecl &#x201C;;&#x201D; }
gorotinas est&#xE1; certo, &#xE9; outro termo criado pela Go.
Identificadores que s&#xE3;o exportados significa que: o arquivo que importa tal pacote tem acesso somente a tais identificadores
* Cada pacote pode tamb&#xE9;m conter uma fun&#xE7;&#xE3;o init que pode ser utilizada para definir algum estado inicial, por exemplo. Se a fun&#xE7;&#xE3;o init for definida no pacote main tamb&#xE9;m, ent&#xE3;o ela executa antes do main.main.
A fun&#xE7;&#xE3;o require n&#xE3;o precisa ser necessariamente utilizada para carregar m&#xF3;dulos lua, h&#xE1; meios de se fazer a mesma tarefa sem ela.
boilerplate &#xE9; traduzido como &#x201C;repetido&#x201D; nesse contexto.
Polimorfismo de subtipo -> em linguagens que suportam heran&#xE7;a seria algo como: se uma fun&#xE7;&#xE3;o aceitar um parametro de tipo (classe) T, ent&#xE3;o ela pode receber qualquer valor que seja subtipo (subclasse) de T.
Observa&#xE7;&#xF5;es: um tipo pode &#x201C;implementar&#x201D; v&#xE1;rias interfaces (todos implementam a interface vazia); tipos n&#xE3;o precisam especificar que implementam certas interfaces; em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: Tipos built-in n&#xE3;o deixam de ser palavras reservadas; c&#xF3;digo utf8; R&#xE3; e Pato s&#xE3;o novos tipos que s&#xE3;o aliases para int, por&#xE9;m (novamente) em Go &#xE9; permitido que tipos implementem m&#xE9;todos arbitr&#xE1;rios.
Observa&#xE7;&#xF5;es: uso de fun&#xE7;&#xF5;es an&#xF4;nimas (Go tamb&#xE9;m disponibiliza); c&#xF3;digo ascii (Ran inv&#xE9;s de R&#xE3;); Lua n&#xE3;o tem bem o conceito de classes que instanciam objetos.
Observa&#xE7;&#xF5;es: essa &#xE1;rvore funciona como uma BST; nenhum membro do tipo n&#xF3; pode ser acessado; &#x201C;...&#x201D; &#xE9; o modo disponibilizado pela Go para fun&#xE7;&#xF5;es com um n&#xFA;mero indefinido de par&#xE2;metros; new(tipo) aloca mem&#xF3;ria e retorna um ponteiro para o tipo especificado.
Observa&#xE7;&#xF5;es: (relembrando) somente identificadores que iniciam com letra mai&#xFA;scula s&#xE3;o exportados.
Observa&#xE7;&#xF5;es: (relembrando) somente identificadores que iniciam com letra mai&#xFA;scula s&#xE3;o exportados.
Observa&#xE7;&#xF5;es: (relembrando) somente identificadores que iniciam com letra mai&#xFA;scula s&#xE3;o exportados.
Observa&#xE7;&#xF5;es: (relembrando) somente identificadores que iniciam com letra mai&#xFA;scula s&#xE3;o exportados.
Observa&#xE7;&#xF5;es: Ao fazer &#x201C;module(x)&#x201D; uma tabela de nome x &#xE9; criada no espa&#xE7;o global e &#xE9; tomada como o novo ambiente de referenciamento, ou seja, fun&#xE7;&#xF5;es globais existentes (como print e setametatable) n&#xE3;o s&#xE3;o mais vis&#xED;veis. Para &#x201C;concertar&#x201D; isso, fazemos &#x201C;module(x, package.seeall)&#x201D; para que a tabela de nome x herde os nomes globais presentes. Por&#xE9;m, ao fazer isso, os nomes globais passam a ser todos acess&#xED;veis a partir desse m&#xF3;dulo.
Lua tamb&#xE9;m utiliza &#x201C;...&#x201D; para indicar que fun&#xE7;&#xE3;o recebe n&#xFA;mero vari&#xE1;vel de par&#xE2;metros, por&#xE9;m, quase que por m&#xE1;gica, &#x201C;...&#x201D; &#xE9; substitu&#xED;do por &#x201C;arg&#x201D; dentro do corpo da fun&#xE7;&#xE3;o.
Observa&#xE7;&#xF5;es: (relembrando) identificadores precedidos de &#x201C;local&#x201D; n&#xE3;o s&#xE3;o exportados;
Observa&#xE7;&#xF5;es: (relembrando) identificadores precedidos de &#x201C;local&#x201D; n&#xE3;o s&#xE3;o exportados;
Observa&#xE7;&#xF5;es: (relembrando) identificadores precedidos de &#x201C;local&#x201D; n&#xE3;o s&#xE3;o exportados;
Observa&#xE7;&#xF5;es: (relembrando) identificadores precedidos de &#x201C;local&#x201D; n&#xE3;o s&#xE3;o exportados;
Em Lua, a meta tabela que deve ser criada &#xE9; utilizada para conter as fun&#xE7;&#xF5;es relacionadas ao tipo.