Go: C + Python com tempero de Erlang, Oberon, Limbo para concorrer com C++ by Google

12 11 2009

Go Mascote Uma linguagem com as facilidades sintáticas de Python, porém estática e que gere executáveis com opcodes com pouca dependência e desempenho similar aos de C e que desfrute dos recursos computacionais de concorrência que os atuais processadores e computadores oferecem com facilidade é algo que muitos, a muito tempo desejavam.  Conheço engenheiros que só tem C e Assembly como opção e que sempre costuma afirmar que “odeiam C”, pelos clássicos problemas da linguagem e compiladores.

Para minha surpresa li este artigo ontem no Slashdot:

Go, Google’s New Open Source Programming Language

E como ele fazia referência a um artigo na ARS Technica, fui conferir a notícia:

Go: new open source programming language from Google

Go, como toda linguagem,  nasceu de necessidades, frustrações e certamente surpreenderá,  logo criará uma legião de fãs assim como frustrará muitos outros, mas sendo Open Source e com uma licença BSD-Style ela tem potencial de agregar muitos  desenvolvedores ao seu core-development. Particularmente eu já instalei, comecei a brincar já me frustrei mas amei as goroutines.

O dilema que está em sua motivação é muito parecido com o que alguns já passaram em certos desenvolvimentos, escolher entre uma linguagem com compilação eficiente, execução performática e facilidade de programação; para oferecer tudo isto nativamente numa única linguagem de programação os autores resolveram partir para seu desenvolvimento.

Para quem dizia que eu era meio maluco por gostar de Haskell, Erlang, C++ e Python e uma linguagem ideal seria a que fosse uma composição de características de todas elas, tive uma fantástica surpresa, além de uma (quase) decepção!

A surpresa fantástica, veio pelo fato que o Google busca com este empreendimento:

– “Uma nova linguagem de programação que busca a performance com concorrência embutida, que é quase comparável a C, mas com a sintaxe mais expressiva e compilação rápida” e além de tudo ela tem pedigree! Pois entre seus projetistas estão Robert Griesemer, Russ CoxRob Pike (um dos pais da linguagem Limbo e do Plan9) e Ken Thompson;  K, apesar de dispensar apresentações  apenas para recordar ele  é um dos pais da linguagem B,  do UNIX e também trabalhou no projeto do Plan9.

Além da inspiração sintática básica de C ela  “tenta” combinar as facilidades das linguagens dinâmicas (Python e JavaScript), com contribuições de Pascal/Modula/Oberon (quanto a declarações e packages), além de algumas idéias de Erlang, CSP, Newsqueak e Limbo (na concorrência). Porém, é uma nova linguagem!

Da ARS Technica eu fui direto para o site do projeto: golang.org

E encontrei mais algumas definições curiosas:

– “Go” buscou inspirações em todas estas linguagens para criar uma de propósito geral, projetada com “systems programming” em mente, “fortemente tipada” (aqui eles não beberam na fonte de Python) e com uso de garbage-collect (tsc) com suporte nativo a programação concorrente  e com gramática compacta e regular, isto tudo soa muito interessante.

Porém, no site do projeto um dos links me chamou muito a atenção:

Go for C++ Programmers

Como o foco dela é “system programming” e por  suas características performáticas, de cara já forçar um replace de C++ era esperado. Será este um grande golpe em C++ ou um golpe mortal na linguagem D? Por outro lado lembro-me da afirmação do Herb Sutter que os programadores C++ são os mais abertos a aprenderem novas linguagens, esta afirmação nem sempre me parece verdadeira, mas para os casos onde ela se aplica (que são muitos) o foco do Google parece estar correto.

Agora, veja esta simples comparação sintática:

Go                           C++
var v1 int;               // int v1;
var v2 string;            // const std::string v2;  (approximately)
var v3 [10]int;           // int v3[10];
var v4 []int;             // int* v4;  (approximately)
var v5 struct { f int };  // struct { int f; } v5;
var v6 *int;              // int* v6;  (but no pointer arithmetic)
var v7 map[string]int;    // unordered_map<string, int>* v7;  (approximately)
var v8 func(a int) int;   // int (*v8)(int a);

De cara ela me irrita  pois var me lembra Pascal, mas a declaração de struct me pareceu mais elegante e prefiro declarações explícitas de funções, classes e métodos, ponto para Go.

Outro detalhe que me chamou a atenção é que por enquanto há compiladores disponíveis para Linux e Mac OS X que geram opcodes para AMD64 (x86 e 64 bits), x86 de 32 bits e está no forno um compilador ARM! Será que ele permitirá compilação bare-metal para produção de firmware? Tenho suspeita que sim.

Vejam algumas diferenças conceituais entre C++ e Go:

  • Go não tem classes com  construtores ou destrutores. Mas sim  métodos de classe, uma hierarquia de herança de classes e funções virtuais, ela  fornece interfaces que são utilizadas como os templates de C++; portanto ela oferece programação genérica.
  • Go  usa garbage collection.  Não é possível  liberar memória explícitamente.  Este gerenciamento de memória “pretende” ser incremental e  altamente eficiente em processadores modernos.
  • Go tem ponteiros, mas não a aritmética de ponteiro. Não é possível empregar um ponteiro para percorrer os bytes de uma string.
  • Arrays são valores de primeira classe. Quando um array é usado como um parâmetro de função, a função recebe uma cópia da matriz, não um ponteiro para ele. No entanto, na prática, muitas funções usam “slices” de parâmetros; “slices” suportam os ponteiros para arrays subjacentes. “Slice” é um recurso importante da linguagem.
  • Strings são fornecidas pela linguagem. Mas elas não podem ser alteradas depois de sua criação.
  • Tabelas hash são fornecidas pela linguagem. Eles são chamados de maps.  Velhos conhecidos de outra linguagens.
  • Threads são separadas da execução, e os canais (channels) de comunicação entre eles, são fornecidos pela linguagem.
  • Certos tipos (maps e channels)  são passados por referência, não pelo valor. Ou seja, passar um map para uma função não é copiar o map, e  as alterações da função do map são vistas pelo invocador.  Como referências de tipos de C++, porém mais similar como é em Python.
  • Go não usa “header files”. Em vez disso, cada arquivo fonte é parte de um package definido, similar a Python, Oberon e Pascal. Quando um package define um objeto (tipo, constante, variável, função) com um nome começando com uma letra maiúscula, esse objeto é visível a qualquer outro arquivo que importe esse package.
  • Ela não oferece suporte a conversão implícita de tipo. Operações que misture tipos diferentes requerem casts (que em Go são chamadas de conversions).
  • Go não suporta sobrecarga de funções e não suporta os operadores definidos pelo usuário.
  • Go não suporta os qualificadores const ou volatile.
  • Ela  usa nil para ponteiros inválidos e  C++ usa NULL ou simplesmente 0.

Sobre as diferenças sintáticas recomendo realmente a leitura da página Go for C++ Programmers, mas antes a leitura dos documentos TutorialEffective Go,  Language Design FAQ, Language Specification entre outros documentos para o  entendimento de alguns conceitos como as fantásticas goroutines. Porém se o tempo permitir, assista a apresentação do Rob Pike  no Tech Talk, chamada What is Go?

Confesso que algumas características não me agradaram muito, já outras me pareceram muito interessantes (leia-se channels e goroutines), porém ainda é cedo para apresentar uma avaliação. Entrei na Go Nuts! que é a lista oficial da  linguagem e com 2 dias de existência ela já tinha mais de 800 mensagens e 1.200 membros. Será que esta linguagem irá revolucionar? Um ponto positivo é que ela é Open Source porém patrocinada pelo Google, well… tenho minhas suspeitas que sim e em pouco tempo ela irá causar uma reviravolta.

Maiores detalhes acessem o site oficial do projeto: golang.org

PS: Já estou vendo os anúncios de emprego solicitando programadores com 2 a 5 aos de experiência em G0, antes mesmo do lançamento da linguagem completar 1 ano!🙂


Ações

Information

7 responses

13 11 2009
Tiago Natel de Moura

Legal, já tinha lido sobre ela mas ainda não tinha visto a sintaxe.
Algumas coisas também não me agradaram também, mas gostei muito da liberdade que ela dá ao programador. Com alguns recursos para agilizar o desenvolvimento, etc.
Não gostei que ainda é obrigatório às chaves { } para os statements, liberdade que Python/Ruby já nos livrou.
O uso de package vai ser uma mão na roda, ninguém merece usar #include’s no séc XXI ¬¬

Bacana!

Quando eu tiver um tempo quero dar uma estudada nela.

[]s;
T.N.M.

13 11 2009
Alan Jumpi

Sim, eu vi a apresentacao do Rob Pike e o que me deixou mais fascinado foi o lance das goroutines e os canais de comunicacao, conceito herdado do limbo… eehehehehhehehehehe… enfim, essa linguagem promete hein??? O mais engracado da apresentacao foi ele falando que a interface com o GCC do Ian Taylor e lenta…😀

Vale muito a pena ver a apresentacao…😀

13 11 2009
techberto

Vi o vídeo do Rob Pike praticamente duas vezes, revendo algumas partes uma meia dúzia de vezes, o comentário sobre a interface do Ian Taylor realmente foi hilária, voltei algumas vezes para ter certeza que eu não havia me confundido! Confesso que as goroutines e os canais de comunicação foram os recursos que mais me chamaram a atenção, principalmente por serem nativos. E não vou negar que a influência pythônica também me agradou, mas em alguns momentos ela pode ser confundida com influência de outras linguagens, como no caso dos packages.

A falta de construtores e destrutores nas classes num primeiro momento me desagradou muito, agora refletindo um pouco penso que devo experimentar para tentar descobrir melhor este mecanismo deles. E a declaração de variáveis também não me encantou, mas se ela cumprir o que promete; acho que este preço vale a pena.

Eu também recomendo as apresentações, tanto a short do Russ Cox quanto a completa do R.Pike.

++[]s;

13 11 2009
Henrique

Li a documentação e brinquei um pouco. Alguns pontos:

Pros:
– Organização em pacotes é bem vinda, headers são jurássicos.
– Threading parafusado direto na linguagem é maravilhoso.
– De cara já inclui uma boa biblioteca.

Cons:
– A inconsistência de como trata por valor para alguns tipos, e referência para outros, é nojenta. Porque não simplesmente tratar tudo por referência?
– Você tem ponteiros, mas no fundo eles são inúteis porque tem o GC.
– A sintaxe mistura muita coisa sem manter o estilo de fato com nada. Pra mim que tenho experiência com C e Python, não consigo usar completamente a sintaxe de um ou de outro sem me perder. Frustrante.

Tem bons recursos e é interessante, mas no geral achei o design da linguagem simplesmente ruim de se trabalhar. Obviamente, ainda é uma alternativa melhor do que ir de C para muitas coisas, mas como meus casos de uso passam longe de C eu ainda preferiria ir de Python ou Erlang antes.

13 11 2009
Paulo Eduardo Neves

Caraca, a lista dos desenvolvedores é sinistra!

Será que esta será a próxima grande linguagem? Acho que tem chances. Hoje estamos em uma encruzilhada. Os processadores têm cada vez mais processadores, mas está todo mundo vendo que processamento multi-thread é muito difícil nas linguagens interativas tradicionais. Êta coisa difícil de depurar. Já as outras linguagens, como Erlang e Haskell, são muito diferentes das linguagens tradicionais para virarem mainstream.

Tem uma abertura aí para surgir uma nova linguagem com cara de tradicional, mas com boas primitivas para processamento paralelo. Se não for assim, ficaremos apenas é com Java e algumas estruturas já arquitetadas para serem usadas de multi-thread.

Essa aí tem um elenco estrelar de desenvolvedores. É bancada por um grande corporação. E é open-source. Tomara que vingue!

13 11 2009
techberto

Paulo,

Este é uma boa retórica, seja como hipérbole ou metáfora, como figura de linguagem quanto no sentido literal do adjetivo, “sinistro” por enquanto é um excelente atributo para o mundo de Go e seus elementos orbitais.

E além disto há estes astros, Rob Pike é uma figura estelar porém não gostei de Limbo, Russ Cox é um cara super talentoso que conhece várias linguagens e que está tendo uma participação super-legal na golang-nuts, Ken é um cara controverso, brilhante e com um histórico de sucesso com alguns de seus projetos; mas eles não estão sozinhos, desconheço o histórico de Robert Griesemer (tenho apenas o feedback que ele é brilhante) mas Ian Taylor (apesar da crítica/brincadeira do Rob Pyke no vídeo de apresentação) é famoso por sua longa contribuição com OSS desde o autoconf, binutils e de seu trabalho na Cygnus Solutions, Adam Langley e Kai Backman são notórios programadores C++ também open source core-developers.

Por esta ângulo é interessante ver que há muita experiência acumulada nos laboratórios de desenvolvimento de linguagens deste core-team da linguagem.

Se ela não vingar, que este laboratório gere bons frutos para a evolução de C++, se ela enterrar C++ dentro do Google para novos desenvolvimentos que seja por excelência e gere boas influências em vários setores.

++[]s;

14 11 2009
Tino Gomes

Como assim, Go existe a menos de um ano? http://pt.wikipedia.org/wiki/Go

hehehe

Agora, falando sério, vamos esperar para ver onde vai dar esse Go! E muito bom o artigo.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: