Ich entwerfe eine einfache OO-Programmiersprache.
Es wird statisch typisiert, kompiliert und von einer VM ausgeführt - ähnlich wie Java.
Der Unterschied ist, dass ich OOP nicht so stark betonen möchte. Der Code selbst ähnelt größtenteils C ++ (Klassen, Funktionen und Variablen, die im Dateibereich zulässig sind).
Eines der Dinge, die ich haben muss, ist ein Modulsystem. Ich habe folgendes herausgefunden:
- Jede Datei ist ein Modul (einmal kompiliert) - wie Python
- Programmierer müssen ein Modul mit dem
import
Schlüsselwort importieren , wodurch der Compiler in Standardverzeichnissen und im Dateiverzeichnis nach Modulen sucht (die VM muss dies auch zur Laufzeit tun).
Und jetzt habe ich keine Ahnung, wie ich das Konzept der Submodule und der Modulhierarchie einführen soll.
Eine Möglichkeit besteht beispielsweise darin, von der Verzeichnishierarchie abhängig zu sein, sodass import engine.graphics.renderer
erwartet wird, dass im Arbeitsverzeichnis und in einem Verzeichnis mit dem Namen "Grafik" ein Verzeichnis mit dem Namen "Renderer" gefunden wird.
Was sind die Nachteile eines solchen Designs? Vermisse ich etwas
foo.bar
foo / bar.file oder einem Modulfoo
mit dem Mitglied (auch ein Modul)bar
. Etwas zu beachten@annotations
zum Einbetten solcher Informationen einführen .Antworten:
Werfen Sie einen Blick auf die Paket- / Modulhierarchie / -organisation von Python und insbesondere auf historische Aspekte, wichtige Ergänzungen im Laufe der Jahre, vor allem die neuesten. Wahrscheinlich macht es keinen Sinn, das Rad zu erfinden.
Ich weiß nicht, wie weit Sie mit Ihrer Sprache gehen wollen, z
Ich denke, Java könnte ein weiteres interessantes Beispiel sein. Dinge können auch von Erlang gelernt werden (z . B. /programming/2968914/code-hot-swapping-in-erlang ).
Es gibt eine ganze Reihe von Designproblemen (einige davon wurden oben angesprochen), wenn Sie vorhaben, eines Tages Ihre Programmiersprache als Mainstream zu sehen. Glücklicherweise gibt es da draußen großartige Beispiele.
Einige Anweisungen für das Design von Programmiersprachenmodulen / Paketen / Bibliothekssystemen sollten Folgendes enthalten:
quelle
Nehmen wir zunächst an, Sie ordnen Ihr Namespace-Modell einem anderen Namespace zu, z. B. dem Dateisystem, wie Sie vorgeschlagen haben. Zweitens gehe ich davon aus, dass Module andere Module importieren können. Mit anderen Worten,
engine.graphics.renderer
könnte sehr gut eine Zeile wie enthaltenimport circle.arc
. Das wirft zwei Fragen auf:Wo würde die VM suchen
circle.arc
? Entsprechend dem erwähnten Dateisystem-Mappimg sollte es ein Verzeichnis wie/etc/mylang/modules/circle/arc
(/etc/mylang/modules
das Stammverzeichnis Ihrer Modulstruktur) geben .Wie würde eine Bewerbung verweisen
circle.arc
: durchimport
ingcircle.arc
oderengine.graphics.render.circle.arc
? Das erste würde die Hierarchie "verderben" (wenn nicht ruinieren), dacircle.arc
es sich eindeutig um ein Submodul handeltengine.graphics.renderer
, und das zweite würde bedeuten, dass sich/etc/mylang/modules/engine/graphics/renderer/circle/arc
in Ihrem Dateisystem ein befinden sollte , dascircle.arc
gleichzeitig an zwei Orten platziert wird.Allerdings scheint es mir zu restriktiv, ihn dem Dateisystem zuzuordnen, und sollten Sie sich für den Namespace-Ansatz entscheiden. Ich denke, Module können sich an allen möglichen Orten befinden (sogar Zip-Dateien, wie bereits erwähnt, sogar URLs). Die VM sucht zunächst nach einem Eintrag in einem Index (möglicherweise einer Konfigurationsdatei), der den Namespace den tatsächlichen Modulpositionen zuordnet.
quelle