Shivyc ist ein in Python 3 geschriebener Hobby -C -Compiler, der eine Untergruppe des C11 -Standards unterstützt und einigermaßen effiziente Binärdateien erzeugt, einschließlich einiger Optimierungen. Shivyc generiert auch hilfreiche Fehlermeldungen für Kompilierzeit.
Diese Implementierung eines Tries ist ein Beispiel dafür, was Shivyc heute kompilieren kann. Eine umfassendere Liste von Funktionen finden Sie im Funktionstestverzeichnis.
Shivyc benötigt nur Python 3.6 oder höher, um C -Code zu kompilieren. Das Montieren und Verknüpfen erfolgt mit den Gnu Binutils und GLIBC, die Sie mit ziemlicher Sicherheit bereits installiert haben.
Um Shivyc zu installieren:
pip3 install shivyc
Erstellen, Kompilieren und Ausführen eines Beispielprogramms:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Um die Tests durchzuführen:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Für die Bequemlichkeit derjenigen, die nicht Linux ausgeführt werden, bietet das docker/ Verzeichnis eine Dockerfile, die eine X86-64 Linux Ubuntu-Umgebung mit allem, was für Shivyc erforderlich ist, einsetzt. Um dies zu verwenden, rennen Sie:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Dadurch wird eine Shell in einer Umgebung mit installiertem und serienfertigem Shivyc geöffnet
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
Die ausführbare Docker Shivyc -Datei wird live mit allen Änderungen in Ihrem örtlichen Shivyc -Verzeichnis aktualisieren.
Shivyc hat heute einen sehr begrenzten Präprozessor, der Kommentare auszeichnet und #include -Richtlinien erweitert. Diese Funktionen werden zwischen lexer.py und preproc.py implementiert.
Der Shivyc Lexer wird hauptsächlich in lexer.py implementiert. Zusätzlich enthält tokens.py Definitionen der Token -Klassen, die in Lexer und token_kinds.py verwendet werden, Instanzen von anerkanntem Schlüsselwort und Symbol -Token.
Der Shivyc -Parser verwendet rekursive Abstiegstechniken für alle Parsen. Es ist tree/expr_nodes.py parser/*.py tree/nodes.py
Shivyc durchquert den Parse Tree, um eine flache IL -IL (Zwischensprache) zu erzeugen. Die Befehle für diese IL sind in il_cmds/*.py . Objekte, die für die IL -Erzeugung verwendet werden, sind in il_gen.py , aber der größte Teil des IL -Generierungscodes befindet sich in der Funktion make_code jedes Baumknotens im tree/*.py .
Shivyc liest nacheinander die IL-Befehle und konvertiert jeweils in Intel-Format X86-64-Assembler-Code. Shivyc führt die Registerzuweisung mit dem iterierten Register -Koalescing -Algorithmus von George und Appel aus (siehe Referenzen unten). Die allgemeine Funktionalität der ASM -Generierung ist in asm_gen.py , aber ein Großteil des ASM -Generierungscodes befindet sich in der Funktion make_asm jedes IL in il_cmds/*.py .
Anfragen nach Shivyc sind sehr willkommen. Ein guter Ausgangspunkt ist die Seite der Probleme. Alle Probleme mit der Bezeichnung "Feature" sind Todo -Aufgaben. Probleme, die als "Fehler" bezeichnet werden, sind individuelle Missverständnisse in Shivyc. Wenn Sie Fragen haben, können Sie sich in den Kommentaren des entsprechenden Problems gerne stellen oder ein neues Problem mit der Bezeichnung "Frage" erstellen. Natürlich fügen Sie Test (en) für alle neuen Funktionen hinzu.
Vielen Dank an unsere aktuellen und vergangenen Mitwirkenden: