Esqueça as linguagens de programação, viva o compilador
Quantas linguagens de programação fala? E acha isso relevante? Na realidade, está a tentar falar com um computador e o hardware entende muito pouco sobre C#, Java, Python ou R. O computador para o qual está a programar compreende apenas uma coisa: linguagem de máquina ou código binário.
1. 0 e 1 ou Hello World
Felizmente, hoje não precisamos saber linguagem de máquina para programar. Podemos escrever o código numa linguagem que é depois traduzida para o nível da máquina. Afinal, escrever “Hello World” é muito mais fácil do que uma sequência de zeros e uns.
Línguas diferentes têm vantagens objetivas e subjetivas diferentes. É assim em todo o mundo. Enquanto o inglês parece adequado para comunicação internacional na aviação comercial, o francês possui o vocabulário certo para expressar amor. No contexto dos computadores, não importa o idioma que escolher, vai precisar de um tradutor. Este tradutor converte o seu trabalho em uns e zeros, e é aí que a mágica acontece.
2. Viva o compilador
Atualmente, o compilador não recebe a atenção que merece. O programador escreve código, o compilador não reclama e o mundo é um lugar simples. A ferramenta faz o que deve fazer, mas ninguém se questiona sobre o que acontece nos bastidores.
O compilador foi inventado por Grace Hopper. Através do compilador conseguimos escrever programas em diferentes linguagens que acabam adaptados a uma infinidade de sistemas binários.
Compiladores criam ou quebram ecossistemas. É o compilador que decide se o seu código pode correr sem problemas em sistemas x86, smartphones ARM ou servidores RISC-V. Graças ao compilador, podemos escrever no nosso idioma favorito e, no final do dia de trabalho, surge um arquivo executável que funciona em diferentes sistemas. Se o compilador for um mau intérprete, traduzindo algoritmos sofisticados em código lento, o hardware ao qual o compilador está ligado ficará comprometido.
3. O trio perfeito
Os compiladores de hoje geralmente adotam a mesma estrutura. São compostos por três módulos: o front-end, a otimização e o back-end. O front-end lê seu código e fornece uma primeira tradução rudimentar. Em seguida, ele passa por uma otimização e, finalmente, o back-end adapta-o exatamente ao formato correto para o sistema para o qual estamos a compilar.
Esta trindade é essencial para o sucesso dos ecossistemas modernos. A modularidade de um compilador moderno significa que só precisamos modificar o front-end quando quisermos introduzir uma nova linguagem de programação num ecossistema existente. Ou, inversamente, um compilador para uma linguagem específica pode ser moldado para uma nova arquitetura binária simplesmente modificando o back-end.
4. O fim da Lei de Moore
A era da Lei de Moore, o reinado de x86 e, por extensão, a arquitetura Von Neumann acabou. Existem limites físicos para a velocidade de processamento e para a densidade do processo de fabrico dos microprocessadores. A solução do lado do hardware é uma arquitetura de computação heterogénea.
Isso significa em parte que usamos a arquitetura certa para cada fim (como ARM para aplicações móveis), mas também que fazemos combinações. Um processador hoje é auxiliado por uma GPU, um DPU e talvez outro FPGA que acelera uma função específica.
5. Compiladores modulares
Mas será fácil programar para esses sistemas heterogéneos com a ajuda dos compiladores? O novo hardware não dará origem imediatamente a um novo idioma para substituir todos os outros. As linguagens existentes permanecerão populares e novas surgirão, mas para serem bem-sucedidas, elas devem ser capazes de lidar com uma grande variedade de hardware. Os compiladores modulares tornarão isso possível e, como tal, merecem um pouco mais de atenção.
Se o seu amor por compiladores é quase tão grande quanto o seu amor por programação? Confira as nossas vagas de emprego ou envie uma inscrição hoje mesmo.