Voltar aos projetos

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:

Código Fonte (.clpp) → Lexer → Tokens → Parser → AST → Analisador Semântico → Interpreter → Output

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