Como nasceu meu interesse por compiladores
Tags: compiling, beginners, programming
Published: 2023-12-12 23:36:44

Para poder explicar como nasceu meu interesse (diria até paixão) por compiladores, vou ter que falar um pouco sobre como iniciei na área. Por enquanto vou me limitar a abordar apenas o meu primeiro projeto envolvendo compiladores.

## Como iniciei na área

Meu primeiro contato com programação foi em meados de 1985, em um [TK90X](https://pt.wikipedia.org/wiki/TK-90X). No manual do TK existiam alguns poucos trechos de código em [BASIC não estruturado](https://en.wikipedia.org/wiki/BASIC#Unstructured_BASIC). Eu digitava alguns trechos, fazia pequenas alterações e assim fui entendendo o que aqueles comandos estranhos (IF, FOR, GOTO, GOSUB) faziam "na prática".

Em 1990 iniciei meu curso no segundo grau de Tecnólogo em Processamento de Dados. Foi quando comecei a programar em [PASCAL](https://en.wikipedia.org/wiki/Pascal_(programming_language)) e [COBOL](https://en.wikipedia.org/wiki/COBOL). Mas, apesar de estar fascinado com tantas novidades, tinha uma coisa que me intrigava: como o computador entendia aquelas linhas escritas em PASCAL e COBOL? Eu precisava usar um tal de ["compilador"](https://en.wikipedia.org/wiki/Compiler), e este sim era um projeto que me fascinava.

Como eu sempre tive interesse em saber como as coisas funcionam "por debaixo do capô", obtive algumas dicas com um professor e decidi estudar [C](https://en.wikipedia.org/wiki/C_(programming_language)) e [Assembly](https://en.wikipedia.org/wiki/Assembly_language). O objetivo era audacioso na época: criar uma nova linguagem de programação e, consequentemente, um compilador.

## Dino

Convenci um colega (Pepe) a embarcar neste projeto, e assim nasceu o meu primeiro projeto na área de linguagens e compiladores. Dino era uma alegoria à Dinossauro, porque a proposta desta nova linguagem era uma mistura de [Clipper](https://en.wikipedia.org/wiki/Clipper_(programming_language)), C e Pascal (tudo junto e misturado). Era uma linguagem rudimentar e grotesca, mas a gente achava fantástica.

Como não tínhamos acesso a Internet (o ano era 1991) e a gente não tinha acesso a livros (nem a biblioteca da escola tinha bons livros na época), o caminho foi bem árduo no início. Foi literalmente "tentativa e erro" usando alguns poucos exemplos em [Assembly](https://pt.wikipedia.org/wiki/Linguagem_assembly) e um [Montador Assembly](https://pt.wikipedia.org/wiki/Linguagem_assembly#Montador).

Após vários testes a ficha começou a cair. Utilizando um utilitário do [DOS](https://en.wikipedia.org/wiki/Disk_operating_system) (o [Debug] (https://pt.wikipedia.org/wiki/Debug_%28comando%29)) conseguimos identificar padrões para determinados trechos de código assembly e seu equivalente em código de máquina. Neste ponto já tínhamos entendido o necessário para realizar a tradução para código de máquina.

Para definir o que seria a primeira entrega do projeto, utilizamos como base o exemplo mais simples da maioria das linguagens conhecidas. A primeira entrega seria termos um compilador que conseguisse ler um "Hello world!" escrito em Dino (como o exemplo abaixo) e gerar o código de máquina equivalente. Este código de máquina deveria ser armazenado em um arquivo executável [COM](https://en.wikipedia.org/wiki/COM_file) e deveria poder ser executado no DOS 3.1 em um lendário [XT](https://pt.wikipedia.org/wiki/IBM_Personal_Computer_XT).

`Write "Hello world!"`

Este primeiro passo trouxe vários desafios. Como sempre tive em mente a ideia de "começar pequeno", o foco desta primeira entrega foi fazer o parser e gerar um código executável correto, deixando melhorias para um próximo momento. Implementamos um parser bem rudimentar, escrito em C, que conseguia ler códigos escritos em Dino (como o exemplo acima) e gerar um arquivo COM que continha o código de máquina necessário para imprimir cada caractere na tela. Depois de estabilizada (e refatorada) a primeira entrega, partimos para laços de repetição, entrada de dados simples, cálculos simples (sem precedência de operadores), entre outros.

O projeto evoluiu bastante, até porque motivação a gente tinha de sobra. Mas paramos quando a gente entendeu que todos os desafios tinham sido vencidos.