Executando verificação de segurança...
13

Nim: uma linguagem que deveria ter mais reconhecimento

Olá, pessoal do TabNews! Já faz um tempo que eu estou só de olho por aqui, desde o desenvolvimento da plataforma, até o lançamento prévia dela, então decidi criar uma publicação aqui antes do lançamento oficial (e pretendo me tornar ativo por aqui).

Antes de mais nada queria avisar que isso é apenas a visão de um jovem amador de 17 anos que sonha em se tornar um bom programador um dia, então relevem qualquer erro referente a isso. O segundo aviso é que essa publicação vai estar separada em duas partes, a parte técnica, e minha visão pessoal. Sem mais enrolação, vamos lá!

O que é o Nim?

O Nim é uma linguagem compilada e estaticamente tipada, ele gera executáveis com zero dependências, e sem VMs, com sintaxe fortemente inspirada no Python, mas como é citado no próprio site, ele é muito mais com um "Python compilado".

O deferencial do Nim é sua alta flexibilidade em diversos pontos, como o gerenciamento de memória, que é completamente personalizável, e as macros que dá uma liberdade extraordinária no quesito de personalização de código e sintaxe.

Um exemplo é a biblioteca padrão chamada 'sugar' que traz, por exemplo, o suporte a declaração de funções com o '=>' como no javascript. Outro exemplo é o framework 'nimib' que permite a criação de sites inteiros apenas usando tamplates e instruções, quase como uma lista de compras. Eu mesmo já usei das macros para criar uma biblioteca simples que facilitasse a criação de classes.

No nim, existe suporte a objetos, porém, em um estilo que eu não gosto muito, então usando as macros do nim, consegui transformar isso:

type
  Person = object of RefObjetc # nécessario para herança
    name: string
    age: int

method sayHello(self: Person): void =
  echo self.name

nisso:

class Person:
  var:
    name: string
    age: int

  method sayHello(): void {.base.} = # nécessario para suporte a herança 
    echo self.name

e caso eu queira herdar uma classe, eu só preciso fazer isso:

class Studant of Person:

Então é visível a alta personalização que a linguagem permite.

Mas o que faz meus olhos brilharem para essa linguagem está em um conceito que eu chamo de "Metaprogramação"

O seu diferencial

O compilador do Nim gera além de códigos nativos em C, o que traz uma performance incrível, ele também compila para C++ e javascript. Isso, contando com as macros, traz um conceito que eu acredito que deve ser o futuro da programação, que é a possibilidade de um mesmo código poder ser utilizado em diversas plataformas, sem perda de performance.

Um exemplo perfeito é um framework para desenvolvimento de aplicações gráficas do Nim que usa e abusa desses conceitos para que um mesmo código gere uma interface agradável para todas as plataformas, com as funções nativas do Windows, com o GTK no Linux, e com o canvas para javascript. Percebe o quão incrível isso pode ser?

Um mesmo programador pode escrever uma interface com o Nim, e isso ser distribuído para todas as plataformas com suas funções nativas, sem nenhuma perda de performasse.

Isso aumenta de mais a produtividade e portabilidade de um produto. Não é como usar um interpretador javascript para transforma seu site em um programa nativo, já que o compilador vai se encarregar de transformar seu código nativamente para cada plataforma, trazendo alta portabilidade, e dando aquela performance delicinha que só chamadas diretas do kernel pode dar.

Minha filosofia sobre programação

Sou um jovem curioso, e sempre experimentei diversas linguagens e tecnologias, mas minha opinião controversa sobre sempre me fez ter dificuldades de me adaptar na área. Por muitos anos programei na linguagem Lua, que ainda é minha queridinha, mas com o tempo vi ser necessário mudar e evoluir, e entender que conceitos simples como declarar o tipo de uma variável não é o fim do mundo. Mas apesar de programar numa boa em qualquer linguagem, eu sempre fui fã da simplicidade, flexibilidade, e principalmente performance.

Eu comecei a programar no antigo notebook de um parente que tinha 512 MB de RAM e um single core de 2 GHz. Desde então eu programo em um desktop com 2 GB de RAM e um celeron de 1.10 GHz. Ou seja, performance sempre foi extremamente essencial, e eu tive que aprender a programar assim.

Eu não reclamo desta minha realidade, pelo contrário, acredito que isso me faz um bom programador, sem contar que se não fosse por isso, eu não teria aprendido metade das coisas que eu sei no mundo da tecnologia, como meu conhecimento com Linux e hardware.

Mas querendo ou não isso acabou gerando um conflito, já que na programação, quanto mais humano é um código, mais difícil é para um computador entender, e por causa disso nunca achei uma linguagem que me deixasse 100% satisfeito.

Por conta disso eu nunca consegui trabalhar com linguagens como Python, javascript, go, dentre outros, que tinham uma maneira muito rápida e divertida de programar, porém, sua performance em relação ao meu computador me deixava bem decepcionado.

Ao mesmo tempo que trabalhar com C, C++, Rust e outras linguagens semelhantes se tornavam massantes para mim, já que tudo que eu sabia fazer se tornava muito complicado, e tornavam meu workflow muito lento e chato.

Mas não me entendam mal, um dos pontos da minha filosofia que desenvolvi com o tempo é que não existe linguagem boa ou ruim, mas sim, uma para cada proposito. Por exemplo, eu não faria um site ou api usando C, seria desperdício de sanidade e tempo, para isso é muito mais fácil usar javascript ou Ruby on Rails. Da mesma forma de que seu eu for trabalhar com machine learning, obviamente a melhor maneira de fazer isso é com Python.

Porém, por algum motivo muito técnico que eu não entendo ainda, o Nim consegue trazer não só toda essa simplicidade e flexibilidade que eu mencionei, mas também uma performance incrível em relação a outras linguagens semelhantes.

Em um benchmark simples que fiz no meu computador, onde o programa consistia em um for loop de 1 a 1 000 000, e ele escrevia o número no terminal com um Carriege Recursive, o C rodava o programa em 30 milissegundos, e o Nim compilado com os parâmetros release e otimização de velocidade, com o gerenciamento de memória padrão, ele rodava em 40 milissegundos, uma diferença de 10 milissegundos comparado aos segundos, e até minutos, gastos com Python, javascript, go e outras linguagens.

Aqui está o código de ambas as linguagens:

#include <stdio.h>

int main() {
	for (int i = 0; i <= 1000000; i++) {
		printf("%iOK\r", i);
	}
        
	return 0;
}
for i in 1..1000000:
    stdout.write(i,"OK\r")

Conclusão

Isso e outros diversos fatores fazem com que o Nim seja atualmente minha linguagem favorita, e eu gostaria muito que ele ganhasse mais reconhecimento, para ele poder cada vez mais evoluir, para que diversas ferramentas possam ser criadas por ele, e que empresas comecem a adotar a linguagens nas áreas validas para isso.

Caso eu tenha te deixado curioso, ou queira aprender mais sobre a linguagem de maneira mais técnica, recomendo fortemente que visite o site oficial , ou veja este recente vídeo (que me deixou muito feliz) do Fireship sobre a linguagem.

Para finalizar, estou aberto a opiniões, criticas ou dicas. Meu objetivo é apenas evoluir, para ganhar meu lugar no mercado, fundar minha empresa no Canadá, e mudar o mundo, pois foi para isso que eu aprendi a programar.

Até a próxima, pessoal!

Carregando publicação patrocinada...
1