Nos últimos anos uma linguagem em particular cresceu muito: GoLang, ou simplesmente Go. Afinal, o não que deixa um desenvolvedor mais empolgado que uma nova linguagem? F̶r̶a̶m̶e̶w̶o̶r̶k̶s̶ ̶J̶a̶v̶a̶s̶c̶r̶i̶p̶t̶

Comecei a estudar Go devido aos projetos em Kubernetes na Getup Cloud e depois na QueroQuitar graças ao bom incentivo que tive lá pra aprender coisas novas. O QuE DiSeR dEsSa LiNgUaGeM qUe Mal CoNhEsSo i JaH cOnSiDeRo PaKaS? Orkut à parte, quem ama programar, está sempre empolgado com novos frameworks, soluções, libs, OSs, etc…

Foi assim que junto com o Guilherme Caruso , resolvemos criar a Gommunity . Aliás, se você está começando agora, a série dele Goschool foi feita especialmente para você.

Há bons artigos explicando sobre Go na internet e na Gommunity, então nesse artigo vamos falar um pouco sobre o atual momento e por que você deveria aprender uma nova linguagem.

Já parou pra pensar que a Lei de Moore não se aplica mais?

Não podemos adicionar mais cache ao processador para aumentar o desempenho, pois o cache tem limites físicos: quanto maior o cache, mais lento ele fica. Adicionar mais núcleos ao processador também tem seu custo. Além disso, isso não pode escalar pra sempre. 

Se não pudermos confiar nas melhorias de hardware, o único caminho será um software mais eficiente para aumentar o desempenho. Mas, infelizmente, a linguagem de programação moderna não é muito eficiente. E̶x̶c̶e̶t̶o̶ ̶o̶ ̶P̶H̶P̶,̶ ̶e̶s̶s̶e̶ ̶é̶ ̶s̶u̶p̶e̶r̶ ̶p̶e̶r̶f̶o̶r̶m̶á̶t̶i̶c̶o̶.̶

Habemos Go Routines

Golang

Sem a possibilidade de esperar que o hardware escale para sempre, o software que desenvolvemos e as linguagens de programação que usamos devem suportar a simultaneidade facilmente e devem ser escaláveis com o aumento do número de núcleos.

Porém, a maioria das linguagens de programação modernas (como Java, Python, etc.) são do ambiente single threaded dos anos 90. A maioria dessas linguagens de programação suporta multi-threading. Mas o problema real vem com a execução simultânea, threading-locking, race conditions e deadlocks. Esses problemas dificultam a criação de um sistema/aplicativo multi-threading nesses idiomas.

Por outro lado, o Go foi lançado em 2009 quando os processadores multi-core já estavam disponíveis. É por isso que o Go é construído com a intenção de manter a simultaneidade. Go tem goroutines em vez de threads. Eles consomem quase 2 KB de memória do heap. Então, você pode rodar milhões de goroutines a qualquer momento.

Benefícios:

  • Goroutines têm pilhas segmentáveis crescíveis. Isso significa que eles usarão mais memória somente quando necessário. [1] [2]
  • As goroutines têm um tempo de inicialização mais rápido que os threads. [1] [2] [3]
  • As goroutines vêm com primitivas embutidas para se comunicar com segurança entre si (canais). [1] [2]
  • As goroutines permitem evitar o recurso ao bloqueio de mutex ao compartilhar estruturas de dados. [1] [2] [3]
  • Além disso, goroutines e threads de SO não possuem mapeamento 1:1. Uma única goroutine pode ser executada em vários threads. Goroutines são multiplexadas em um pequeno número de threads de SO. [1]

Go é executado diretamente no hardware

Gopher Love

Um benefício considerável do uso de C, C ++ em relação a outras linguagens modernas de nível superior, como JavaScript/Python, é o desempenho delas. Porque C/C++ são compilados e não interpretados.

Os processadores entendem os binários. Geralmente, quando você cria um aplicativo usando Java ou outras linguagens baseadas em JVM ao compilar seu projeto, ele compila o código legível por humanos para código de bytes que pode ser entendido pela JVM ou outras máquinas virtuais executadas no SO subjacente. Durante a execução, a VM interpreta esses bytecodes e os converte nos binários que os processadores podem entender.

Código legível por humanos -> VMs -> Processador

No entanto, C/C ++ não é executado em VMs e isso remove uma etapa do ciclo de execução e aumenta o desempenho. Ele compila diretamente o código legível por humanos para binários.

Código legível por humanos -> Processador

Porém, liberar e alocar variáveis nessas linguagens é uma tristeza. Enquanto a maioria das linguagens de programação manipula a alocação e remoção de objetos usando os algoritmos Garbage Collector ou Reference Counting.

Go traz o melhor dos dois mundos. Como linguagens de nível inferior como C/C++, o Go é uma linguagem compilada. Isso significa que o desempenho está quase mais próximo das linguagens de nível inferior. Ele também usa a coleta de lixo para alocar e remover os objetos. Portanto, não há mais declarações malloc() e free().

O código escrito em Go é fácil de manter

Com uma sintaxe simples e enxuta, GO é deliciono de se programar.

Os designers do Go no Google pensaram nisso quando criaram a linguagem. Como o Google tem uma base de código muito grande e milhares de desenvolvedores estavam trabalhando nessa mesma base de código, o código deveria ser simples de entender para outros desenvolvedores e um bloco de código deve ter um efeito colateral mínimo em outro bloco do código. Isso torna o código facilmente sustentável e fácil de modificar. O Go intencionalmente deixa de fora muitos recursos das linguagens modernas de POO.

  • Sem classes. Tudo é dividido apenas em pacotes. Go tem apenas estruturas em vez de classes.
  • Não suporta herança. Isso tornará o código fácil de modificar. Em outras linguagens como Java/Python, se a classe ABC herda a classe XPTO e você faz algumas alterações na classe XPTO, isso pode produzir alguns efeitos colaterais em outras classes que herdam o XPTO. Ao remover a herança, o Go facilita a compreensão do código também (como não há uma super classe para olhar enquanto olha para um pedaço de código).
  • Sem construtores. A vivência de Kotlin também me faz sentir um pouco de falta.
  • Sem anotações.
  • Sem genéricos. Admito que sinto falta, nos meus maps/filters/reducers (background de JavaScript presente)
  • Sem exceções.

As alterações acima tornam o Go muito diferente de outros idiomas e tornam a programação no Go diferente de outras linguagens. Você pode não gostar de alguns pontos acima. Mas, não é como se você não pudesse codar sua solução sem os recursos acima.

Quem me conhece já me viu resmungando por ter que escrever for pra filtrar.
Sinto falta de ternário? Sim :(

Ao contrário de outras novas linguagens como o Swift , a sintaxe do Go é muito estável. Permaneceu o mesmo desde o lançamento público inicial 1.0, no ano de 2012. Isso o torna compatível com versões anteriores.

Acredite nos seus sonhos (e no Go)

Embora o Go seja muito diferente de outras linguagens orientadas a objetos, ainda é a mesma coisa. O Go fornece alto desempenho como C/C ++, manipulação de simultaneidade super eficiente como Java e código divertido como Python/JavaScript/Kotlin.

Se você não tem planos de aprender o Go, ainda direi que o limite de hardware nos pressiona, os desenvolvedores de software a escreverem códigos super eficientes. O desenvolvedor precisa entender o hardware e otimizar o programa de acordo.

Meu próximo projeto será desenvolver alguma solução em Go para meu Raspberry Pi 4, em breve contarei sobre ele aqui. Enquanto isso, até breve, futura marmotinha que leu esse texto.