Primeiro, sei que essa é uma pergunta feita por muitos outros programadores antes de mim. Mas não consegui encontrar nenhum recurso utilizável que pudesse me ajudar.
Bem, estou criando uma linguagem de programação chamada "Light". A sintaxe é comparável ao python, mas tem um conceito estrito de orientação a objetos.
Eu fiz um intérprete (em C ++) para essa linguagem ainda, meu problema é como transformar isso em um executável. (Ou simplesmente: como faço para criar um compilador?)
Agradecimentos para sua atenção
PS: Encontrei alguns links para um tutorial muito antigo, mas está em Pascal ...
EDIT: Bem, bem. Agora eu encontrei um tutorial adequado para C ++. Sobre o projeto: Houve algumas mudanças. Agora, o idioma é chamado "Q". (kju Dot).
Respostas:
As duas primeiras etapas de lexing / análise (e análise, dependendo de como está estruturada) podem ser as mesmas. Mas você precisará converter sua representação em uma representação geradora de código. Normalmente, o LLVM é usado por entusiastas, pois é praticamente a única biblioteca geradora de código livre remotamente decente existente.
fonte
ghc
por exemplo, é perfeitamente capaz de produzir executáveis via C. Assim como centenas de outros compiladores baseados em C. Sua religião proíbe que você usepopen(...)
em um compilador? Então você tem que se jogar foragcc
. Quanto ao .NET, ao contrário da JVM, ele é capaz de atender a uma ampla variedade de semânticas, devido a seus recursos inseguros.Se tudo o que você realmente deseja é um executável, você pode anexar o script ao final de um executável de intérprete e executá-lo.
Consulte: /programming/5795446/appending-data-to-an-exe
Como alternativa, você pode fazer com que o intérprete carregue o código de um arquivo no mesmo diretório que o intérprete e obtenha praticamente o mesmo resultado, apenas com vários arquivos.
Um compilador verdadeiro converteria o código em outro idioma e usaria o compilador para esse idioma. Mas se você apenas deseja distribuir executáveis, não há necessidade de fazer isso.
fonte
Você também pode considerar usar System.Reflection.Emit no .NET runtime para gerar um executável .NET. Isso lhe dará acesso a um ambiente orientado a objetos existente que já resolveu alguns problemas para você, e o exe resultante pode ser independente da plataforma. O tempo de execução compilará o código intermediário no .exe para o código da máquina, conforme necessário, portanto o desempenho deve ser comparável ao que você obteria da compilação direta no código nativo.
fonte
Você está perguntando sobre a técnica conhecida como "compilador de rastreamento": o intérprete reúne informações sobre a execução do código e cria incrementalmente código de baixo nível usando dados coletados.
https://en.wikipedia.org/wiki/Tracing_just-in-time_compilation
https://stefan-marr.de/papers/oopsla-marr-ducasse-meta-tracing-vs-partial-evaluation/
A diferença do JIT clássico é o fato de os dados de rastreamento coletados e o código compilado serem preservados a cada execução de um programa, o que fornece não apenas código de máquina executável, mas também otimização de dados reais (ou de treinamento). A primeira passagem é um conjunto de testes, que deve passar em todas as ramificações do programa, para criar código para cada parte do seu programa. Os próximos são programas executados com dados reais (uso de produção), que coletam e aplicam otimizações (coisas como ordenação de ramificações nos casos mais frequentemente usados).
Esse método é muito mais complexo de implementar do que um esquema clássico de construção do compilador, por isso não é usado com freqüência e é complexo encontrar um bom conjunto de tutoriais sobre como fazer o mesmo compilador.
fonte