César Henrique Bernabé João Mario Silva. Linguagens de Programação

Documentos relacionados
Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Computação II Orientação a Objetos

Introdução a Go para programação paralela

História. Nasceu em 1993, numa discussão entre Yuhikiro Matsumoto e um colega.

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Go para programação paralela

5 Apresentando a linguagem C

Conceitos básicos da linguagem C

E/S CPU. Memória (Instruções e dados) 2 PARADIGMA IMPERATIVO. Instruções e dados. Resultados das operações. Unidade lógica e aritmética

Programando em C++ Histórico da Linguagem C

Exercícios de Revisão Java Básico

Variáveis e Comandos de Atribuição

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

INTRODUÇÃO À LINGUAGEM C++

Programação Orientada a Objeto

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

3. INTRODUÇÃO À LINGUAGEM C 3.1. CONCEITOS BÁSICOS. Lógica de Programação

Trabalho 3: Agenda de Tarefas

Programação Orientada a Objetos C++

9 Comandos condicionais

Algoritmos e Estruturas de Dados I 01/2013. Estruturas Condicionais e de Repetição (parte 2) Pedro O.S. Vaz de Melo

Algoritmos e Programação

Programação: Estruturas de seleção

Programação para Dispositivos Móveis Aula 1. Prof. William Yamamoto

Desenvolvimento OO com Java Orientação a objetos básica

Sistemas Operacionais. Prof. André Y. Kusumoto

Plano de Aula. if(condição) { bloco de comandos; } else { bloco de comandos2; }

Algoritmos e programação

Programação Estruturada I

Implementando uma Classe e Criando Objetos a partir dela

Roteiro. MC-102 Aula 01. Hardware e dispositivos. O que é um computador? Primeiro Semestre de A linguagem C

2 echo "PHP e outros.";

Programação: Tipos, Variáveis e Expressões

Programação por Objectos. Java

Estrutura de Dados Básica

Componentes da linguagem C++

Representação de Algoritmos - Linguagens de Programação

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

- Aulas 57, 58, 59 e 60 - Técnicas de programação. Funções

Orientação a Objetos. Conceitos Iniciais Introdução a Linguagem Java. Gil Eduardo de Andrade

O COMPUTADOR. Introdução à Computação

Aula 12: Funções. Pré-requisitos: Todas as aulas anteriores deste módulo. 1. Aproveitando Códigos no Programa

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Algoritmo e Técnica de Programação - Linguagem C

GABARITO COMENTADO SISTEMAS OPERACIONAIS. PROF. Cláudio de C. Monteiro, Evanderson S. de Almeida, Vinícius de M. Rios

Introdução a Computação

LINGUAGEM C. Estrutura básica de um programa

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Introdução à Programação

Capítulo 2. VARIÁVEIS DO TIPO INTEIRO

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Tóffolo 2011/1

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Objetivos do mini curso. Conhecer a linguagem. Noção de programação utilizando Python. Aprender o báscio.

Apresentação. Rio de Janeiro, 19 de fevereiro de 2002 Waldemar Celes

Programação de Computadores - I. Profª Beatriz Profº Israel

Linguagem de Programação C

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Linguagem de Programação

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS ESTUDO DE CASO I

Tipo de Dados em Linguagem C

Java Como Programar, 8/E

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

Introdução ao PHP. Prof. Késsia Marchi

Aprendendo Python na Prática. Dante Moreira Zaupa Mestrando em Computação Aplicada Bolsista de Pesquisa

JavaScript (ou JScript)

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

TRABALHO DE REDES DE COMPUTADORES 1 GNUTELLA

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

2 Orientação a objetos na prática

Minicurso de Python Aula 1. Raphael Lupchinski Marcelo Millani

compreender a importância de cada estrutura de controle disponível na Linguagem C;

Convertendo Algoritmos para a Linguagem C

Ruby. Simplicidade e produtividade

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

Linguagens de Programação

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Estrutura Condicional em Java

Linguagem de Programação Orientada a Objeto. Introdução a Orientação a Objetos Professora Sheila Cáceres

LINGUAGEM ORIENTADA A OBJETOS

Algoritmos e Técnicas de

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Linguagem de Programação I

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

CURSO BÁSICO DE PROGRAMAÇÃO AULA 9. Introdução a linguagem C Estruturas de decisão

Gerenciamento de Entrada e Saída Hélio Crestana Guardia e Hermes Senger

Organização de Computadores Software

O comando switch. c Professores de ALPRO I 04/2012. Faculdade de Informática PUCRS. ALPRO I (FACIN) O comando switch 04/ / 31

Transcrição:

Go César Henrique Bernabé João Mario Silva Linguagens de Programação

Introdução Go que nasceu nos escritórios do Google em 2007 como um projeto interno e em novembro de 2009 foi lançado como um projeto de código aberto. Inspirada em C, porém possui características como Orientação a Objetos e Coletor de Lixo. Última versão 1.4.2 Não entra nas 50 linguagens mais utilizadas do ranking do TIOBE, mas em 2013 já esteve na 23 posição.

Instalação Download e instruções de instalação estão disponíveis em https://golang.org/ (inglês) ou em http://www.golangbr.org/ (português).

Executando um programa Basta executar, a partir do terminal: $go run programa.go ou $go build

Hello World package main import "fmt" func main() { fmt.println("olá, 世 界 ")

Comentários Comentários em Go são feitos da mesma forma que C, onde: // comentário de uma única linha /* * comentário de múltiplas * linhas */

Palavras Reservadas em Go break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var

Tipagem Go possui tipagem forte e estática, porém introduz uma forma curta de declaração de variáveis, baseada em inferência de tipos, isso evita redundância e produz códigos sucintos.

Tipagem //tipagem por inferência x := 5 a, b := 8, 12 //tipagem estática var y int var k float64

Valores Numéricos Go possui uma vasta gama de tipos numéricos: uint8, uint16, uint32, uint64 (inteiros sem sinal de 8, 16, 32 ou 64-bits) int8, int16, int32, int64 (inteiros (com sinal) de 8, 16, 32 ou 64-bits) float32, float64 (o conjunto de todos pontos flututantes IEEE-754 32-bit) complex64, complex128 (o conjunto de todos números complexos de float32 partes reais e imaginárias) byte (sinonimia para uint8), rune (sinonimia para int32) uint, int (tanto 32 ou 64 bits) uintptr (um inteiro sem sinal grande o suficiente para armazenar os bits não-interpretados de um ponteiro)

Valores Strings Booleanos Arrays Structs Ponteiros Mapas Channel

Arrays e Slices Slice é uma abstração baseada em Array, onde: Arrays são listas com tamanho pré-determinado. Slices possuem tamanho dinâmico, podendo crescer indefinidamente. Quando usados como argumento ou retorno de funções, são passados por referência. Nos outros casos são passados como cópia.

Arrays A definição de um array deve especificar seu tipo e tamanho: var a [4]int a[0] = 1 i := a[0] // i == 1

Slices Slices são ponteiros para segmentos de um array: letters := []string{"a", "b", "c", "d" Ou podem ser criados usando a função make, que possui a seguinte assinatura: func make([]t, len, cap) []T Onte T é o tipo dos elementos do slice.

Maps Mapas seguem a estrutura map[keytype]valuetype: capt := map[string]string{ GO : Goiânia, PB : João Pessoa, ES : Vitória //com uso de make m = make(map[string]int) //mapas vazios m = map[string]int{ //ambas as formas tem o //mesmo resultado!

Range Slices, arrays e maps podem ser "fatiados" usando a palavra chave range (como em Python): x := []int{0,1,2,3 y := x[1:] for i,v := range y { //range retorna fmt.println(y[i]) //tanto o indice fmt.println(v) //quanto o valor

Range* Obs.: Se o índice não for utilizado, deve-se usar o identificador vazio _ x := []int{0,1,2,3 for _,v := range x { fmt.println(v)

Saída padrão Necessária importaçao da biblioteca fmt. import( "fmt" ) Outras funçoes de fmt: //mesma sintaxe de C: fmt.printf("numero: %d", 5) func main( ) { fmt.println("o João é um cara bem legal..") fmt.print("nao insere a quebra de linha")

Entrada Padrão Também são gerenciados pelo pacote fmt: var i int _, err := fmt.scanf("%d", &i)

Estruturas de Repetição If/Else For Switch While

If/Else if num := 9; num < 0 { fmt.println(num, "é negativo") else if num < 10 { fmt.println(num, "tem 1 dígito") else { fmt.println(num, "tem vários dígitos") Obs.: uma instrução pode preceder condições; qualquer variável declarada nessa condição está disponível para todas as ramificações.

For Única condição (nesse caso funciona como While, Go não tem while): i := 1 for i <= 3 { fmt.println(i) i = i + 1

For Range (como em arrays, slices e maps): for i, v := range y { fmt.println(v) fmt.println(y[i])

For Várias condições (clássico): for j := 7; j <= 9; j++ { fmt.println(j)

For Sem condição: for { fmt.println("loop") break

Switch Switch Básico: switch i { case 1: fmt.println("um") case 2: fmt.println("dois") case 3: fmt.println("três") Cases separados por vírgulas: switch time.now().weekday() { case time.saturday, time. Sunday: fmt.println("é final de semana") default: fmt.println("é dia de semana")

Blocos e Escopos Go possui suporte a blocos aninhados. Variáveis declaradas dentro de blocos são somente visíveis a este.

Funções func mais(a int, b int) int { return a + b func main() { res := mais(1, 2) fmt.println("1+2 =", res) Onde: func nome_da_funcao (parametro int, entrada String) retorno { corpo da funcao Funções sem retorno apenas omite-se o tipo de retorno na definição da função, nessa caso elas são chamadas procedimentos.

Funções - Multiplos Retornos func vals() (int, int) { return 3, 7 func main() { a, b := vals() //usando os dois valores de retorno fmt.println(a) fmt.println(b) c := vals() //usando o primeiro valor de retorno fmt.println(c)

Funções - Multiplos Retornos func vals() (int, int) { return 3, 7 func main() { a, b := vals() //usando os dois valores de retorno fmt.println(a) fmt.println(b) _, c := vals() //usando o segundo valor de retorno fmt.println(c)

Funções Variádicas func soma(nums...int) { fmt.print(nums, " ") total := 0 for _, num := range nums { total += num fmt.println(total) func main() { soma(1, 2) soma(1, 2, 3) nums := []int{1, 2, 3, 4 soma(nums...)

Ponteiros Go suporta uso de ponteiros, porém não suporta aritmética entre eles.

Ponteiros func zeroval(ival int) { ival = 0 func zeroptr(iptr *int) { *iptr = 0 func main() { i := 1 fmt.println("inicial:", i) zeroval(i) fmt.println("zeroval:", i) zeroptr(&i) fmt.println("zeroptr:", i) fmt.println("ponteiro:", &i)

Ponteiros func zeroval(ival int) { ival = 0 func zeroptr(iptr *int) { *iptr = 0 func main() { i := 1 fmt.println("inicial:", i) zeroval(i) fmt.println("zeroval:", i) Saida: inicial: 1 zeroval: 1 zeroptr: 0 ponteiro: 0x42131100 zeroptr(&i) fmt.println("zeroptr:", i) fmt.println("ponteiro:", &i)

Visibilidade A visibilidade em pacotes é definida pera primeira letra do nome da função ou variável global: Se primeira letra for maiúscula, então é função/variável pública. Se primeira letra for minúscula, então é função/variável privada.

Orientação a Objeto A orientação a objetos em Go é simulada por meio de structs. Isso será discutido nos próximos slides.

Sistema de Tipos Go não permite herança, mas os tipos implementam interfaces implicitamente. Na prática, considera-se essa implimentação implícita como duck typing. Duck typing: se faz quack como um pato, e anda como um pato, então provavelmente é um pato.

Interfaces Baseadas na implementação de structs, interfaces em Go são definidas como coleções de assinaturas de métodos.

Interfaces type geometria interface { area() float64 type quadrado struct { largura, altura float64 type círculo struct { raio float64 func (q quadrado) area() float64 { return q.largura * s.altura func (c círculo) area() float64 { return math.pi * c.raio * c.raio

Interfaces func medir(g geometria) { fmt.println(g) fmt.println(g.area()) func main() { q := quadrado{largura: 3, altura: 4 c := círculo{raio: 5 medir(q) medir(c)

Interfaces É importante destacar que todas as funções previamente mencionadas foram escritas no mesmo arquivo. A tipagem de cada objeto foi feita dinâmicamente. Tivemos então o chamado Polimorfismo. Go não dá suporte a excessões.

Erros Go comunica erros através de um valor explícito, separado: func f1(arg int) (int, error) { if arg == 42 { return -1, errors.new("não pode trabalhar com 42") return arg + 3, nil

Erros Por convenção, erros são o ultimo parâmetro de retorno de uma função e possuem tipo próprio (error). Também é possível usar 0 no lugar de nil.

Closures Go suporta funções anônimas, que podem formar closures. Funções anônimos são úteis quando se quer definir uma função em linha sem ter de nomeá-la.

Closures func intseq() func() int { i := 0 return func() int { i += 1 return i func main() { nextint := intseq() fmt.println(nextint()) fmt.println(nextint()) fmt.println(nextint()) newints := intseq() fmt.println(newints())

Closures func intseq() func() int { i := 0 func main() { nextint := intseq() return func() int { i += 1 return i fmt.println(nextint()) fmt.println(nextint()) $ go run closures.go fmt.println(nextint()) 1 2 3 newints := intseq() fmt.println(newints()) 1

Concorrência Do not communicate by sharing memory, share memory by communicating.

Concorrência Em Go, a concorrência é expressa atravéz de Goroutines, e a comunicação entre processos é feita atravéz de canais (memória compartilhada).

Goroutines Uma Goroutine é uma thread leve de execução. Para criar uma Goroutine basta chamar a função com a palavra chave go como prefixo Func funcao() {... go funcao()

Goroutines O escalonador de Go não tira proveito do hardware. Go só usa 1 core de CPU, a não ser que esse numero seja alterado usando a SVC runtime.gomaxprocs(ncpus).

Canais Canais são pipes que conectam goroutines concorrentes. É possível enviar valores para os canais de uma goroutine e receber esses valores em outra goroutine.

Canais func main() { //cria um novo canal mensagens := make(chan string) //escreve do canal go func() { mensagens <- "ping" () //le do canal msg := <-mensagens fmt.println(msg)

Sincronização de Canais A comunicação por um canal é síncrona (bloqueante). Sincronização é feita com uso de ferramentas da biblioteca "sync". Funções da biblioteca "sync" podem ser chamadas com a criação de uma variável do tipo WaitGroup.

Canais func main() { var controle sync.waitgroup //indica que uma nova goroutine devera ser sincronizada controle.add(1) go executar(&controle) //espera até que todas goroutines estejam finalizadas controle.wait()

Avaliação da Linguagem Critério C Java Go Aplicabilidade Sim Parcial Sim Confiabilidade Não SimGo possui vários pacotes Não que extendem suas funções, como Aprendizado Não exemplo o pacote HTTP, que Não Sim (simples) fornece funcionalidades de Eficiência Sim manipulações de endereços web Parcial Parcial

Avaliação da Linguagem Critério C Java Go Aplicabilidade Sim Parcial Sim Confiabilidade Não Sim Não Aprendizado Não NãoAssim como em C (e Sim ao contrário de Java), Go não apresenta Eficiência Sim tratamento de exceções. Parcial Parcial

Avaliação da Linguagem Critério C Java Go Aplicabilidade Sim Parcial Sim Confiabilidade Não Sim Não Aprendizado Não Não Sim Eficiência Sim ParcialComparada a C Parcial e Java, Go é mais simples de aprender (não usa aritmética de ponteiros, não obriga o tratamento de exceções, etc).

Avaliação da Linguagem Critério C Java Go Aplicabilidade Sim Parcial Sim Eficiência Parcial: Controle de Confiabilidade Não Sim recursos contra goroutines Não Aprendizado Não Não Sim (simples) Eficiência Sim Parcial Parcial

Avaliação da Linguagem Critério C Java Go Portabilidade Não Sim Sim Método de projeto Estruturado Possível compilar o mesmo Estruturado código e OO OO em vários sistemas diferentes. simulado Evolutibilidade Não Sim Parcial (OO Reusabilidade Sim Sim Parcial

Avaliação da Linguagem Critério C Java Go Portabilidade Não Sim Sim Método de projeto Estruturado OO Estruturado e OO simulado Evolutibilidade Não Sim Parcial Reusabilidade Sim Sim Justamente por Parcial possuir OO simulada, consideramos Evolutibilidade em Go como Parcial.

Avaliação da Linguagem Critério C Java Go Portabilidade Não Sim Parcial Método de projeto Estruturado OO Reusabilidade é Estruturado feita com o e uso OO de Interfaces simulado Evolutibilidade Não Sim Parcial Reusabilidade Parcial Sim Parcial

Avaliação da Linguagem Critério C Java Go Integração Sim Parcial Parcial Custo Depende da aplicação Pode ser linkado Depende com C ou da C++ Depende da ferramenta (open ferramenta source)

Avaliação da Linguagem Critério C Java Go Integração Sim Parcial Parcial Custo Depende da aplicação Depende da ferramenta Depende da ferramenta Go é Open Source!

O Trabalho Implementação para o sistema de gerenciamento da Revista EngeSoft, o sistema aceita submissões de artigos, com cadastro de autores, revisores e notas para artigos, então exibe um relatório sobre a edição.

O Trabalho - Estrutura Artigos type Artigo struct{ titulo string contato Autor listaautores[] Autor listarevisores[] Revisor media float64 revisoesenviadas int func (art *Artigo) AdicionaAutor(autor Autor){ art.listaautores = append(art.listaautores, autor)

O Trabalho - Estrutura Autor type Edicao struct { volume, numero int datapublicacao time.time tema string chefe Revisor artigos []Artigo codartigos map[int]int

O Trabalho - Estrutura Edicao type Edicao struct { volume, numero int datapublicacao time.time tema string chefe Revisor artigos []Artigo codartigos map[int]int

O Trabalho - Estrutura Revisor type Revisor struct { nome string email string senha int instituicao string endereco string temas []string artigosrevisados int notasatribuidas float64

O Trabalho - Funções - Sorting type ByName []Revisor func (a ByName) Len() int { return len(a) func (a ByName) Swap(i, j int) { a[i], a[j] = a[j],a[i] func (a ByName) Less(i, j int) bool { return a[i].nome < a[j].nome

O Trabalho - Funções - Leitura CSV func readcsvfile(filename string, fildnumber int)(rawdata [][]string, err error){ file, err := os.open(filename) reader := csv.newreader(file) reader.comma = ';' rawdata, err = reader.readall() return rawdata, nil

O Trabalho - Funções - Escrita Arq func escreverarquivo(nomearquivo, conteudo string) { d1 := []byte(conteudo) err := ioutil.writefile(nomearquivo, d1, 0644) check(err)

Referências http://golang.org/ http://www.golangbr.org/ http://goporexemplo.golangbr.org/ Concorrência e sincronização na linguagem Go - Daniel Alfonso Gonçalves de Oliveira Livro Programando em Go - Caio Filipini.

Obrigado