- CS 6120, ein Promotionskurs von Cornell CS, bietet für alle, die Compiler und die Implementierung von Programmiersprachen systematisch lernen wollen, einen durchgehenden Lernpfad von Zwischenrepräsentationen über Datenfluss, Optimierung, Parallelisierung und JIT bis hin zur Garbage Collection
- Die selbstgesteuerte Version ist als 4-Credit-Kurs ohne Benotung an einer virtuellen Universität aufgebaut und führt in einem linearen Zeitplan durch Videos, Mitschriften, Paper-Lektüre und Implementierungsaufgaben
- Für die Praxis werden LLVM und das Lehr-IR Bril verwendet, damit sich abstrakte Compilerkonzepte durch echtes Schreiben von Code nachvollziehen lassen
- Anders als im regulären Cornell-Kurs können Abgabefristen ignoriert werden, eine Teilnahme an den Zulip-Diskussionen ist jedoch nicht möglich, und anstelle eines Semesterprojekts gibt es in der selbstgesteuerten Version eine eigene Abschlussaufgabe
- Das Kursmaterial ist auf GitHub als Open Source veröffentlicht, sodass Probleme gemeldet werden können; nach Abschluss können Verbesserungsvorschläge über ein Feedback-Formular eingereicht werden
Kursaufbau und Teilnahme
- CS 6120 ist ein Kurs zur Implementierung von Programmiersprachen von Adrian Sampson bei Cornell CS
- Behandelt werden sowohl grundlegende Themen allgemeiner Compiler als auch forschungsnahe Themen
- Zwischenrepräsentationen
- Datenfluss
- klassische Optimierungen
- Parallelisierung
- JIT-Kompilierung
- Garbage Collection
- Das Lernen setzt sich aus Paper-Lektüre und Open-Source-Hacking-Aufgaben zusammen
- Das selbstgesteuerte Curriculum ist als linearer Zeitplan aus Videos und Paper-Lektüre aufgebaut
- Einige Lektionen enthalten Implementierungsaufgaben, bei denen abstrakte Konzepte durch offene Programmieraufgaben erlernt werden
- Zwischen dem regulären CS 6120 und der selbstgesteuerten Version gibt es Unterschiede
- Abgabefristen für Aufgaben können ignoriert werden
- an Zulip-Diskussions-Threads kann nicht teilgenommen werden
- im regulären Kurs gibt es ein Semesterprojekt
- die Abschlussaufgabe der selbstgesteuerten Version lautet, „mit der Magie von Compilern die Welt zu verändern“
- Der Kurs ist als Open Source auf GitHub veröffentlicht; bei Problemen können Bugs gemeldet werden
- Nach Abschluss kann das Feedback-Formular ausgefüllt werden
Ablauf der Lektionen und Lektüren
-
Einführung und Programmdarstellung
-
Grundlagen von Analyse und Optimierung
-
LLVM sowie Schleifen- und interprozedurale Analyse
-
Speicherverwaltung und dynamische Compiler
-
Parallelität und schnelle Compiler
- Lesson 13: Concurrency & Parallelism
- Lesson 14: Fast Compilers
- nur der Titel ist in der Liste enthalten
1 Kommentare
Hacker-News-Kommentare
Der Teil über dynamische Compiler kommt fast vollständig einer Behandlung von Tracing-Compilern gleich. Im Allgemeinen war Tracing Compilation eine Sackgasse und wurde mehrfach wieder verworfen.
Wichtiger sind hier aus meiner Sicht Konzepte wie Type Feedback, spekulative Ausführung und Deoptimierung, schnelle Compiler und Tiering.
Der gesamte Kurs wirkt gut, und es ist großartig, dass so viel Material online veröffentlicht wurde.
Wie gesagt, ich würde gern mehr Kontext dazu geben, was in der Industrie tatsächlich gut funktioniert.
Allerdings könnte dieser Bereich ziemlich eng sein und sich auch stark von traditionellen Compilern unterscheiden, sodass manche von dem, was wir tun, auf euch recht befremdlich wirken könnte.
Natürlich ist mir klar, dass der Problemraum im Vergleich zu TraceMonkey oder LuaJIT extrem anders ist.
Ich habe damals mit einem der Entwickler gesprochen, vermutlich Jason Orendorff, und er meinte, Tracing funktioniere nicht besonders gut und sei vielleicht nur unter eingeschränkten Bedingungen möglich.
Welche Bedingungen das waren, habe ich allerdings komplett vergessen.
LuaJIT funktioniert gut, auch bei großen Programmen und auf hunderten Millionen Servern und Geräten.
Es ist wirklich schade, dass sogar Akademiker diese Floskel immer wieder wiederholen. Da fällt mir ein, dass Unwissenheit manchmal wirklich selig macht.
Frühere verwandte Beiträge:
CS 6120: Advanced Compilers: The Self-Guided Online Course - https://news.ycombinator.com/item?id=39577878 - März 2024, 102 Kommentare
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=35130975 - März 2023, 82 Kommentare
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=25386756 - Dezember 2020, 232 Kommentare
Ich bin etwas unsicher, warum dieser Kurs fortgeschritten sein soll. Die meisten Themen, etwa Dead Code Elimination, Datenfluss, Dominator-Analyse und SSA-Form, wirken so, als gehörten sie in einen ersten Compiler-Kurs.
Kurz gesagt sind Compiler faktisch in zwei Kurse aufgeteilt, und der erste behandelt die Mindestelemente zum Bau eines Compilers: lexikalische Analyse, Parsing, Codegenerierung und Registerallokation.
Der zweite Kurs entspricht dann eher der Frage, wie man einen optimierenden Compiler baut.
In Wirklichkeit bleibt das Backend, ob bei Compilern oder Interpretern, fast immer als „Übungsaufgabe für den Leser“ zurück.
Es ist schwer, sich vorzustellen, wie viel man noch herausfinden muss: wie man Closures erstellt, Umgebungen nachverfolgt, Pattern Matching implementiert, Speicherrepräsentationen gestaltet und vieles mehr.
Alles Interessante muss man sich selbst zusammensuchen.
P.S.: Das ist nur das Material eines einzigen Jahres: https://gist.githubusercontent.com/mamcx/e1743571b9a1ea163a7...
Ich habe zwei Bücher über Interpreter und Compiler gelesen, und das Backend wurde darin kaum behandelt.
Vielleicht ist das eher mit einem Einführungskurs ins Backend vergleichbar.
Gibt es noch andere selbstgesteuerte Online-Universitätskurse in Informatik dieser Art?
Manche Professoren veröffentlichen ihre Vorlesungen und Aufgaben auch außerhalb des „mooc“-Frameworks.
Ich habe Professoren erlebt, die sogar auf Fragen in den Kommentaren geantwortet haben. Das Internet kann immer noch ziemlich großartig sein.
Wie unterscheidet sich der Nutzen für Leser im Vergleich zu Nora Sandlers Writing a C compiler?
Wenn man Anfänger ist oder sich als Hobby damit beschäftigt, ist es besser, mit diesem Buch oder ähnlichem Material auf vergleichbarem Niveau zu beginnen und dann diesen Kurs anzugehen, um die Lücken zu schließen.
Gibt es auch einen einführenden Compiler-Kurs zum Selbststudium, den man sich ansehen kann, bevor man in die fortgeschrittene Stufe einsteigt?
Wenn man mit einem Interpreter anfangen möchte, ist Essentials of Programming Languages [4] gut.
Ich erkenne an, dass Crafting Interpreters hier und anderswo beliebt ist, aber persönlich gefällt es mir nicht. Da es anderen aber gefällt, ist es einen Versuch wert, und man kann es kostenlos lesen.
EOC und EOPL sind eher akademisch, aber ich finde sie trotzdem recht zugänglich, außer für Leute, die sich mit Scheme und Racket unwohl fühlen. Die Python-Version von EOC entschärft dieses Problem.
Danach wirken tiefergehende und akademischere Compiler-Bücher deutlich zugänglicher.
[1] https://mitpress.mit.edu/9780262047760/essentials-of-compila... - Racket-Version, Open-Access-Version verfügbar
[2] https://mitpress.mit.edu/9780262048248/essentials-of-compila... - Python-Version, Open-Access-Version verfügbar
[3] https://nostarch.com/writing-c-compiler - Implementierungssprache frei wählbar
[4] https://mitpress.mit.edu/9780262062794/essentials-of-program... - Scheme, aber in Racket nutzbar
Es besteht aus zwei Teilen; im ersten baut man in Java einen Tree-Walking-Interpreter und geht dann zu einer in C geschriebenen Version über.
https://github.com/jamiebuilds/the-super-tiny-compiler
Zusammen mit einigen der hier empfohlenen modernen Bücher sollte das ausreichen.
David Gries - https://www.cs.cornell.edu/gries/ und https://en.wikipedia.org/wiki/David_Gries
Der niederländische Informatiker Dick Grune schrieb über Compiler Construction for Digital Computers: „Mehrere Generationen von Compiler-Entwicklern sind mit diesem Buch aufgewachsen, und sie haben es nicht bereut.“
Auch Dick Grune selbst ist für Bücher über Compiler und Programmiersprachen bekannt - https://dickgrune.com/index.html und https://en.wikipedia.org/wiki/Dick_Grune
Ich habe einen Podcast über den Rust-Compiler gesehen, und ich glaube, dort wurde gesagt, dass an irgendeiner Stelle ein Machine-Learning-Algorithmus verwendet wird, um zu entscheiden, ob Code das System zum Absturz bringen kann.
Gibt es dafür eine Quelle?
Ich frage mich wirklich, was alexia massalin heutzutage macht, abgesehen davon, microunity-Patentlizenzen zu kassieren.