Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Agenda
Introduo Valores e Tipos Armazenamento Associaes Abstraes Unidades de Programa Sistemas de Tipos Sequenciadores Concorrncia Concluso
PLP - Linguagem Go
Introduo
Introduo
PLP - Linguagem Go
Motivao
Compilada Sensao de uma linguagem dinmica Simula Orientao a Objetos Possui Garbage Collection Multi-processamento Open-source 18a linguagem mais usada no mundo segundo o site da Tiobe
PLP - Linguagem Go
Sintaxe e Semntica
Go rene caractersticas sintticas de vrias linguagens Possui uma Sintaxe simples e intuitiva
PLP - Linguagem Go
Processador da Linguagem
Cdigo Fonte
*.8 ou *.6
Executvel
PLP - Linguagem Go
Outras Caractersticas
Criada pela Google e lanada em novembro de 2009 Equipe: Robert Griesemer, Rob Pike e Ken Thompson
PLP - Linguagem Go
Valores Boolean Numrico String Array Struct Ponteiros Abstrao de funo e procedimento Mapa Channel
PLP - Linguagem Go
10
Valores
else if (jogador_atual.GetCor() == Vermelho){ tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo, jogador_atual.GetCor()); if (LenArrayNode(tomadas) == 1){ if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) { contagemEmpate = 0; } RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y, tomadas[0], jogador_atual.GetCor(), true); } var posicao3 *Coordenada }
classe. Funes podem ser passadas como parmetros e retornadas como valor de funo.
PLP - Linguagem Go
11
Valores
Nmericos
Arrays
Abstrao de Funo
else if (jogador_atual.GetCor() == Vermelho){ tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo, jogador_atual.GetCor()); if (LenArrayNode(tomadas) == 1){ if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) { contagemEmpate = 0; } RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y, tomadas[0], jogador_atual.GetCor(), true); } var posicao3 *Coordenada }
Abstrao de Procedimento
Ponteiro
Booleanos
classe. Funes podem ser passadas como parmetros e retornadas como valor de funo.
PLP - Linguagem Go
12
Tipos Primitivos
var var var var barra string = "===== contagemEmpate int = 0 travou bool = false porcentagem float = 10.5
flutuante uint(8, 16, 32, 64), int(8, 16, 32, 64), float(32, 64), complex(64, 128) String Array de bytes. Imutvel
PLP - Linguagem Go
13
Tipos Compostos
14
Tipos Compostos
15
Tipos Compostos
Go no d suporte:
Unio Disjunta Conjuntos Potncia
PLP - Linguagem Go
16
Checagem de Tipos
Fortemente
PLP - Linguagem Go
17
Equivalncia de Tipos
18
Princpio da Completude
PLP - Linguagem Go
19
Expresses
Literais: Valores dos tipos bool, int, uint, float, string Agregados: array, maps, structs Funes
Go no d suporte a:
Expresses Condicionais
Expresses Iterativas
PLP - Linguagem Go
20
Armazenamento
Armazenamento
Variveis e Atualizao Arrays Semntica de Cpia x Semntica de Referncia Variveis Locais e Globais Heap Persistentes
Tipos de Comandos Skip Atribuio Chamada de procedimento Comandos Sequencial Colateral Condicional Expresses com Efeitos Colaterais
PLP - Linguagem Go
22
Variveis e Atualizao
Os valores armazenveis (storables) so os valores dos tipos primitivos e ponteiros Variveis Temporrias
Todas as variveis, com exceo do tipo File
Variveis Persistentes
Em Go, as variveis persistentes so do tipo File
PLP - Linguagem Go
23
Variveis e Atualizao
Seletiva
Total
PLP - Linguagem Go
24
Arrays
PLP - Linguagem Go
25
Semntica de cpia utilizada para valores de qualquer tipo. Semntica de Referncia utilizada apenas para ponteiros.
var posicao1 Coordenada; posicao1.x = 1; posicao1.y = 2; var posicao2 *Coordenada; var posicao3 *Coordenada; posicao2 = &posicao1; posicao3 = posicao2; posicao3.x = 5; posicao3.y = 5;
Por Referncia
Por Cpia
PLP - Linguagem Go
26
Variveis Globais so declaradas da seguinte forma: var + nomeVariavel + tipo Para variveis locais podem ser utilizados acares sinttico
var jogadorDaVez string = tabuleiro
func main() { tamanho := 10; if (...){ var numBombas = 15; } }
Varivel Global
Acar Sinttico
Variveis Locais
PLP - Linguagem Go
27
Variveis Heap
Variveis podem ser declaradas a partir da palavra reservada new. No existe um mecanismo para o programador destruir as variveis. Go possui Garbage Collection.
Alocao de memria
var tabuleiro_jogo *Tabuleiro = new (Tabuleiro)
PLP - Linguagem Go
28
Variveis persistentes
So do tipo File
oldfile := "text.txt" newfile := "text2.txt" doc, _ := ioutil.ReadFile(oldfile) ioutil.WriteFile(newfile,doc,0644)
PLP - Linguagem Go
29
Skip e Atribuio
for ; pilha != nil ; { tabTemp := tabuleiro.Copy() pilha, tuplaAtual = pilha.Pull() tabTemp.ComerPeca(posX, posY, tuplaAtual, cor) caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor) tamanhoCaminhoTupla++
30
Skip e Atribuio
Skip usado para separar expresses Atribuio
for ; pilha != nil ; { tabTemp := tabuleiro.Copy() pilha, tuplaAtual = pilha.Pull() tabTemp.ComerPeca(posX, posY, tuplaAtual, cor) caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor) tamanhoCaminhoTupla++
Acar sinttico
Atribuio simultnea
31
Chamada de Procedimentos
Chamada de procedimento
peca := new (Peca) peca.SetCor(Preto) //... func (peca *Peca) SetCor (cor int) { peca.cor = cor }
Procedimento
PLP - Linguagem Go
32
Comando Sequencial
meuTabuleiro.n = 0; meuTabuleiro.m = 0; meuTabuleiro.ganhou = false;
Comando Colateral
PLP - Linguagem Go
33
Comando Condicional
var aux string; switch opcao{ case 1: aux = "Jogar case 2: aux = "Ajuda" case 3: aux = "Fechar" }
PLP - Linguagem Go
34
Comandos Iterativos
Iterao definida
for i:=0; caminhoAtual[i] != nil && i < MAXIMO_CAMINHOS; i++ { nodeAtual = new(Node); nodeAtual.SetValor(tuplaAtual); //... }
Iterao indefinida
for i > 0 { var a int = Random(n); var b int = Random(n); //... }
PLP - Linguagem Go
35
Associaes
Associaes
PLP - Linguagem Go
37
Entidades Associveis
PLP - Linguagem Go
38
Escopo
const s = 2; func incremento ( d int ) int { return ds; } func executaIncremento ( valor int ) int { const s = 3; return incremento ( valor ); } func main () { fmt.Println( executaIncremento(5) ); }
Sada: 10
Em Go, o corpo de um bloco avaliado no ambiente em que foi definido (associao esttica).
PLP - Linguagem Go
39
Estrutura: blocos aninhados. Visibilidade: variveis declaradas em blocos de escopo internos no so visveis a blocos de escopo externos.
PLP - Linguagem Go
40
Definio
As definies em Go podem ser de tipo, abstrao de funes, abstrao de procedimentos, variveis, constantes.
const( MAX_MOVIMENTOS int = 50) func Jogada() (int,int) { // } var posJogada; var posX *int; var posAux *int;
PLP - Linguagem Go
41
Declarao de Tipo
type Peca struct { cor int; dama bool; }
Declarao de Varivel
var vertical string = "Coordenada Vertical: ; var valor int = 1; var decimal float = 1.0;
PLP - Linguagem Go
42
Declarao sequencial
Declaraes Colaterais
PLP - Linguagem Go
43
Declarao recursiva
func TomadaMaximaPeca(tabuleiro *Tabuleiro, posX int, posY int, cor int) ([MAXIMO_CAMINHOS] *Node, int) { caminhos := tabuleiro.GetOpcoesComida(posX, posY, cor); for ;pilha != nil; { caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor); return caminhosMaximos, tamanhoMaiorCaminho; }
Chamada recursiva
PLP - Linguagem Go
44
Comando bloco
func ( pilha Node ) PrintValorProximo( ) { Println ( "|" , pilha.GetValor( ) , "|" ); next := pilha.GetNext( ); Println(next.GetValor()); }
PLP - Linguagem Go
45
Expresso bloco
PLP - Linguagem Go
46
Princpio da Qualificao
Go no viola o princpio da qualificao, pois possvel realizar qualquer computao dentro de um bloco.
func (pilha *Node) GetNext() (*Node, *Tupla){
next := pilha.GetNext() valor := next.GetValor() func nome(){ //Corpo da funcao } return next, valor
}
47
Abstraes
Abstraes
PLP - Linguagem Go
49
Abstrao de Funo
Go d suporte a abstraes de funes atravs da palavra reservada func. A presena do retorno caracteriza a abstrao de funo.
func calculaNumDeMinas(tamanho int) int{ numeroDeBombas := int(tamanho*tamanho*20/100); if (numeroDeBombas%2 == 0) { numeroDeBombas += 1; } //m sempre impar if (tamanho <= 10) { numeroDeBombas += 2; } return numeroDeBombas; }
PLP - Linguagem Go
50
Abstrao de Procedimento
Go usa a mesma palavra reservada para caracterizar uma Abstrao de Procedimento, como em Abstraes de Funes. (func) A diferena que caracteriza a Abstrao de Procedimento a falta do retorno.
func inicializarJogo() { tabuleiro.ReiniciaTabuleiro(); ehHumano = true; }
PLP - Linguagem Go
51
Princpio da abstrao
Go no viola o princpio da abstrao, pois possvel construir abstrao sobre qualquer categoria sinttica da linguagem, como por exemplo: variveis, funes e procedimentos.
PLP - Linguagem Go
52
Parmetros
Como Go fortemente tipada, os parmetros devem possuir tipos definidos. Podem ser de qualquer tipo.
PLP - Linguagem Go
53
Passagem de Parmetros
Ponteiro
PLP - Linguagem Go
54
Princpio da Correspondncia
Go viola o princpio da correspondncia, pois no existe um
D erro de sintaxe
PLP - Linguagem Go
55
Ordem de Avaliao
Eager Evaluation
var p int; func main () { p = 3; print ( p ) } func print ( n int ) { Println(n); p = 100; Println(n); }
Sada: 3 3
PLP - Linguagem Go
56
Unidades de Programa
Unidades de Programa
PLP - Linguagem Go
58
Pacotes
As funes e variveis globais que comeam com letra Maiscula sero visveis para quem importar esse pacote. Caso contrrio, a funo fica com visibilidade privada.
package tabuleiro //... func (meuTabuleiro *Tabuleiro) Ganhou() bool { return meuTabuleiro.ganhou; } func (meuTabuleiro *Tabuleiro) AlguemGanhou(){ meuTabuleiro.ganhou = true; } func calculaNumDeMinas(tamanho int) int{ //... return numeroDeBombas; }/
PLP - Linguagem Go
Funes visveis
PLP - Linguagem Go
60
Objetos e Classes
Go no tem Objetos e Classes, porm, simula-os atravs de structs e funes ligadas a esses tipos.
type Node struct { valor Tupla next *Node } //... func (pilha *Node) Pull() (*Node, *Tupla) { return pilha.GetNext(), pilha.GetValor() }
Unidades Genricas
61
Sistemas de Tipos
Sistema de Tipos
PLP - Linguagem Go
63
Monomorfismo
func (meuTabuleiro *Tabuleiro) Ganhou() bool{ return meuTabuleiro.ganhou; } func (meuTabuleiro *Tabuleiro) AlguemGanhou() { As abstraes definidas pelo meuTabuleiro.ganhou = true; } programador, em Go, so
PLP - Linguagem Go
64
Sobrecarga
Go d suporte a sobrecarga de operadores built-in. Entretanto, no d suporte a sobrecarga de operaoes. (Operadores: +, -, e outros)
var barra string = "===== ; //... if (tabuleiro_jogo.IsZerou (jogador1.GetCor())){ Println(barra + "Jogador", jogador2.GetCor() + 1, "VENCEU! PARABNS", barra); break; }//...
Para tipos da prpria linguagem, um nico identificador ou operador pode denotar diferentes abstraes.
PLP - Linguagem Go
65
Go no tem tipos que contenham subtipos que herdam operaes aplicveis a valores desses tipos.
PLP - Linguagem Go
66
Polimorfismo Paramtrico
func polimorfismoParametrico(a int64, b int64) { Println(a); Println(b); } func main() { var x int8 = 1; var y int8 = 2; polimorfismoParametrico(x, y); } //input.go:13: cannot use x (type int8) as type int64 in function argument //input.go:13: cannot use y (type int8) as type int64 in function argument
PLP - Linguagem Go
67
Interface
package main import . "fmt"; func main(){ jogador := new(Jogador); jogador.nome = "iza"; peca := new(Peca); peca.cor = "preto"; imprimir(jogador); imprimir(peca); } type printer interface { Print(); } func (p *Peca) Print() { Println(p.cor); } func (j *Jogador) Print() { Println(j.nome); } func imprimir (p printer) { p.Print(); } type Peca struct { cor string; } type Jogador struct { nome string; }
PLP - Linguagem Go
68
Coerso
func Random(n int) int { sec, nsec, err := Time(); if err != nil { Seed(int64(n)); } else { Seed(int64(n)+(sec*1e9+nsec)); } return int(Int63n(int64(n))) }
PLP - Linguagem Go
69
Sequenciadores
Sequenciadores
PLP - Linguagem Go
71
Desvios Incondicionais
I: Println(Digite a dimensao: (N)"); var tam int = ReadInt(); if ( tam < 20 && tam > 4) { goto L; } Println(N fora do limite [4,20]."); goto I; L: geraTabuleiro(tam);
Para fazer Desvios Incondicionais usamos a palavra reservada goto S podemos fazer desvios incondicionais dentro do escopo da abstrao de funo. (No podemos ir para pontos mais externos do programa).
PLP - Linguagem Go
72
Escape
for i := 0; i < len(tabuleiro); i++ { for j := 0; j < len(tabuleiro[i]); j++ { if (tabuleiro[i][j] == 9) { Println("Achou bomba na linha ", i+1); break; } }
Go d suporte a escape atravs da palavra reservadabreak e continue. Escape no rotulado apenas finaliza a iterao corrente.
PLP - Linguagem Go
73
Escape rotulado
busca: for i := 0; i < len(tabuleiro); i++ { for j := 0; j < len(tabuleiro[i]); j++ { if (tabuleiro[i][j] == 9) { Println("Achou bomba na linha ", i+1); break busca; } }
PLP - Linguagem Go
74
Excees
Go no d suporte a excees.
PLP - Linguagem Go
75
Concorrncia
Concorrncia
var canal = make(chan int); func main() { go rotina1(); go rotina2(); } func rotina1(){ var i int = 0; for i = 0; i <= 100; i++ { canal <- i; } } func rotina2(){ for { msg := <- canal; Println(msg); if(msg == 100){ break; } } }
Channel
Goroutines
Go d suporte a concorrncia atravs de goroutines. A comunicao entre os processos concorrentes atravs de channel.
PLP - Linguagem Go
77
Spin-Lock
func acquire(){ for(usandoRecurso){ } usandoRecurso = true;
Flag
} func relinquish(){ usandoRecurso = false; } func rotina1(){ acquire(); //regiao critica relinquish(); } func rotina2(){ acquire(); //regiao critica relinquish(); }
O flag uma varivel global. Assim permitimos que apenas uma rotina tenha acesso ao recurso.
Rotinas
PLP - Linguagem Go
78
Concluso
PLP - Linguagem Go
80
PLP - Linguagem Go
81
Referncias
Referncias
http://alovasconcelos.net/ http://golang.org http://tutorial.danielmazza.info/go RAMALHO, Franklin. Notas de Aula da disciplina Paradigmas de Linguagens de Programao, 2010. http://forum.zwame.pt/showthread.php?t=348920
PLP - Linguagem Go
83