- Publicado em
Por que ainda vale a pena aprender C e Assembly?
- Autor
- Nome
- Taylor Hoffmann
- GitHub
- @TaylorHo
![Low Level programming](/static/images/Blog/low-level.jpeg)
Recentemente comecei a ler "Programação em Baixo Nível: C, Assembly e Execução de Programas na Arquitetura Intel 64", para aprofundar os conhecimentos em programação de baixo nível. Excelente livro, inclusive.
E, enquanto lia, ouvi muitas pessoas ao meu entorno comentarem sobre "Assembly é arcaico, não faz sentido aprender", "Por que aprender C se eu posso usar Python, 1000x mais fácil?" ou coisas do tipo. E a verdade é que sim, programação em baixo nível vale muito a pena, e vou relatar aqui o porquê disso.
Mas afinal, o que é programação de baixo nível?
As linguagens de programação de baixo nível são aquelas que estão diretamente relacionadas com a arquitetura do computador. Dessa forma, essas linguagens provém pouca ou nenhuma abstração entre o código e o conjunto de instruções interpretadas pelo processador. Como notórios exemplos, temos Assembly e binário.
Já uma linguagem de alto nível é aquela que conta com altos nível de abstração, se aproximando mais da linguagem humana - e não linguagem de máquina. Alguns exemplos são Python, Javascript e Flutter.
Para entender mais, segue o artigo abaixo.
Entenda o que é programação de baixo e alto nível.
wikipedia.org
![wikipedia.org](https://en.wikipedia.org/static/images/project-logos/enwiki-2x.png)
Customização de Software
Um dos principais motivos pelos quais programação em C e Assembly é útil, é no caso de Softwares Customizados e de alto desempenho - justamente por essa "stack de baixo nível" disponibilizar todos os recursos necessários para fornecer um desempenho formidável.
Posso explicar isso com um exemplo.
Recentemente estive participando de um projeto criado em Node.js, criado principalmente para rodar JavaScript no backend. O Node é desenvolvido em cima da Runtime Javascript V8, do Google. E, por mais incrível que o Node seja, o motor Javascript V8 atua com um limite de 1GB de alocação de memória RAM para sistemas de 32 bits e 2GB de alocação de memória RAM para sistemas de 64 bits. O problema disso, é que sistemas criados com Node vão ter um limite de capacidade de processamento.
Dessa forma, para realizar funções mais avançadas, que requerem um maior desempenho e/ou consumo de recursos, ainda é necessário utilizar linguagens como Java (considerada uma linguagem de "médio nível") ou linguagens de baixo nível.
Outro ponto interessante a respeito de desempenho, é que a grande maioria das linguagens de programação são criadas para ter uma alocação de memória mais genérica o possível. Algo que resulte em um desempenho bom para todos os métodos, funções, etc., mas que dificilmente atente a uma necessidade extremamente específica.
Dessa forma "genérica" de alocação de memória, muitas vezes a execução dos programas em linguagens de alto nível não é suficientemente otimizada. E é aí que ter o controle total sobre alocação de memória e recursos vem a calhar - aliás, essa parte é feita com Assembly.
Entendendo a memória e alocação dela com o uso de Assembly
blog.ironlinux.com.br
![blog.ironlinux.com.br](https://blog.ironlinux.com.br/images/blog-posts/uploads/2021/03/explicando-melhor-a-arquitetura-mvc2_hu3a850a5680fd55652c4984b0dad2fe9b_1002316_555x294_resize_q100_h2_lanczos_2.webp)
Desempenho e otimizações
Outro ótimo exemplo é de quando resolvi me aventurar em Machine Learning e Inteligência Artificial. A grande maioria das pessoas que iniciam nesse universo de ML/IA começa por Python e, como eu já era familiar com a linguagem, foi muito fácil. O grande problema é que a execução dos algoritmos de aprendizado de máquina demoravam MUITO para serem concluídos.
Insatisfeito com esse desempenho, implementei o mesmo algoritmo em C, realizando uma melhor alocação de memória e recursos com Assembly, e o desempenho foi quase 70% melhor - 68%, para ser mais exato.
Com certeza aplicar esse tipo de algoritmos dessa forma é mais difícil mas, para sistemas mais avançados e algoritmos de ML que requerem um maior desempenho e consumo de recursos, o esforço vale a pena.
Mercado de trabalho
Além dos dois motivos que citei, o mercado de trabalho é outro grande ponto importante. Cada vez menos pessoas se interessam por C e - principalmente - Assembly. E, apesar disso, existem muitos - muitos mesmo - sistemas legados, que ainda funcionam com essas tecnologias e que, por se tratarem de sistemas legados, precisam constantemente de melhorias e ajustes.
Dessa forma, vagas para programadores Assembly costumam pagar várias vezes mais que vagas para programadores Node, Java, Flutter, PHP e tantos outros.
Conclusão
Além dos pontos citados, ainda existem vários outros que valem a pena serem levados em consideração, mas esses são os que julgo mais importantes. Recomendo à todos que se aprofundem em programação de baixo nível, se não for para trabalhar com isso, que seja apenas pelo conhecimento, pois entender como as coisas funcionam em sua base muda sua visão sobre sistemas como um todo. Não é à toa que C é a primeira linguagem ensinada nas faculdades, apesar de sua complexidade.
E apesar de tudo o que foi dito, atenção:
Aprender ou não programação de baixo nível depende muito dos seus objetivos.
A grande maioria dos programadores não se aprofunda em programação de baixo nível, e mesmo assim se dão muito bem em suas carreiras. Tudo depende de seus obejtivos, pessoais e profissionais.
Novamente recomendo a leitura de "Programação em Baixo Nível: C, Assembly e Execução de Programas na Arquitetura Intel 64", para aprofundar os conhecimentos em programação de baixo nível, vale muito a pena.
Obrigado por ler até aqui!