Shivyc est un compilateur de passe-temps C écrit dans Python 3 qui prend en charge un sous-ensemble de la norme C11 et génère des binaires raisonnablement efficaces, y compris certaines optimisations. Shivyc génère également des messages d'erreur de compilation utile.
Cette implémentation d'un Trie est un exemple de ce que Shivyc peut compiler aujourd'hui. Pour une liste plus complète des fonctionnalités, voir le répertoire de test des fonctionnalités.
Shivyc ne nécessite que Python 3.6 ou ultérieure pour compiler le code C. L'assemblage et les liens sont effectués en utilisant les binutilles GNU et GLIBC, que vous avez presque certainement installées.
Pour installer Shivyc:
pip3 install shivyc
Pour créer, compiler et exécuter un exemple de programme:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Pour exécuter les tests:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Pour la commodité de ceux qui ne fonctionnent pas Linux, le docker/ Directory fournit un Dockerfile qui met en place un environnement Linux Ubuntu x86-64 avec tout ce qui est nécessaire pour Shivyc. Pour l'utiliser, exécutez:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Cela ouvrira un shell dans un environnement avec Shivyc installé et prêt à l'emploi avec
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
L'exécutable Docker Shivyc mettra à jour en direct avec toutes les modifications apportées dans votre répertoire Shivyc local.
Shivyc a aujourd'hui un préprocesseur très limité qui annule les commentaires et élargit les directives #include . Ces fonctionnalités sont implémentées entre lexer.py et preproc.py .
Le Shivyc Lexer est implémenté principalement dans lexer.py . De plus, tokens.py contient des définitions des classes de jetons utilisées dans le lexer et token_kinds.py contient des instances de mot-clé et de jetons symboles reconnus.
L'analyseur Shivyc utilise des techniques de descente récursives pour tous les analyses. Il est implémenté dans parser/*.py et crée une arbre d'analyse de nœuds définis dans tree/nodes.py et tree/expr_nodes.py .
Shivyc traverse l'arbre d'analyse pour générer un IL personnalisé plat (langue intermédiaire). Les commandes pour ce Il est dans il_cmds/*.py . Les objets utilisés pour la génération IL sont dans il_gen.py , mais la plupart du code de génération IL se trouve dans la fonction make_code de chaque nœud d'arbre dans tree/*.py .
Shivyc lit séquentiellement les commandes IL, convertissant chacun en code d'assemblage Intel-Format x86-64. Shivyc effectue une allocation de registre à l'aide de l'algorithme de coalescence du registre itéré de George et Appel (voir références ci-dessous). La fonctionnalité générale de génération ASM est dans asm_gen.py , mais une grande partie du code de génération ASM est dans la fonction make_asm de chaque commande IL dans il_cmds/*.py .
Les demandes de traction à Shivyc sont les bienvenues. Un bon point de départ est la page des problèmes. Tous les problèmes étiquetés "fonctionnalité" sont des tâches TODO. Les problèmes étiquetés "Bug" sont des compilations individuelles à Shivyc. Si vous avez des questions, n'hésitez pas à poser dans les commentaires du problème pertinent ou à créer un nouveau problème intitulé "Question". Bien sûr, veuillez ajouter des tests pour toutes les nouvelles fonctionnalités.
Un grand merci à nos contributeurs actuels et passés: