Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação
Delano Oliveira
Janderson Jason
Luan Barbosa
Natã Melo
PLP - Linguagem Go
2
Introdução
Introdução
Motivação
Sintaxe e Semântica
Processador da Linguagem
Outras Características
PLP - Linguagem Go
4
Motivação
Compilada
Sensação de uma linguagem dinâmica
Simula Orientação a Objetos
Possui Garbage Collection
Multi-processamento
Open-source
18a linguagem mais usada no mundo segundo o
site da Tiobe
PLP - Linguagem Go
5
Sintaxe e Semântica
Go reúne características sintáticas de várias
linguagens
Semântica Operacional
PLP - Linguagem Go
6
Processador da Linguagem
Compilador: gccgo
PLP - Linguagem Go
7
Outras Características
Criada pela Google e lançada em novembro de
2009
Equipe: Robert Griesemer, Rob Pike e Ken
Thompson
PLP - Linguagem Go
8
Valores & Tipos
Valores & Tipos
Valores Tipos
Boolean Primitivos
Numérico Compostos
String Recursivo
Array
Struct Checagem de Tipos
Equivalência de Tipos
Ponteiros
Princípio da Completude
Abstração de função e Expressões
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
}
PLP - Linguagem Go
13
Tipos Compostos
Produtos Cartesianos : Structs
PLP - Linguagem Go
14
Tipos Compostos
Produtos Cartesianos : Structs
[][]*Peca x int
type Tabuleiro struct {
matriz [8] [8] *Peca
int totalPecas
}
PLP - Linguagem Go
15
Tipos Compostos
Tipos Recursivos: Structs
type Node struct {
valor Tupla
next *Node
}
Go não dá suporte:
União Disjunta
Conjuntos Potência
PLP - Linguagem Go
16
Checagem de Tipos
Go é estaticamente e fortemente tipada.
func main (){
var nome string = "plp"
nome = 18
}
prog.go:6: cannot convert 18 to type string
prog.go:6: cannot use 18 (type int) as
type string in assignment
PLP - Linguagem Go
17
Equivalência de Tipos
Go dá suporte a equivalência nominal
package main
PLP - Linguagem Go
18
Princípio da Completude
Go quebra o princípio da completude de tipo.
É necessário o uso do tipo File para manipular
arquivos persistentes.
Funções só podem retornar valores primitivos ou
ponteiros.
PLP - Linguagem Go
19
Expressões
Literais: Valores dos tipos bool, int, uint, float, string
Agregados: array, maps, structs
Funções
Go não dá suporte a:
Expressões Condicionais
Expressões Iterativas
PLP - Linguagem Go
20
Armazenamento
Armazenamento
Variáveis e Atualização Tipos de Comandos
Arrays Skip
Semântica de Cópia x Atribuição
Semântica de Referência
Chamada de
Variáveis
procedimento
Locais e Globais
Comandos
Heap
Sequencial
Persistentes
Colateral
Condicional
Expressões com Efeitos
Colaterais
PLP - Linguagem Go
22
Variáveis e Atualização
Os valores armazenáveis (storables) são os
valores dos tipos primitivos e ponteiros
Variáveis Temporárias
Todas as variáveis, com exceção do tipo File
Variáveis Persistentes
Em Go, as variáveis persistentes são do tipo File
PLP - Linguagem Go
23
Variáveis e Atualização
Go dá suporte a atualização seletiva e atualização
total
PLP - Linguagem Go
24
Arrays
Go dá suporte a Arrays Estáticos.
Os arrays possuem tamanho fixo e não podem
armazenar valores de tipos diferentes.
PLP - Linguagem Go
25
Semântica de Cópia x
Semântica de Referência
Semântica de cópia – utilizada para valores de
qualquer tipo.
Semântica de Referência – utilizada apenas para
ponteiros.
var posicao1 Coordenada;
posicao1.x = 1;
posicao1.y = 2;
var posicao2 *Coordenada;
var posicao3 *Coordenada; Por Referência
posicao2 = &posicao1;
posicao3 = posicao2;
posicao3.x = 5;
posicao3.y = 5; Por Cópia
PLP - Linguagem Go
26
Variáveis Locais e Globais
Variáveis Globais são declaradas da seguinte
forma: var + nomeVariavel + tipo
Para variáveis locais podem ser utilizados
açúcares sintático
var jogadorDaVez string = “tabuleiro” Variável Global
func main() {
tamanho := 10;
Açúcar if (...){
Variáveis Locais
Sintático var numBombas = 15;
}
}
PLP - Linguagem Go
27
Variáveis Heap
Variáveis podem ser declaradas a partir da
palavra reservada new.
Não existe um mecanismo para o programador
destruir as variáveis. Go possui Garbage
Collection.
Alocação de
memória
PLP - Linguagem Go
28
Variáveis persistentes
oldfile := "text.txt"
newfile := "text2.txt"
doc, _ := ioutil.ReadFile(oldfile)
ioutil.WriteFile(newfile,doc,0644)
PLP - Linguagem Go
29
Skip e Atribuição
PLP - Linguagem Go
30
Skip e Atribuição
Skip usado para separar expressões Atribuição
PLP - Linguagem Go
31
Chamada de Procedimentos
Chamada de procedimento
//...
Procedimento
PLP - Linguagem Go
32
Comando Sequencial
meuTabuleiro.n = 0; meuTabuleiro.m = 0; meuTabuleiro.ganhou = false;
Comando Colateral
Não existem comandos colaterais.
PLP - Linguagem Go
33
Comando Condicional
Go dá suporte através de: if ,else e switch.
var jogada int;
if (ehHumano) {
var pos [2]int = JogarHumano();
jogada = tabuleiro.Jogada(pos);
} else {
var pos [2]int = JogarAutomatico();
jogada = tabuleiro.Jogada(pos);
}
PLP - Linguagem Go
34
Comandos Iterativos
Iteração definida
for i:=0; caminhoAtual[i] != nil && i < MAXIMO_CAMINHOS;
i++ {
nodeAtual = new(Node);
nodeAtual.SetValor(tuplaAtual);
//...
}
Iteração indefinida
Palavra reservada for
for i > 0 { funcionando como o
var a int = Random(n); comando while em
var b int = Random(n);
outras linguagens.
//...
}
PLP - Linguagem Go
35
Associações
Associações
Entidades Associáveis Comando Bloco
Escopo Expressão Bloco
Estrutura de Blocos Princípio da Qualificação
Visibilidade
Declarações
Definição
Declaração de Tipo
Declaração de Variável
Declarações Colaterais
Declarações Sequenciais
Declarações Recursivas
PLP - Linguagem Go
37
Entidades Associáveis
Valores primitivos e compostos
Abstrações de funções e procedimentos
Variáveis e Tipos
meuTabuleiro.m = 0;
meuTabuleiro.ganhou = false;
var Numero int = calculaNumDeMinas(n);
const( MAX_MOVIMENTOS int = 50);
PLP - Linguagem Go
38
Escopo
const s = 2;
PLP - Linguagem Go
41
Declaração de Tipo
Declaração de Variável
var vertical string = "Coordenada Vertical: “;
var valor int = 1;
var decimal float = 1.0;
PLP - Linguagem Go
42
Declaração sequencial
Como a maioria das linguagens imperativas,
Go dá suporte à declaração sequencial.
tamanhoMaiorCaminho := 0;
tamanhoCaminhoTupla := 0;
var pilha *Node = nil;
var caminhoAtual [MAXIMO_CAMINHOS] *Node;
Declarações Colaterais
Go não dá suporte a este tipo de declaração.
PLP - Linguagem Go
43
Declaração recursiva
Go dá suporte a declaração recursiva.
Chamada recursiva
PLP - Linguagem Go
44
Comando bloco
Go dá suporte a comando bloco.
PLP - Linguagem Go
45
Expressão bloco
PLP - Linguagem Go
46
Princípio da Qualificação
Go não viola o princípio da qualificação, pois é
possível realizar qualquer computação dentro de
um bloco.
func (pilha *Node) GetNext() (*Node, *Tupla){
next := pilha.GetNext()
valor := next.GetValor()
func nome(){
//Corpo da funcao
}
return next, valor
}
PLP - Linguagem Go
47
Abstrações
Abstrações
Tipos de Abstrações Argumentos
Abstração de Função Passagem de Parâmetros
Abstração de Princípio da
Procedimento Correspondência
Ordem de Avaliação
Princípio da Abstração
Parâmetros
PLP - Linguagem Go
49
Abstração de Função
Go dá suporte a abstrações de funções através da palavra
reservada func.
A presença do retorno caracteriza a abstração de função.
PLP - Linguagem Go 50
Abstração de Procedimento
Go usa a mesma palavra reservada para caracterizar uma
Abstração de Procedimento, como em Abstrações de Funções.
(func)
A diferença que caracteriza a Abstração de Procedimento é a
falta do retorno.
func inicializarJogo() {
tabuleiro.ReiniciaTabuleiro();
ehHumano = true;
}
PLP - Linguagem Go
51
Princípio da abstração
PLP - Linguagem Go
52
Parâmetros
Como Go é fortemente tipada, os parâmetros devem possuir
tipos definidos.
Podem ser de qualquer tipo.
}
func (peca *Peca) EhDama () (bool){
return peca.dama
}
PLP - Linguagem Go
53
Passagem de Parâmetros
Em Go a passagem de parâmetros é por cópia\valor.
Ponteiro
PLP - Linguagem Go
54
Princípio da Correspondência
func main ( ) {
fmt.Println ("Imprimir constante:" , funcao ( constante ) ) ;
}
Dá erro de sintaxe
PLP - Linguagem Go
55
Ordem de Avaliação
Eager Evaluation
var p int;
func main () {
p = 3;
print ( p )
}
Saída:
func print ( n int ) {
Println(n);
3
p = 100; 3
Println(n);
}
PLP - Linguagem Go
56
Unidades de Programa
Unidades de Programa
Pacotes
Tipos Abstratos de Dados
Objetos e Classes
Unidades Genéricas
PLP - Linguagem Go
58
Pacotes
As funções e variáveis globais que começam com letra
Maiúscula serão visíveis para quem importar esse pacote.
Caso contrário, a função fica com visibilidade privada.
package tabuleiro
//...
PLP - Linguagem Go
59
Tipo Abstrato de Dados
package tabuleiro
PLP - Linguagem Go
60
Objetos e Classes
Go não tem Objetos e Classes, porém, simula-os através de
structs e funções ligadas a esses tipos.
type Node struct {
valor Tupla
next *Node
}
//...
func (pilha *Node) Pull() (*Node, *Tupla) {
return pilha.GetNext(), pilha.GetValor()
}
Unidades Genéricas
Go não dá suporte a unidades genéricas.
PLP - Linguagem Go
61
Sistemas de Tipos
Sistema de Tipos
Monomorfismo
Sobrecarga
Polimorfismo Paramétrico
Polimorfismo por Inclusão
Interfaces
Coerção
PLP - Linguagem Go
63
Monomorfismo
func (meuTabuleiro *Tabuleiro) Ganhou() bool{
return meuTabuleiro.ganhou;
}
func (meuTabuleiro *Tabuleiro) AlguemGanhou() {
meuTabuleiro.ganhou = true; As abstrações definidas pelo
} programador, em Go, são
monomórficas. Toda
entidade tem um tipo
específico associado.
Println("---------------------------");
Print("Linha: ");
Println(posMaquina[0]+1);
Print("Coluna: ");
Println(posMaquina[1]+1); Mas, algumas abstrações
Println("---------------------------"); embutidas (built-in) não
são monomórficas.
PLP - Linguagem Go
64
Sobrecarga
Go dá suporte a sobrecarga de operadores built-in.
Entretanto, não dá suporte a sobrecarga de operaçoes.
(Operadores: +, -, e outros)
PLP - Linguagem Go
65
Polimorfismo por Inclusão
type Natural int;
type Inteiro int;
var x Natural = 1;
var y Inteiro = -1;
Println(x+y);
PLP - Linguagem Go
66
Polimorfismo Paramétrico
func polimorfismoParametrico(a int64, b int64) {
Println(a);
Println(b);
}
func main() {
var x int8 = 1;
var y int8 = 2;
polimorfismoParametrico(x, y);
}
PLP - Linguagem Go
67
Interface
package main
import . "fmt";
func main(){
jogador := new(Jogador);
jogador.nome = "iza"; Go simula
peca := new(Peca);
peca.cor = "preto"; o uso de
imprimir(jogador);
imprimir(peca); interface
}
com o tipo
type printer interface { Print(); }
“interface”.
func (p *Peca) Print() { Println(p.cor); }
func (j *Jogador) Print() { Println(j.nome); }
PLP - Linguagem Go
68
Coersão
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)))
}
Em substituição às coerções,
são adotados casts.
PLP - Linguagem Go
69
Sequenciadores
Sequenciadores
Desvios Incondicionais
Escapes
Exceções
PLP - Linguagem Go
71
Desvios Incondicionais
I: Println(“Digite a dimensao: (N)");
L: geraTabuleiro(tam);
PLP - Linguagem Go
72
Escape
for i := 0; i < len(tabuleiro); i++ {
for j := 0; j < len(tabuleiro[i]); j++ { Iteração afetada
if (tabuleiro[i][j] == 9) {
pelo escape
Println("Achou bomba na linha ", i+1);
break;
}
}
}
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;
}
}
}
Rótulo
PLP - Linguagem Go
74
Exceções
PLP - Linguagem Go
75
Concorrência
Concorrência
var canal = make(chan int);
func main() {
go rotina1();
go rotina2(); Channel
}
func rotina1(){ Goroutines
var i int = 0;
for i = 0; i <= 100; i++ { Go dá suporte a concorrência
canal <- i; através de goroutines.
}
}
A comunicação entre os
func rotina2(){ processos concorrentes é
for { através de channel.
msg := <- canal;
Println(msg);
if(msg == 100){
break;
}
}
}
PLP - Linguagem Go
77
Spin-Lock
func acquire(){
for(usandoRecurso){
}
usandoRecurso = true;
Flag
}
func relinquish(){
usandoRecurso = false;
} O flag é uma variável global.
Assim permitimos que apenas uma
func rotina1(){
acquire();
rotina tenha acesso ao recurso.
//regiao critica
relinquish(); Rotinas
}
func rotina2(){
acquire();
//regiao critica
relinquish();
}
PLP - Linguagem Go
78
Conclusão
PLP - Linguagem Go
80
PLP - Linguagem Go
81
Referências
Referências
http://alovasconcelos.net/
http://golang.org
http://tutorial.danielmazza.info/go
RAMALHO, Franklin. Notas de Aula da disciplina Paradigmas de
Linguagens de Programação, 2010.
http://forum.zwame.pt/showthread.php?t=348920
PLP - Linguagem Go
83