Wir schreiben unsere Programmiersprache, Teil 4: Darstellung von Strukturen und Klassen, Generierung von Allokatoren

Bild

Guten Tag an alle, die beschlossen haben, meinen nächsten Artikel zu lesen.

Zunächst poste ich Links zu den vorherigen Teilen:
Teil 1: Schreiben einer Sprach-VM
Teil 2: Zwischenpräsentation von Programmen
Teil 3: Übersetzerarchitektur. Analyse von Sprachstrukturen und mathematischen Ausdrücken

Es lohnt sich auch, Links zum Repository und zu einem kleinen Übersichtsartikel zu veröffentlichen, in dem ich die geleistete Arbeit in ihrer Gesamtheit kurz beschrieben habe.

Im letzten Artikel habe ich die Erstellung eines Übersetzers aus einer mehr oder weniger hohen Programmiersprache in eine Zwischendarstellung und eine weitere Zusammenstellung der Anwendung beschrieben.

Jetzt stehen wir vor der Aufgabe, der Sprache Strukturen und Klassen hinzuzufügen, damit sie die Funktionalität moderner Analoga besitzt. Dieser Artikel enthält nicht den beschriebenen Code
Funktionalität seit es ist viel davon, es ist ziemlich langweilig und nicht jeder wird daran interessiert sein, sich damit zu beschäftigen. Nur Theorie. Und ein paar Bilder.

Beginnen wir mit dem Erstellen ...


Klassenansicht


Es lohnt sich, damit zu beginnen, dass jede Struktur als Array dargestellt werden kann. Der Index eines Array-Elements kann einer bestimmten Klassenvariablen oder ihrer Methode zugeordnet werden.

Betrachten Sie ein einfaches Codebeispiel (natürlich auf Mash):
Bild

Hier ist ein einfaches Beispiel für eine Klasse, die Kopien der Werte von a und b speichert, die im Konstruktor an sie übergeben werden. Es hat auch einen Destruktor und eine Summierungsfunktion, die die Summe von a und b zurückgibt.
In der Zwischendarstellung gibt es jedoch keine OOP, insbesondere auf VM-Ebene.
Wenn wir etwas genauer hinschauen, um zu sehen, was MyClass tatsächlich ist, sehen wir das folgende Bild:
Bild

Großartig. Der Übersetzer verwandelt unsere Struktur durch einfache Manipulationen und Zauber in ein einfaches Array.

Dynamische Eingabe für Klassen


Es lohnt sich auch, über die schnelle dynamische Typeinstellung für Klassen und die entsprechende Arbeit mit ihnen nachzudenken, da dies in Sprachen mit dynamischer Typisierung ein sehr wichtiger Punkt ist.

Die einfachste und effektivste Lösung ist eine virtuelle Tabelle mit Klassenkomponenten. Das heißt, Im Übersetzer können Sie die Verarbeitung aller Klassendefinitionen implementieren und eine Liste der Namen und Methoden von Klassenvariablen erstellen. Dementsprechend seit Unsere Klassen werden in Form von Arrays dargestellt - jeder Name aus der Liste ist mit einem Index vergleichbar. Wenn Sie die Liste der Namen ausfüllen, können Sie die Größe des Arrays für jede Klasse angeben, um die Speicherzuweisung wirtschaftlicher zu gestalten.

Basisklassenzuweiser


Um eine Klasse mit einer virtuellen Methodentabelle verwenden zu können, müssen Sie neben der einfachen Zuweisung von Speicher diese Tabelle mit Zeigern auf die Einstiegspunkte für die Klassenmethoden füllen.

Eine einfache und funktionierende Methode besteht darin, für jede Klasse einen Allokator zu generieren. Dies ist eine einfache Methode, die Speicher für ein Array der Klassenstruktur zuweist, es teilweise füllt und einen Zeiger auf die Klasse zurückgibt.

Allokatoren werden aufgerufen, wenn eine Instanz der Klasse erstellt wird, d. H. Im obigen Beispiel wird der Anruf in der 24. Zeile "Neue MyClass (10, 20)" getätigt. Nach dem Allokator können Sie den Konstruktor der Klasse aufrufen. In Mash wird der Konstruktor aufgerufen, wenn das neue Konstrukt Klammern (...) nach dem Klassennamen enthält.

Selbstbeobachtung


Es ist möglich, dass nicht jeder mit dieser Definition vertraut ist, aber viele sind darauf gestoßen.
Introspektion - Die Definition des Objekttyps, mit dem während der Codeausführung gearbeitet wird. Ein Beispiel ist typeof () in demselben JavaScript.


Maische hat volle Selbstbeobachtung, d.h. für einfache Datentypen und für Klassen.
Hier sind ohne weiteres einige Codebeispiele:
Bild

Und für die Klasse:
Bild

Die Introspektion für Klassen wird implementiert, indem dem Feld jeder Klasse ein Typ hinzugefügt wird - ein Zeiger auf ihren Typ.

Fertigstellung


Ich habe versucht, in einfacher Sprache zu erklären, wie die Arbeit mit Klassen in meinem Mash-Übersetzer organisiert ist. Eine ähnliche Technologie ist auch vielen anderen Sprachen mit dynamischer Typisierung inhärent.

Ich hoffe, Sie finden diesen Artikel interessant. Vielen Dank, dass Sie es bis zum Ende gelesen haben. Im Moment war dies vielleicht mein letzter Artikel über die Erstellung der Mash-Sprache (solange ich die JIT-Kompilierung nicht beherrsche). Meine nachfolgenden Artikel werden andere Aspekte des Projekts berücksichtigen oder sich überhaupt auf andere Themen beziehen.

Source: https://habr.com/ru/post/de436224/


All Articles