DEV Community

Alex Sandro Garzão
Alex Sandro Garzão

Posted on • Updated on

Como nasceu meu interesse por compiladores

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. No manual do TK existiam alguns poucos trechos de código em BASIC não estruturado. 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 e 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", 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 e Assembly. 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, 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 e um Montador Assembly.

Após vários testes a ficha começou a cair. Utilizando um utilitário do DOS (o Debug) 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 e deveria poder ser executado no DOS 3.1 em um lendário 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.

Top comments (0)