██╗██████╗ ███████╗██████╗ ██╗ █████╗ ███████╗
     ██║██╔══██╗╚══███╔╝██╔══██╗██║██╔══██╗██╔════╝
     ██║██████╔╝  ███╔╝ ██║  ██║██║███████║███████╗
██   ██║██╔═══╝  ███╔╝  ██║  ██║██║██╔══██║╚════██║
╚█████╔╝██║     ███████╗██████╔╝██║██║  ██║███████║
 ╚════╝ ╚═╝     ╚══════╝╚═════╝ ╚═╝╚═╝  ╚═╝╚══════╝   
⠀⠀
    

JavaCompiler: O Projeto Final de Compiladores

Durante o semestre de Compiladores na faculdade, tive a oportunidade de desenvolver um projeto final que consolidou todo o conhecimento teórico adquirido em sala de aula. Junto com dois colegas, criamos o JavaCompiler, um compilador completo para uma linguagem própria desenvolvida em Java.

O Desafio Acadêmico

O projeto final da matéria exigia a implementação de todas as fases de um compilador: análise léxica, sintática, semântica e geração de código. Era uma oportunidade única de aplicar na prática conceitos que até então só conhecíamos teoricamente.

A proposta era criar uma linguagem própria com sintaxe bem definida e implementar um compilador que pudesse traduzir código-fonte dessa linguagem para Java, permitindo sua execução.

A Linguagem Desenvolvida

Criamos uma linguagem com sintaxe inspirada em italiano, mantendo uma estrutura familiar para programadores:

funzione nomeFuncao() {
    carattere << "Olá mundo";
    leggere xD "Digite algo" variavel;
    se (variavel == "teste") {
        carattere << "Funcionou!";
    }
    fermare
}

A linguagem suporta:

  • Declaração de funções com funzione
  • Comandos de entrada e saída (leggere e carattere)
  • Estruturas condicionais (se e altrimenti)
  • Loops (mentre e per)
  • Tipos de dados básicos (intero, galleggiante, stringa, booleano)

Arquitetura do Compilador

O projeto implementa uma arquitetura tradicional de compilador:

Análise Léxica: Converte o código-fonte em tokens, identificando palavras-chave, identificadores, números e símbolos especiais.

Análise Sintática: Verifica se o código segue a gramática definida da linguagem, construindo uma árvore sintática.

Análise Semântica: Valida tipos, declarações de variáveis e chamadas de funções, garantindo a correção semântica do programa.

Geração de Código: Traduz o código-fonte para Java equivalente, mantendo a lógica original do programa.

Funcionalidades Implementadas

Além do compilador básico, desenvolvemos um servidor HTTP que permite compilar código via API REST. Isso facilita o teste e demonstração do projeto, permitindo que outros possam experimentar a linguagem sem precisar configurar o ambiente local.

O servidor aceita requisições POST para /compile com o código-fonte no corpo da requisição e retorna o código Java gerado.

Desafios e Aprendizados

O desenvolvimento deste projeto trouxe vários desafios técnicos e acadêmicos:

  1. Complexidade das fases: Cada etapa do compilador tem suas particularidades e requer atenção aos detalhes
  2. Trabalho em equipe: Coordenar o desenvolvimento entre três pessoas exigiu organização e comunicação eficiente
  3. Documentação: Manter documentação clara foi essencial para o entendimento e manutenção do código
  4. Testes: Validar o funcionamento correto do compilador com diferentes tipos de código

Resultados Obtidos

O projeto resultou em um compilador funcional que demonstra os conceitos fundamentais de compilação. A linguagem desenvolvida, apesar de simples, possui características suficientes para ilustrar os desafios enfrentados na criação de linguagens de programação.

O código está bem estruturado e documentado, facilitando a compreensão e possível extensão futura. A implementação do servidor HTTP adiciona uma camada de praticidade ao projeto.

Reflexões sobre o Processo

Este projeto final foi mais do que uma avaliação acadêmica. Foi uma oportunidade de consolidar conhecimentos teóricos através da prática, desenvolvendo habilidades importantes como trabalho em equipe, organização de código e documentação técnica.

A experiência de criar uma linguagem própria e implementar seu compilador proporcionou uma visão mais profunda sobre como funcionam as ferramentas que usamos diariamente como desenvolvedores.

Acesso ao Projeto

O código completo está disponível no repositório no GitHub, incluindo instruções de compilação, exemplos de uso e documentação detalhada da gramática da linguagem.

Para quem tem interesse em compiladores ou quer entender melhor como funcionam as linguagens de programação, o projeto serve como uma excelente referência prática dos conceitos estudados em sala de aula.

j