Linearer Scan-Registerallokator: Umgang mit Lebensdauerlücken

2025-08-26
Linearer Scan-Registerallokator: Umgang mit Lebensdauerlücken

Dieser Beitrag beschreibt Verbesserungen am linearen Scan-Registerallokationsalgorithmus zur Behandlung von Lebensdauerlücken. Der Autor erklärt, wie diese Lücken entstehen, indem der Kontrollflussgraph auf eine lineare Anweisungsfolge reduziert wird, was zu Diskontinuitäten in den Lebensdauern virtueller Register führt. Die Lösung besteht darin, die Intervall-Datenstruktur so zu modifizieren, dass mehrere disjunkte Bereiche unterstützt werden, wodurch diese Lücken identifiziert und genutzt werden können. Der lineare Scan-Algorithmus wird dann angepasst, um diese Lücken bei der Registerzuweisung zu berücksichtigen, was die Registerauslastung verbessert. Dies verbessert die Fähigkeit des Compilers, Registerressourcen zu nutzen, und steigert letztendlich die Codeleistung.

Mehr lesen

Sicherer Umgang mit snprintf: Pufferüberläufe vermeiden

2025-08-19
Sicherer Umgang mit snprintf: Pufferüberläufe vermeiden

Dieser Artikel hebt ein wenig bekanntes Feature der Funktion `snprintf` hervor: die Möglichkeit, die benötigte Puffergröße vor der Formatierung zu bestimmen und so Pufferüberläufe zu vermeiden. Durch zweimaligen Aufruf von `snprintf` – einmal mit `NULL` und 0, um die Größe zu ermitteln, und dann mit einem korrekt allozierten Puffer – wird die Notwendigkeit manueller Puffergrößenberechnungen eliminiert. Der Autor empfiehlt außerdem eine leichtgewichtige Header-only-Bibliothek für einfachere Verwendung.

Mehr lesen
Entwicklung Pufferüberlauf

Ein 300-Zeilen-Python-Compiler: Closure-Konvertierung erklärt

2025-08-11
Ein 300-Zeilen-Python-Compiler: Closure-Konvertierung erklärt

Während der Arbeit am Ghuloum-Tutorial hat der Autor einen ursprünglich in C geschriebenen Compiler in Python neu implementiert und eine prägnante 300-Zeilen-Version (inklusive Tests) erstellt. Dieser Compiler führt eine Closure-Konvertierung durch, die die Variablenbindung, die Verfolgung freier Variablen und die Verwaltung von Codeobjekten umfasst. Der Beitrag beschreibt die Implementierung detailliert, behandelt Lambda- und Let-Ausdrücke, Funktionsaufrufe und liefert Testfälle sowie Beispiele für Assemblercode. Das Ergebnis ist ein überraschend kompakter Compiler, der Closures und indirekte Funktionsaufrufe verarbeiten kann und elegante Lösungen für komplexe Probleme zeigt.

Mehr lesen
Entwicklung Closure-Konvertierung

Compiler-IR-Design: Lokale Entscheidungen und Optimierung

2025-06-17
Compiler-IR-Design: Lokale Entscheidungen und Optimierung

Dieser Beitrag untersucht das Design von Compiler-Zwischenrepräsentationen (IR), wobei der Fokus auf der Entscheidungsfindung anhand von ausschließlich lokalen Informationen liegt. Der Autor vergleicht Kontrollflussgraphen (CFG), registerbasierte IRs und die statische Einzelzuweisung (SSA)-Form und stellt fortschrittlichere Designs wie statische Einzelinformation (SSI) und Sea of Nodes (SoN) vor. SSA vereinfacht die Analyse, indem jede Variable nur einmal zugewiesen wird, während SSI erlaubt, detailliertere Informationen zur selben Variable in verschiedenen Programmzweigen hinzuzufügen. SoN repräsentiert alle Anweisungen als Knoten in einem Graphen und stellt Daten- und Kontroll-Abhängigkeiten explizit dar, um die Optimierung flexibler zu gestalten. Diese Designs zielen darauf ab, Compiler-Optimierer effizienter zu machen und letztendlich optimierteren Code zu erzeugen.

Mehr lesen

Eine Blog-Suchmaschine von Grund auf mit Word2Vec bauen

2025-05-20
Eine Blog-Suchmaschine von Grund auf mit Word2Vec bauen

Die Autoren haben eine Blog-Suchmaschine von Grund auf mit Python und Word2Vec-Einbettungen gebaut. Beiträge und Suchanfragen werden in einen dreidimensionalen Vektorraum eingebettet, und die Kosinusähnlichkeit wird verwendet, um die Ergebnisse zu ranken. Um sie webfreundlich zu gestalten, wird das Word2Vec-Modell in einen Index und Vektoren aufgeteilt, wobei HTTP-Range-Anfragen verwendet werden, um nur die notwendigen Daten herunterzuladen und so die Weblast deutlich zu reduzieren. Eine Bewertungsmetrik wurde entwickelt, um die Genauigkeit der Suchmaschine zu bewerten, und zukünftige Verbesserungen, wie die Verwendung von TF-IDF zur Rauschreduzierung, werden diskutiert.

Mehr lesen
Entwicklung Worteinbettungen

Artikel und Blogbeiträge, die meine Sicht auf Programmiersprachen verändert haben

2025-05-14
Artikel und Blogbeiträge, die meine Sicht auf Programmiersprachen verändert haben

Dieser Blogbeitrag listet mehrere Artikel und Blogbeiträge auf, die das Verständnis des Autors über Programmiersprachen und Compiler tiefgreifend beeinflusst haben. Behandelte Themen sind Garbage Collection, Codeoptimierung, Registerallokation, reguläre Ausdrücke, maschinelles Lernen, SSA-Form und Compilerdesign. Der Autor hebt die vorgestellten cleveren Ansätze hervor, wie die Verwendung von Z3 als Beweismaschine, den Einsatz von Fuzzing zur Fehlererkennung und effiziente Techniken zur Auswertung von Ausdrücken. Die Sammlung zeigt das tiefe Eintauchen des Autors in die Komplexität des Designs und der Implementierung von Programmiersprachen.

Mehr lesen
Entwicklung

Manuelles Erstellen einer Nix-Derivation: Ein tiefer Einblick in die Hash-Generierung

2025-04-09
Manuelles Erstellen einer Nix-Derivation: Ein tiefer Einblick in die Hash-Generierung

Dieser Blogbeitrag beschreibt die Reise des Autors beim manuellen Erstellen einer einfachen Nix-Derivation. Durch die schrittweise Analyse des Blogbeitrags von Farid taucht der Autor in die interne Funktionsweise von Nix-Derivationen ein, insbesondere in den Prozess der Hash-Generierung. Die Reise beinhaltete die Bewältigung von Herausforderungen wie dem Verständnis der ATerm-Darstellung, des SHA256-Hashings und der einzigartigen Base32-Codierung von Nix. Letztendlich erzeugte der Autor erfolgreich denselben Hash-Wert wie in Farids Blogbeitrag und erstellte erfolgreich eine einfache "Hello World"-Derivation.

Mehr lesen
Entwicklung Hash-Generierung

100-fache Beschleunigung: Garbage Collection und GPUs in Python

2025-03-25
100-fache Beschleunigung: Garbage Collection und GPUs in Python

Dieser Beitrag beschreibt, wie der Autor durch einfache Codeoptimierungen die Laufzeit eines Python-Programms um das 100-fache beschleunigen konnte. Das ursprüngliche Programm nutzte NumPy für parallele Berechnungen, war aber aufgrund schlechter Speicherverwaltung langsam und speicherintensiv. Durch die Implementierung eines einfachen Garbage-Collection-Mechanismus zur Freigabe nicht mehr benötigter Zwischenvariablen reduzierte der Autor die Laufzeit von 40 Sekunden auf 10 Sekunden und verringerte den Speicherverbrauch deutlich. Anschließend nutzte er CuPy, um die Berechnungen auf die GPU zu verlagern, wodurch die Laufzeit weiter auf 1,5 Sekunden reduziert wurde – eine beeindruckende Performance-Steigerung.

Mehr lesen
Entwicklung Python-Optimierung

Cinder JIT: Effiziente Typdarstellung mit Bitsets und Semilattices

2025-03-11
Cinder JIT: Effiziente Typdarstellung mit Bitsets und Semilattices

Der Cinder JIT-Compiler verwendet eine clevere Typdarstellung, indem er Typen als Mengen (sogar Verbände) behandelt und eine kompakte Bitset-Darstellung wählt. Dieser Artikel untersucht, wie Cinder Bitsets und Semilattice-Strukturen für die effiziente Behandlung von Typinformationen nutzt, einschließlich der Darstellung von Basistypen, Typvereinigungen und Spezialisierung. Durch die Kodierung von Typinformationen in Bitsets stellt Cinder Typvereinigungen effektiv dar und ermöglicht feinere Typunterscheidungen. Darüber hinaus führt Cinder einen Spezialisierungsmechanismus ein, um den spezifischen Wert einzelner Objekte zu verfolgen und so die Optimierungseffizienz des Compilers weiter zu verbessern. Der Artikel behandelt auch den Bottom-Typ und Details zur Generierung des Typverbands.

Mehr lesen
Entwicklung

Tieftauchen in die Compileroptimierungen mit Static Single Assignment (SSA)

2025-02-11
Tieftauchen in die Compileroptimierungen mit Static Single Assignment (SSA)

Dieser Artikel beschreibt die jahrzehntelange Entwicklung von Compileroptimierungstechniken mit Static Single Assignment (SSA). Von den ersten Arbeiten zu Codebewegung und globaler Wertnummerierung über Cytrons bahnbrechende Arbeit zur Minimierung von Phi-Instruktionen bis hin zum Single-Pass-Generierungsansatz von Brandis und Mössenböck und dem Sea of Nodes IR von Click und Paleczny verfolgt der Artikel mehrere wichtige Arbeiten und diskutiert deren Stärken und Schwächen. Er behandelt auch Appels Arbeit zur Beziehung zwischen funktionaler Programmierung und SSA, die iterative Phi-Knotenentfernung von Aycock und Horspool und neuere Ansätze basierend auf abstrakter Interpretation. Der Artikel endet mit einer Liste weiterer Artikel und Ressourcen und bietet Lesern, die mehr über SSA erfahren möchten, eine umfassendere Perspektive.

Mehr lesen

Tieftauchen in CPS: Eine Reise in die Kompilierung funktionaler Programmiersprachen

2024-12-25
Tieftauchen in CPS: Eine Reise in die Kompilierung funktionaler Programmiersprachen

Dieser Artikel befasst sich eingehend mit dem Continuation-Passing Style (CPS) und seiner Anwendung beim Kompilieren funktionaler Programmiersprachen. Der Autor baut schrittweise einen CPS-Transformator für eine einfache, Scheme-ähnliche Sprache, wobei er Optimierungsstrategien und Codegenerierungsmethoden erläutert. Der Artikel beschreibt detailliert die Transformation von Integern, Variablen, Funktionsaufrufen, arithmetischen Operatoren, Lambda-Ausdrücken und if-Ausdrücken in die CPS-Form. Er behandelt auch Meta-Continuations und Optimierungstechniken wie Constant Folding und Beta-Reduktion. Abschließend werden verschiedene Ansätze zur Generierung ausführbaren Codes aus CPS beschrieben, darunter die Generierung von C-Code, die Verwendung von Trampolinen und die Anwendung einer einzigen großen switch-Anweisung.

Mehr lesen