Professional Documents
Culture Documents
vs.
HISTÓRICO
3
HISTÓRICO
Linguagem Go
• Começou a ser projetada em 2007 na Google.
• Finalidade: Servir
como uma nova linguagem para
programação de sistemas.
4
HISTÓRICO
Linguagem Go
• Paradigmas: concorrente, imperativo, orientado a objetos.
• Influências:
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.
HISTÓRICO
Linguagem Lua
• Objetivo: Criar uma linguagem altamente portável, genérica,
pequena e simples na forma de uma biblioteca.
• Finalidade:
HISTÓRICO
Linguagem Lua
• Influências:
• C++: idéia de que uma variável local pode ser declarada onde ela é
utilizada;
TIPOS DE DADOS
10
TIPOS DE DADOS
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
11
TIPOS DE DADOS
TIPOS DE DADOS
TIPOS DE DADOS
Strings
• As duas linguagens fornecem um tipo string imutável.
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).
TIPOS DE DADOS
Arrays
• Go disponibiliza o tipo array para se construir arrays, enquanto
que Lua utiliza o tipo table para simular arrays.
TIPOS DE DADOS
Arrays
• EmGo, arrays são especificadas com uma expressão
constante que define seu tamanho. Ex.: var ponto [3]int
TIPOS DE DADOS
Arrays
• Arrays podem ser inicializadas no momento da declaração nas
duas linguagens:
• Lua: z = {1, 2, 3}
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.
TIPOS DE DADOS
Arrays Multidimensionais
• Nenhuma dessas linguagens tem naturalmente o conceito de
arrays multidimensionais como se vê em Matlab (por
exemplo).
TIPOS DE DADOS
Arrays Associativos
•O tipo table em Lua é utilizado para se criar arrays
associativos, Go utiliza o tipo map para essa finalidade.
TIPOS DE DADOS
Arrays Associativos
• As duas implementações permitem arrays associativos de tamanho
dinâmico.
TIPOS DE DADOS
Ponteiros
• Lua não disponibiliza ponteiros, fato comum a linguagens de sua
classe.
TIPOS DE DADOS
Ponteiros
• Porém, o seguinte código compila:
var bp *int = nil; print(*bp)
TIPOS DE DADOS
Ponteiros
• Porém, o seguinte código compila:
var bp *int = nil; print(*bp)
• Em tempo de execução:
VERIFICAÇÃO DE TIPOS
26
VERIFICAÇÃO DE TIPOS
• Go é quase fortemente tipada.
VERIFICAÇÃO DE TIPOS
• Go é quase fortemente tipada.
exponenciação
bit clear
(bitwise and not) tamanho
xor * / % << >> & &^ ^
unário
ou bitwise not unário + - | ^ not # -
var x int = 6
var y int32 = 4
print(x + y) invalid operation: x + y (type int + int32)
33
• Os operadores relacionais (<, >, <=, >=, ˜=, ==) em Lua não utilizam a coerção de
string para number.
• Demais operadores (<, >, <=, >=) podem ser aplicados somente a inteiros, ponto
flutuante e strings.
35
ESTRUTURAS DE CONTROLE
39
ESTRUTURAS DE CONTROLE
ESTRUTURAS DE CONTROLE
Seleção bidirecional
• Sintaxe geral em Lua:
• if exp then bloco {elseif exp then bloco} [else bloco] end
ESTRUTURAS DE CONTROLE
Seleção bidirecional
• Sintaxe geral em Go:
• if [simplestmt ;] [expressão] { {stmt ;} } [else stmt]
expressão condicional
aritmética/lógica
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.
• switch de expressões;
• switch de tipos.
43
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de expressões:
• switch [simplestmt ;] [expressão] { {exprSwitchCase : {stmt ;}} }
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de tipos:
• switch [simplestmt ;] typeSwitchGuard {{typeSwitchCase : {stmt ;}}}
ESTRUTURAS DE CONTROLE
Seleção múltipla em Go
• Sintaxe geral de switch de tipos:
• switch [simplestmt ;] typeSwitchGuard {{typeSwitchCase : {stmt ;}}}
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;
• As três (ou duas) expressões são avaliadas antes do laço iniciar e todas
devem produzir números;
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 ;} }
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
ESTRUTURAS DE CONTROLE
Controle de laço localizado pelo usuário
• As duas linguagens disponibilizam break e continue com a
semântica usual.
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
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
ESTRUTURAS DE CONTROLE
Comandos Protegidos
• Não disponível em Lua.
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
...
}
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.
MODULARIZAÇÃO
58
MODULARIZAÇÃO
MODULARIZAÇÃO
Pacotes Go
• Início
de um programa é definido como a função chamada
“main” contida no pacote “main”*.
MODULARIZAÇÃO
Módulos Lua
• Paracarregar módulos a função require ou loadlib podem
ser utilizadas.
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()
62
MODULARIZAÇÃO
Módulos Lua
• Módulos podem ser criados de várias formas.
• Exemplo:
POLIMORFISMO
64
POLIMORFISMO
POLIMORFISMO
func main() {
var r *Rã
var p *Pato
imprime(r); imprime(p)
croac
} quack
66
POLIMORFISMO
Ran = {}
ran_mt = {__index = Ran}
r = Ran:new()
imprime(r)
imprime({str = function () return "quack" end})
67
import "./bintree"
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:nova(valor)
return setmetatable({valor = valor, esq = nil, dir = nil}, mt)
end
Somente
Não permite ocultar
identificadores
Visibilidade acesso a atributos
exportados são
do tipo
visíveis
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.