Kürzlich habe ich ziemlich viel über CPUs und Architekturen gelesen; hauptsächlich Opcodes, integrierte Schaltungen usw. Ich bin seit einigen Jahren ein Python-Entwickler, und ich würde gerne etwas Übung darin bekommen, Maschinencode zu schreiben.
Ich dachte zum Spaß, ich würde ein sehr einfaches Python-Skript in Maschinencode kompilieren, um es zu üben. Das Skript ist wie folgt:
%Vor%Ich schreibe den Compiler in Python, weil ich bei C nicht so gut bin wie bei Python. Ich habe ein wenig nachgeschaut und mir stehen die folgenden Python-Bibliotheken zur Verfügung, die helfen könnten, d. H.
%Vor%Ich muss immer noch die Opcodes für Intel Core i5 finden, aber das sollte einfach sein.
Meine Frage lautet wie folgt:
1) Wie schreibe ich den Opcode in die Datei? Mit anderen Worten, angenommen, der Opcode zum Setzen eines Registers auf den Wert 2 ist 0010 Wie schreibe ich dies als die ersten vier Zahlen in der ersten Ausführungszeile des Programms?
2) Wie sage ich dem OS, entweder OS X oder Ubuntu, das Programm in den physischen Speicher zu laden? Ich nehme an, dass das erste, was ein Compiler tut, Anweisungen für das Betriebssystem auf die resultierende Binärdatei schreibt?
3) Alle Ressourcen, von denen Sie wissen, dass sie mir helfen können, würden mir gefallen.
Das ist ein Projekt, das Sie dort planen. Zusätzlich zum Erlernen, wie ein Compiler funktioniert, müssen Sie auch ladbare Dateiformate wie ELF und jede Menge Informationen zu Betriebssystemdetails lesen.
Ich würde vorschlagen, dass Sie eine Assembly-Datei als Ausgabe Ihres Compilers ausgeben würden. Dann könnten Sie einen vorhandenen Assembler verwenden, um die Datei in Maschinencode umzuwandeln. In der Tat tun dies die meisten C-Compiler (einschließlich GCC) "unter der Oberfläche".
BEARBEITEN: Die Ausgabe eines Compilers oder Assemblers ist normalerweise eine Objektdatei . Dies wird später durch einen Linker mit anderen Objektdateien kombiniert. Das Schreiben der gesamten Werkzeugkette, des Compilers, Assemblers, Linkers und anderer zugehöriger Werkzeuge würde leicht mehrere Mannjahre erfordern. In diesem Licht glaube ich nicht, dass Sie eine einfache Lösung sehen sollten, wie einen existierenden Assembler und Linker als Betrug zu benutzen.
Das Kompilieren von Python ist nicht einfach. Sie könnten pypy mit einem Just-in-Time-Compiler betrachten.
Eine andere Möglichkeit ist es, mit dem Python Bytecode zu beginnen, der in einem .pyc
gespeichert wird. Datei, wenn ein Python-Programm vom Standard-Cpython-Interpreter ausgeführt wird.
Dies hat eine begrenzte Anzahl von Anweisungen, für die Sie Assembly / ausführbaren Code für Ihre CPU generieren müssten.
Beachten Sie, dass Sie auch eine große Menge an Code schreiben müssen, um alle eingebauten Typen und Funktionen zu implementieren!
Tags und Links python compiler-construction