Ricardo Felipe Leandro Saori Jennifer Language.
Transcript of Ricardo Felipe Leandro Saori Jennifer Language.
Ricardo
FelipeLeandro
Saori
Jennifer
http://golang.org
Language
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Introdução
Neste seminário, mostraremos a Linguagem GO abordando seus principais aspectos e caracteristicas que julgamos importante para seu diferencial em relação as linguagens até então conhecidas.Para o melhor entedimento usaremos comparações com as linguagens C e Java.
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Como chegamos aqui
Segundo Rob Pike:1) C e Unix tornaram-se dominante nas pesquisas;2) O desejo por uma linguagem de alto-nível levou
a C++, apesar de ter sido um ajuste pobre, possibilitou uma programação de alto nível para Unix;
3) C++ se tornou a principal escolha na indústria e nas pesquisas universitarias;
4) Java surgiu como uma visão mais limpa de C++,5) Pelo final dos anos 90, Java foi escolhida como
linguagem para ensino.
http://golang.org
Programação se tornou díficil
Essas linguagens são difíceis de usarElas são sutis, complexas e detalhadas.Seu modelo padrão está “sobrevendido” e nós respondemos com add-on como “padrões”(Norvig: os padrões são uma demonstração de fraqueza em uma linguagem.)No entanto, essas linguagens são bem sucedidas e vitais.
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo- Conclusão
- Conclusão- Refêrencia
http://golang.org
Reação
A falta de jeito das principais linguagens causou uma reação: uma série de sucessos de linguagens mais simples (Python, Ruby, Lua, Java Script, Erlang…).Isso demonstra a insatisfação com o modelo padrão e a abordagem, cada vez mais popular, do novo modelo.
http://golang.org
As vantagens
As linguagens padrões são muito fortes: type-safe, eficazes e eficientesNas mãos de especialistas, elas são ótimasGrandes sistemas e grandes empresas são construídas em cima delasNa prática, elas funcionam bem para programação em grande escala: programas de grande porte e número alto de programadores.
http://golang.org
As desvantagens
As linguagens padrões são difíceis de usarCompiladores são lentos e exigentes. Binários são enormes.Muitos programadores preferem evitá-las.As linguagens tem, pelo menos, 10 anos de idade e são mal adaptadas para os ambientes atuais ( multicores, nuvens de rede).
http://golang.org
Qual seria o ideal ?
Manter as vantagens e evitar as desvantagens ( ÓBVIO!!!!) :- A sensação de uma linguagem dinâmica
com a segurança de um sistema estático;- Compilação rápida;- Tempo de execução real que suporta GC;- Leve, sistema flexível;- Possui métodos, mas não é uma
linguagem OO convencional.
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Hello World!
Em C:
#include <stdio.h>
int main(){printf("Hello World!");return 0;
}http://golang.org
Hello World!
Em Java:
public class Main {
public static void main(String[] args) { System.out.print("Hello World!"); }
}http://golang.org
Hello World!
Em Ruby:
puts “Hello World!”
http://golang.org
Hello World!
Em Go:
import "fmt"
func main() {fmt.Print("Hello World!")
}
http://golang.org
Γειά σου Κόσμε!"
Em Go:
import "fmt"
func main() {fmt.Print("Γειά σου Κόσμε!")
}
http://golang.org
こんにちは、世界!Em Go:
import "fmt"
func main() {fmt.Print("こんにちは、世界! ")
}
http://golang.org
Básico da Linguagem
É baseada em C com participação da família Pascal / Modula / Oberon (declarações, pacotes), além de algumas idéias de linguagens inspiradas por Tony Hoare (simultaneidade)
http://golang.org
VáriaveisDeclarações: muito parecidas com C, mas de forma invertida, várias formas de declaração para se adequar ao uso da váriavel em questão
// Forma completavar variável_A1 int = 10var variável_A2 string = "dez“// Forma menos abreviadavar variável_B1 = 20 var variável_B2 = "vinte“// Forma mais abreviada (variáveis locais apenas)variável_C1 := 30variável_C2 := "trinta“variável_C3 := uint64(10)//Atribuição múltiplax, y, z := 10, 10.0, "dez"
http://golang.org
Váriaveis
Tipos numéricos: uso de palavras intuitivas, sem conversões implicitas ( int != int32)
http://golang.org
Váriaveis
Booleanos: o tipo bool pode assumir os valores true ou false, o operador if usa apenas expressões booleanas, ponteiros e inteiros não são booleanos.
Go:var a bool = 2<3var b bool = false
http://golang.org
Estruturas de controleIf: if x > 0 { // código }
For: Go a implementa for de forma mais genérica e flexível que o usual.
// Como o for do Cfor inicial; condição; final { /* código */ }// Como o while do Cfor condição { /* código */ }// Loop, como o for(;;) do Cfor { /* código */ }// Percorrer uma listafor c, v := range lista {// c = chave (key), v = valor}
http://golang.org
Estruturas de controle
Switch: É geralmente usado para testagens massivas sobre um mesmo objeto/valor, porém Go permite o uso mais amplo também nesse caso. Algo a ser testado pode tanto ser um valor simples quanto um objeto complexo e para cada case pode-se fazer mais de um teste.
switch algo {default:/* código */case "A", "B", "C":/* código */case "1", "2", "3":/* código */}
http://golang.org
Funções
Podem retornar valores de diferentes tipos.
func MySqrt(f float64) (float64, bool) {if f >= 0 { return math.Sqrt(f), true }return 0, false}
http://golang.org
Funções
Um simples return retorna os valores default das váriaveis de retorno
func MySqrt(f float64) (v float64, ok bool) {if f >= 0 { v,ok = math.Sqrt(f), true }return // return 0, false}
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Orientação a objetosResumo: OO é um tipo especial de "empacotamento" de código no qual um contexto é logicamente isolado do restante e tratado em termos de input e output.
import "fmt"type MinhaEstrutura struct { nome string número int}func (minha *MinhaEstrutura) ImprimaNomeENúmero() { fmt.Printf("Nome:\t%s\nNúmero:\t%d\n", minha.nome, minha.número)}func main() { m := new(MinhaEstrutura) m.nome = "Fulano" m.número = 10 m.ImprimaNomeENúmero()}
http://golang.org
Orientação a objetos
http://golang.org
• Classe: representa um conjunto de objetos com características afins.
• (mais especialmente uma interface)
Orientação a objetos
• Go não é realmente orientado a objetos
• Não tem herança• Logo não tem polimorfismo
• Apenas utiliza alguns conceitos• Interface
http://golang.org
Orientação a objetos (Java)
public class C1 /*extendsObject*/{ //lista de atributos //construtor //metodos //classes internas}
http://golang.org
Orientação a objetos
• Em java um método geralmente altera os atributos da própria classe.
• E se tivermos a necessidade de utilizar um tipo especial de dados mas a linguagem não oferecer suporte?
http://golang.org
Orientação a objetos
Em C quando queremos definir um tipo diferente de dados utilizamos o typedef
typedef struct A { ... } A;
main(){... A *a = (A*)malloc(sizeof(A)); ...}
http://golang.org
Orientação a objetos (C)
E para manipularmos este novo tipo?
void add(A* a, int i){ ... //aqui dentro manipulamos “a”..}
http://golang.org
Orientação a objetos (C)
O que você mais odeia em C quando esta lidando com tipos novos de dados?
http://golang.org
Orientação a objetos (C)
O que você mais odeia em C quando esta lidando com tipos novos de dados?
Passar a variável a ser manipulada como parâmetro?
http://golang.org
Orientação a objetos
Orientação a objetos resolveria isso!
a.add(i);
Simples assim!
http://golang.org
“Orientação a objetos” (Go)
Em go não existe classe!
Mas existe interface...
type A interface { add(i int) ...}
http://golang.org
“Orientação a objetos” (Go)
Mas em quem a função add(int) vai agir?
http://golang.org
“Orientação a objetos” (Go)
Interfaces não contém o código propriamente dito, são apenas “assinaturas”.
Go permite ao programador especificar em quem um método ira agir sem a passagem de parâmetro.
http://golang.org
“Orientação a objetos” (Go)
func (a *A) add(i int){ a.valor = i}
Deste modo a função add funciona apenas ao tipo de estrutura “A”, como se fosse uma orientação a objetos sem todos aqueles conceitos(chatos).
http://golang.org
Orientação a objetos
http://golang.org
// retorna um ponteiro para uma nova variável
as funões add(int) e
max() são aplicáveis
apenas ao tipo *arv
E onde entra a interface na história?
Nossa estrutura criada obedece estas três interfaces pois existem os métodos add(int) e max() que são aplicáveis a ela.
• Repare que a função não recebeu nossa estrutura criada, mas sim a interface... Esta função sabe trabalhar com quaisquer tipos de dados que satisfaçam a interface “arvore”
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Quick Sort(Java)
public static void quick_sort(int []v,int ini, int fim){ int meio; if(ini<fim){ meio = partition(v,ini,fim); quick_sort(v,ini,meio); quick_sort(v,meio+1,fim); } }
http://golang.org
Quick Sort(Java)
public static int partition(int []v, int ini, int fim){ int pivo, topo,i; pivo = v[ini]; topo = ini; for(i=ini+1;i<fim;i++){ if(v[i]<pivo){ v[topo]=v[i]; v[i]=v[topo+1]; topo++; } } v[topo]=pivo; return topo; }
http://golang.org
Quick Sort(Java + Go)
func quick_sort(v []int,ini, fim int){ var meio int if ini<fim { meio = partition(v,ini,fim) quick_sort(v,ini,meio) quick_sort(v,meio+1,fim) }}
http://golang.org
Quick Sort(Java + Go)
func partition(v []int,ini, fim int) int{ var pivo, topo, i int pivo = v[ini] topo = ini for i=ini+1; i<fim; i++ { if(v[i]<pivo){ v[topo]=v[i] v[i]=v[topo+1] topo++ } } v[topo]=pivo return topo}
http://golang.org
Quick Sort(Go)
func quick_sort(v []int){ var meio int if 0<len(v)-1 { meio = partition(v) quick_sort(v[0:meio]) quick_sort(v[meio+1:len(v)]) }}
http://golang.org
Quick Sort(Go)
func partition(v []int) int{ var pivo, topo, i int pivo = v[0] topo = 0 for i=1; i< len(v); i++ { if(v[i]<pivo){ v[topo]=v[i] v[i]=v[topo+1] topo++ } } v[topo]=pivo return topo}
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Conclusão
- Linguagem muito imatura;- É baseada na arquitetura atual (Von
Neumann) o que a torna mais próxima do paradgima imperativo;
- Pouco mais produtiva que C;- Tenta dar uma falsa impressão de
flexibilidade.
http://golang.org
Índice
- Introdução- História
- Observações iniciais- Moderno x Antigo
- GO- Básico- Orientação a objetos- Algoritmo Exemplo
- Conclusão- Refêrencia
http://golang.org
Referência
- https:// sites.google.com/a/danielmazza.info/tutorial/go
- http://golang.org/doc/effective_go.html
- “100428-pike-stanford”- Go Course Day (1, 2 e 3)
http://golang.org