Engenharia
CM++
A minha própria linguagem de programação. Um compilador completo em C++17 com tipagem estática, agentes bioinspirados e comunicação por sinais. Melhor nota da turma.
Problema
Na cadeira de Técnicas e Linguagens de Programação do IMPTEL, 11ª classe, o desafio era construir um compilador completo para uma linguagem original. Em vez de fazer mais um dialeto académico, criei uma linguagem que trata programas como ecossistemas digitais onde agentes autónomos cooperam e comunicam.
Arquitetura
Pipeline de compilação em C++17, ~1750 linhas no total:
Lexer
Transforma o código-fonte numa sequência de tokens. Reconhece literais, identificadores, palavras-chave (agent, colony, signal, if, while), operadores e símbolos de delimitação. Usa lookahead de 1 caractere.
Parser
Parser recursivo-descendente LL(1). Constrói uma AST com nós para expressões e instruções. Hierarquia de precedência: expression → equality → comparison → term → factor → unary → primary.
Sistema de Tipos
8 tipos estáticos: number, string, boolean, agent, colony, signal, nil, gene.
Analisador Semântico
Percorre a AST validando declarações antes do uso. Gere escopos aninhados com herança.
Runtime
AST Walker com dispatch polimórfico via dynamic_cast. Executa declarações, expressões, controlo de fluxo e o comando signal para output.
Módulo Bio
Simula ecossistemas digitais com Agent (entidade com energia, posição e movimento), Colony (conjunto coordenado de agentes), Signal (comunicação entre agentes) e Environment (o mundo onde existem e interagem).
Exemplo de código
number a = 10;
number b = 20;
signal a + b; // → 30
agent a;
agent b;
number energyA = 50;
number energyB = 80;
signal energyA + energyB; // → 130
Métricas
- CM++: ~1050 linhas C++17 (lexer 226, parser 447, interpreter 211, bio 356)
- Lua Minimal+: ~710 linhas C++17
- Build: CMake, C++17, GCC
- Benchmarks: até 3.4x mais rápido que Lua 5.4 em 10M iterações