O Shivyc é um compilador de hobby C escrito no Python 3 que suporta um subconjunto do padrão C11 e gera binários razoavelmente eficientes, incluindo algumas otimizações. O Shivyc também gera mensagens úteis de erro no tempo de compilação.
Esta implementação de um trie é um exemplo do que o Shivyc pode compilar hoje. Para uma lista mais abrangente de recursos, consulte o diretório de teste de recursos.
O Shivyc requer apenas o Python 3.6 ou posterior para compilar o código C. A montagem e a ligação são feitas usando o GNU Binutils e o GLIBC, que você quase certamente já instalou.
Para instalar o Shivyc:
pip3 install shivyc
Para criar, compilar e executar um programa de exemplo:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Para executar os testes:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Para a conveniência daqueles que não estão executando o Linux, o docker/ Directory fornece um DockerFile que configura um ambiente Ubuntu X86-64 Linux com tudo o que é necessário para o Shivyc. Para usar isso, execute:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Isso abrirá uma concha em um ambiente com Shivyc instalado e pronto para uso
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
O executável do Docker Shivyc atualizará ao vivo com quaisquer alterações feitas no diretório Shivyc local.
O Shivyc hoje tem um pré -processador muito limitado que analisa comentários e expande as diretivas #include . Esses recursos são implementados entre lexer.py e preproc.py .
O Shivyc Lexer é implementado principalmente em lexer.py . Além disso, tokens.py contém definições das classes de token usadas no Lexer e token_kinds.py contém instâncias de palavras -chave reconhecidas e tokens de símbolo.
O analisador Shivyc usa técnicas de descida recursiva para toda a análise. Ele é implementado no parser/*.py e cria uma árvore de análise de nós definidos em tree/nodes.py e tree/expr_nodes.py .
Shivyc atravessa a árvore de análise para gerar uma IL personalizada plana (linguagem intermediária). Os comandos para este IL estão em il_cmds/*.py . Os objetos usados para a geração de IL estão em il_gen.py , mas a maior parte do código de geração de IL está na função make_code de cada nó da árvore em tree/*.py .
O Shivyc lê sequencialmente os comandos da IL, convertendo cada um em código de montagem Intel-Format X86-64. O Shivyc realiza a alocação de registro usando o algoritmo de coalescismo de George e Appel (veja as referências abaixo). A funcionalidade geral da geração ASM está em asm_gen.py , mas grande parte do código de geração do ASM está na função make_asm de cada comando IL em il_cmds/*.py .
Pull Pedidos para Shivyc são muito bem -vindos. Um bom lugar para começar é a página de problemas. Todos os problemas rotulados como "Recurso" são tarefas para fazer. Os problemas rotulados como "bug" são informações errôneas individuais em Shivyc. Se você tiver alguma dúvida, sinta -se à vontade para fazer nos comentários da questão relevante ou criar um novo problema rotulado como "Pergunta". Obviamente, adicione os testes para todas as novas funcionalidades.
Muito obrigado aos nossos colaboradores atuais e anteriores: