Heim >Web-Frontend >CSS-Tutorial >Erstellen wir eine winzige Programmiersprache
Möglicherweise sind Sie bereits mit einer oder mehreren Programmiersprachen vertraut. Aber haben Sie jemals darüber nachgedacht, wie Sie Ihre eigene Programmiersprache erstellen können? Ich meine:
Eine Programmiersprache ist eine Reihe von Regeln, die Strings in verschiedene Maschinencodeausgänge umwandeln.
Kurz gesagt, eine Programmiersprache ist nur eine Reihe vordefinierter Regeln. Um es nützlich zu machen, benötigen Sie etwas, das diese Regeln verstehen kann, z. B. Compiler , Dolmetscher usw. So können wir einfach einige Regeln definieren und dann, damit es funktioniert, ein Programm schreiben, das diese Regeln mit einer vorhandenen Programmiersprache verstehen kann, die zu unserem Dolmetscher wird.
Der Compiler wandelt den Code in den Maschinencode um, den der Prozessor ausführen kann (z. B. ein C -Compiler).
Der Interpreter durchläuft die Programmlinie nach Zeile und führt jeden Befehl aus.
Willst du es versuchen? Lassen Sie uns eine super einfache Programmiersprache erstellen, die die Magenta -Ausgabe in der Konsole ausgibt. Wir nennen es Magenta .
Ich werde Node.js verwenden, aber Sie können in jeder Sprache lernen und das Konzept bleibt gleich. Lassen Sie mich zunächst eine Index.js -Datei erstellen und richten Sie sie ein.
Klasse Magenta { Konstruktor (Codes) { this.codes = codes; } laufen() { console.log (this.codes); } } // Derzeit speichern wir den Code in einer Zeichenfolgenvariablen namens "Codes" // später werden wir den Code aus der Datei const codes = "print" Hallo Welt "lesen Drucken Sie "Hallo noch einmal" `; const magenta = new Magenta (Codes); Magenta.run ();
Was wir hier tun, ist eine Klasse namens Magenta. Diese Klasse definiert und initialisiert ein Objekt, das für die Aufzeichnung von Text in der Konsole mit einem beliebigen Text verantwortlich ist, den wir über die Codes -Variable angeben. Derzeit haben wir die Codes -Variablen direkt mit mehreren "Hallo" -Meldungen in der Datei definiert.
OK, jetzt müssen wir einen sogenannten lexikalischen Analysator erstellen.
OK, lass uns zuerst über Englisch sprechen. Bitte beachten Sie die folgenden Sätze:
Geht es dir gut?
Hier ist "Hallo" ein Gruß, "ein ergänzender Ton und" Sie "ein Personalpronomen. Wir haben am Ende ein Fragezeichen ("?"). Wir können jeden Satz oder jede Phrase in viele grammatikalische Komponenten wie diese unterteilen. Eine andere Möglichkeit, diese Teile zu unterscheiden, besteht darin, sie in kleine Noten zu teilen. Das Programm, das Text in Tags unterteilt, ist unser lexikalischer Analysator .
Da unsere Sprache sehr klein ist, hat sie nur zwei Arten von Tags mit jeweils einem Wert:
Wir können regelmäßige Ausdrücke verwenden, um Tags aus Codes zu extrahieren, aber die Leistung wird sehr langsam sein. Ein besserer Ansatz besteht darin, jedes Zeichen der Codezeichenfolge durchzuschleiten und das Tag zu erhalten. Erstellen wir also eine Tokenize -Methode in der Magenta -Klasse - dies wird unser lexikalischer Analysator sein.
Vollständiger Code
`` javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { const length = this.codes.length; // pos 用于跟踪当前位置/索引let pos = 0; let tokens = []; const BUILT_IN_KEYWORDS = ["print"]; // 变量/关键字允许的字符const varChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; while (pos <code>); } } return tokens; } parse(tokens) { const len = tokens.length; let pos = 0; while (pos ); ;
const codes = print "hello world" print "hello again"
;
### Definieren Sie Regeln und Syntax Wir möchten feststellen, ob unsere Code -Bestellung mit einer Regel oder einer Syntax übereinstimmt. Aber zuerst müssen wir definieren, was diese Regeln und Syntax sind. Da unsere Sprache sehr klein ist, hat sie nur eine einfache Syntax, nämlich das Druckenschlüsselwort, gefolgt von einer Zeichenfolge.
Schlüsselwort: Druckzeichenfolge
<code>因此,让我们创建一个解析方法,该方法循环遍历我们的标记,并查看我们是否形成了有效的语法。如果是这样,它将采取必要的措施。 ```javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { /* tokenizer 的先前代码*/ } parse(tokens) { const len = tokens.length; let pos = 0; while (pos </code>
Sehen! Wir haben bereits eine Arbeitssprache!
Ok, aber den Code in eine Zeichenfolgenvariable zu legen macht nicht so Spaß. Lassen Sie uns also unseren Magenta -Code in eine Datei namens Code.M. Auf diese Weise können wir den Magenta -Code von der Compiler -Logik trennen. Wir verwenden .M als Dateierweiterung, um anzuzeigen, dass die Datei Code in unserer Sprache enthält.
Lassen Sie uns den Code aus dieser Datei lesen:
// Dateisystemmodul const fs = required ('fs'); // Das Pfadmodul importieren, um die Pfadverbindung const path = forderung zu erleichtern ('Pfad'); Klasse Magenta { Konstruktor (Codes) { this.codes = codes; } tokenize () { /* Vorheriger Code für Tokenizer*/ } analysieren (Token) { /* vorheriger Code der Parse -Methode*/ } laufen() { /* Vorheriger Code der Auslaufmethode*/ } } // Lesen Sie die Datei code.m // Einige Textredakteure verwenden \ r \ n als neue Zeile anstelle von \ n, sodass wir \ r löschen const codes = fs .ReadFilesync (Path.Join (__ Dirname, 'Code.m'), 'Utf8') .ToString () .Replace (/\ r/g, ""); const magenta = new Magenta (Codes); Magenta.run ();
Auf diese Weise haben wir erfolgreich eine Mini -Programmiersprache von Grund auf neu erstellt. Sehen Sie, dass Programmiersprachen so einfach sein können, ein bestimmtes Ding zu vervollständigen. Natürlich ist es unwahrscheinlich, dass Sprachen wie Magenta hier nützlich sein können, um Teil eines beliebten Frameworks zu sein, aber jetzt haben Sie eine Vorstellung davon, was es braucht, um eine Programmiersprache zu erstellen.
Der Himmel ist die Grenze. Wenn Sie tiefer graben möchten, versuchen Sie, dem von mir erstellten Video zu folgen, in dem ein fortgeschritteneres Beispiel vorgestellt wird. In diesem Video zeige ich auch, wie Sie Ihrer Sprache Variablen hinzufügen.
Das obige ist der detaillierte Inhalt vonErstellen wir eine winzige Programmiersprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!