Heim > Artikel > Backend-Entwicklung > Wie implementiert man Bootstrapping in Golang?
So implementieren Sie Bootstrapping in Golang: Installieren Sie zuerst [Go 1.4] oder höher und verwenden Sie dann die vorhandene Go-Toolkette, um eine Basisversion der [Go 1.5]-Toolkette zu erstellen. go_bootstrap] und der Rest der Standardbibliothek und Standardkomponenten.
Golangs Methode zur Implementierung von Bootstrapping:
自举
(Bootstrapping) ist ein solcher Prozess: „Verwenden Sie The.“ Die zu kompilierende Zielprogrammiersprache schreibt ihren Compiler (oder Assembler)“. Im Allgemeinen hat Bootstrapping mehrere Vorteile, wie zum Beispiel:
zum Testen der Sprache, die gebootet werden soll;
unterstützt die Verwendung von normalerweise mehr Write-Compilern für Hochsprachen, die mehr Abstraktionen auf hoher Ebene bereitstellen;
Compiler können auch von Verbesserungen auf Sprachebene profitieren.
Wie bereits erwähnt, hat Google vor einem Jahr damit begonnen, C-Code aus dem Go-Quellbaum zu entfernen. Der Konvertierungsplan ist in 5 Schritte unterteilt:
Phase 1 – Entwickeln Sie einen Übersetzer von der C-Sprache in die Go-Sprache und übersetzen Sie den vorhandenen C-Compiler in die Go-Sprache. Diese Phase macht sich die Tatsache zunutze, dass der ursprüngliche Compiler einige Funktionen, die sich nur schwer in die Go-Sprache portieren lassen, wie Makros, Unions und Zeigerarithmetik, nicht umfassend genutzt hat.
Stufe 2 – Konvertieren Sie den Quellcodebaum des Compilers, um einen Go-Sprachcompiler zu erhalten, der jedoch relativ primitiv und im C-Stil ist.
Stufe 3 – Konvertieren Sie den zuvor erhaltenen Compiler in ein Programm, das den Go-Sprachgewohnheiten entspricht, hauptsächlich durch Identifizieren von Paketen, Hinzufügen von Dokumentation und Unit-Tests.
Stufe 4 – Optimieren Sie den Compiler, lösen Sie das Speichernutzungsproblem des Compilers und der CPU und führen Sie möglicherweise eine Parallelisierung ein. Darüber hinaus wird versucht, eine neue Zwischendarstellung zwischen den heute verwendeten architekturunabhängigen ungeordneten Bäumen (Node*s) und den architekturabhängigen geordneten Listen (Prog*s) einzuführen, mit dem Ziel, die Eliminierungsfähigkeit des Compilers zu verbessern Redundante Optimierungsfunktionen in Situationen wie Nullprüfungen und Grenzprüfungen.
Phase 5 – Ersetzen Sie das Frontend durch die neueste Version von go/parser und go/types.
Russ erwähnte, dass sie auch einige Alternativen in Betracht gezogen hätten, diese jedoch aufgrund verschiedener Faktoren, die vor einem Jahr in diesem Dokument beschrieben wurden, ausgeschlossen wurden.
Go's Bootstrapping
Compiler-Bootstrapping verursacht oft ein „Henne-Ei“-Problem, und es muss eine Möglichkeit bereitgestellt werden, uns zu kompilieren Die zu erstellende Sprache.
Die Situation bei Go ist, dass Sie zum Erstellen von Go 1.5 zunächst Go 1.4 oder höher installieren und dann die vorhandene Go-Toolchain verwenden müssen, um eine Basisversion der Go 1.5-Toolchain zu erstellen. Sobald Sie die Go 1.5-Toolchain kompiliert haben (Go 1.4), können Sie sie zum Erstellen selbst verwenden und darüber hinaus zum Erstellen von go_bootstrap und dem Rest der Standardbibliothek und Standardkomponenten verwenden. Dieser Prozess fügt einen Zwischenschritt hinzu – die resultierende Toolchain wird dann verwendet, um sich selbst zu erstellen, was auf jede zukünftige Go-Version angewendet werden kann.
Um mehr über Gos Plan zur Implementierung von Bootstrapping zu erfahren, interviewte InfoQ Russ.
Das Erreichen des Bootstrapping scheint ein großer Meilenstein für die Go-Sprache zu sein. Warum haben Sie sich in dieser Phase der Sprachentwicklung dazu entschieden? Können Sie das im Detail erklären?
Go ist eine gute Allzwecksprache, aber sie wurde für die Verwendung beim Schreiben umfangreicher, hochgradig gleichzeitiger serverseitiger Software entwickelt, wie sie beispielsweise auf den Servern von Google ausgeführt wird. Wenn Bootstrapping früher implementiert wird, wird der Go-Compiler das erste große Go-Sprachprogramm sein. Dies wird sich negativ auf das Sprachdesign auswirken und uns vom eigentlichen Ziel abbringen.
Es gibt auch einige technische Gründe dafür, Bootstrapping nicht früher zu implementieren, wie z. B. Portabilität, das Kompilieren aus dem Quellcode ist einfacher als Bootstrapping, und wir können auch so früh wie möglich eine stabile Compiler-Implementierung haben.
In welchen spezifischen Bereichen gibt es Ihrer Meinung nach bei der Verwendung von Go zum Erstellen von Go im Vergleich zur Verwendung von C offensichtliche Verbesserungen?
Ken Thompson hat einmal zu mir gesagt, dass sich das Schreiben von Programmen in Go einfacher anfühlt als die Verwendung von C. Ein Grund dafür ist, dass Go mehrere häufige Arten von C-Fehlern beseitigt, wie z. B. baumelnde Zeiger, Speicherlecks, Pufferüberläufe, Stapelüberläufe bei tiefer Rekursion, Missbrauch von void* und unerwartete numerische Konvertierungen.
Die Standard-Go-Toolchain unterstützt Modularität, Unit-Tests und Profiling besser als jede Standard-C-Toolchain, aber was mich am meisten begeistert, ist die Möglichkeit, interne APIs zu ändern oder Refactorings durchzuführen (z. B. Gofix). .
Im Dokument „Go 1.3+ Compiler Overhaul“ beschreiben Sie den 5-stufigen Prozess der Migration eines vorhandenen Compilers von C nach Go. Welche Schritte wurden bisher abgeschlossen? Wann sollen die verbleibenden Schritte abgeschlossen sein?
Für das Go-Projekt war es wichtiger, die Laufzeit der Sprache von C nach Go zu konvertieren, also haben wir dies zuerst getan. Jetzt sind wir wieder beim Compiler.
Aus Dokumentationssicht befinden wir uns derzeit in Phase 2. Der Übersetzer ist vollständig und hat uns bei der Konvertierung der Laufzeit geholfen. Wir wenden dies auf den Compiler an. Wir hoffen, den Übergang zum Go 1.5-Compiler abschließen zu können. Aufräumarbeiten werden in Projekten nach Go 1.5 durchgeführt.
Verwandte Lernempfehlungen: Go-Sprachtutorial
Das obige ist der detaillierte Inhalt vonWie implementiert man Bootstrapping in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!