3 Punkte von GN⁺ 2024-03-04 | 1 Kommentare | Auf WhatsApp teilen
  • Ein selbstgeführtes Curriculum, das Vorlesungsvideos, Notizen, Paper-Lektüre und Implementierungsaufgaben bündelt, damit man CS 6120, einen PhD-Level-Kurs der Cornell CS, online durcharbeiten kann
  • Deckt zentrale Compiler-Themen wie Intermediate Representations, Datenfluss und klassische Optimierungen ebenso ab wie Parallelisierung, JIT-Compilation und Garbage Collection
  • Die Übungen verwenden LLVM und die Lehr-IR Bril und führen zu Open-Source-Hacking-Aufgaben, in denen abstrakte Konzepte direkt implementiert werden
  • In der selbstgeführten Version kann man Abgabefristen ignorieren, aber nicht an der Zulip-Diskussion des tatsächlichen Kurses und nicht am Abschlussprojekt teilnehmen
  • Die Materialien sind als Open Source auf GitHub verfügbar, sodass man Probleme melden kann; nach Abschluss kann man ein Feedback-Formular ausfüllen

Teilnahmeform und behandelte Themen

  • CS 6120 ist ein Kurs zur Implementierung von Programmiersprachen, erstellt von Adrian Sampson von Cornell CS
  • Der Kursumfang umfasst sowohl gemeinsame Grundlagen der Compiler-Implementierung als auch forschungsorientierte Themen
    • Intermediate Representations
    • Datenfluss
    • „klassische“ Optimierungen
    • Parallelisierung
    • JIT-Compilation
    • Garbage Collection
  • Das Lernen erfolgt über Paper-Lektüre und Open-Source-Hacking-Aufgaben
    • Für die Übungen werden LLVM und Bril, eine für den Unterricht gedachte Bildungs-IR, verwendet
  • Das selbstgeführte Curriculum ist als unbenoteter 4-Credit-Kurs an einer „imaginären Universität“ strukturiert
    • Die Vorlesungen sind in linearer Reihenfolge angeordnet
    • Jede Lektion enthält Videos und schriftliche Notizen
    • Einige Lektionen enthalten Implementierungsaufgaben
    • Es gibt eine empfohlene Reihenfolge, die das Ansehen von Videos und das Lesen von Papers kombiniert

Unterschiede zum tatsächlichen Kurs

  • Selbstgeführte Teilnehmer können die Abgabefristen für Aufgaben ignorieren
  • Sie können nicht an der Zulip-Diskussion des tatsächlichen Kurses teilnehmen
  • Der tatsächliche CS-6120-Kurs enthält ein Abschlussprojekt
    • Die Abschlussaufgabe der selbstgeführten Version lautet, „die Welt mit Compiler-Magie zu verändern“
  • Die Produktionsqualität der Vorlesungen kann insbesondere in den frühen Lektionen niedrig sein
  • Die Materialien zu CS 6120 sind als Open Source auf GitHub verfügbar; wer ein Problem findet, kann einen Bug melden
  • Nach Abschluss kann man ein Feedback-Formular ausfüllen

Lektionen und Lesematerial

1 Kommentare

 
GN⁺ 2024-03-04
Hacker-News-Kommentare
  • Als ich nach dem Bachelor meinen ersten Vollzeitjob suchte, hat mir dieser Kurs geholfen, Interviews bei Compiler-Engineering-Teams der MANGA-Unternehmen (Meta, Apple, NVIDIA, Google, Amazon) zu bestehen.
    Das Curriculum für Low-Level-Computing-Systeme an der University of Waterloo war ebenfalls hervorragend, und ich trug auch zu Open-Source-Compilerprojekten bei, aber bei den schwierigsten Fragen im Interview war dieser Kurs wirklich eine enorme Hilfe.

    • Es heißt nicht „par excellent“, sondern par excellence, und auch in diesem Satzbau klingt es unnatürlich.
      Natürlicher wäre etwa: „my university has the low level computing systems curriculum par excellence“.
  • Ich denke, bevor man einen Compiler schreibt, sollte man zuerst Computerarchitektur verstehen und wissen, was ein Compiler erzeugen muss, um den effizientesten Maschinencode zu produzieren.
    Meiner Erfahrung nach räumen Schulen und Universitäten aber der Computerarchitektur, ja sogar der Systemprogrammierung, immer weniger Priorität ein, vermutlich weil sie als zu technisch gilt.
    Dieses Wissen ist dennoch sehr wichtig, um in der Branche gute Jobs zu bekommen.

    • Dass Universitäten die Systemprogrammierung niedriger priorisieren, stimmt, aber der Grund ist nicht, dass sie „zu technisch“ wäre.
      Das grundlegende Problem, das ich in der Zusammenarbeit mit Universitäten sehe, ist vielmehr, dass es viel zu viele potenzielle Inhalte für die begrenzte Lehrzeit gibt.
      Die Menge an Wissen, die man in unserem Fach kennen sollte, wächst mit der Zeit exponentiell und hat die Grenze längst überschritten; deshalb ist es nachvollziehbar, dass im allgemeinen Studiengang die Zeit für Systemprogrammierung sinkt, weil sie für immer mehr Studierende von Jahr zu Jahr weniger relevant ist.
    • Könntest du genauer erklären, was du in der Branche unter guten Jobs verstehst und warum?
    • Dass man Compiler nutzen kann, ohne solche Low-Level-Details zu kennen, ist aus meiner Sicht einer der großen Fortschritte der Branche.
      Auf Compiler-Ebene gibt es zwar weiterhin viel zu tun, aber bei einem erheblichen Teil davon sollte man sich nicht bis zur Mikroarchitektur des Computers hinunter kümmern müssen.
    • GPU-bezogene Arbeit erfordert immer noch viel Wissen über Computerarchitektur und Compiler.
      Auch wenn man x86 oder MIPS nicht lernen muss, zeigt CUDA eine noch seltsamere Architektur als diese.
    • Meiner Erfahrung nach hält kaum jemand Low-Level-Details für „zu technisch“.
      Der übliche Grund, sie nicht zu betonen, ist, dass sie implementierungsspezifisch sind, schnell veralten und sich schwer verallgemeinern lassen.
      Außerdem passe ich nicht gut zum Typus des „Systemprogrammierers“, der dazu neigt, solches extrem spezifisches Detailwissen zur gesamten beruflichen Identität zu machen, sodass es Leute gibt, die zwar Assembler schreiben können, aber nicht wissen, was ein Functor ist.
  • Es scheint keine guten akademischen Materialien zu geben, die fortgeschrittene Compiler-Optimierungen wirklich tief behandeln.
    Ich habe viel gesucht, aber die meisten Vorlesungen sind auf Einsteigerniveau, und ich war ziemlich überrascht, dass man für die wirklich interessanten Techniken tief in den Quellcode populärer Open-Source-Compiler einsteigen muss.

    • Die meisten akademischen Lehrveranstaltungen scheinen sich übermäßig auf Parsing zu konzentrieren und den Rest nur oberflächlich zu behandeln.
  • Ich halte Compiler für eines der Gebiete, das sich in etwa 30 Jahren nicht grundlegend verändert hat.
    Als ich 2004 bis 2006 an der Universität Perugia unterrichtete, konnte ich ohne Probleme Materialien verwenden, die 15 bis 25 Jahre alt waren.
    In letzter Zeit scheint sich das geändert zu haben.

    • Das stimmt nicht.
      Schon 2004 bis 2006 hätte man Neues unterrichten können, das du wahrscheinlich einfach nicht behandelt hast, etwa SSA-Konstruktion, SLP-Vektorisierung und automatische Peephole-Superoptimierung; das ist nur, was mir spontan einfällt.
      Unverändert geblieben sind die Compiler-Lehrbücher. Sie konzentrieren sich viel zu stark darauf, wie man Parsergeneratoren baut, und behandeln kaum, wie man Compiler tatsächlich entwirft, geschweige denn modernes Computerarchitektur-Design. Diese Beschwerde gibt es seit Jahrzehnten.
    • Dem stimme ich nicht zu.
      In den letzten zehn Jahren hat sich die Landschaft stark in Richtung inkrementeller Kompilierung weiterentwickelt.
      Theoretische Fortschritte bleiben zwar meist beim Parser stecken, aber praktische Implementierungen wenden sie über die gesamte Pipeline hinweg bis zur globalen Programmoptimierung und Codegenerierung an.
    • Seitdem hat sich auch das Compiler-Testing deutlich verändert, und massenhaftes Zufallstesten ist populär geworden.
    • Ich kenne mich mit Compiler-Design oder -Implementierung nicht besonders gut aus, aber die Maschinensprachen und Assembler, auf die Compiler zielen, scheinen sich im Lauf der Zeit stark verändert zu haben.
      Mit jeder neuen Prozessorgeneration kommen mehr Instruktionen und Optionen hinzu, sodass sich für Compiler neue Optimierungen und Kombinationen ergeben, die sie ausnutzen können.
    • Wahrscheinlich liegt es daran, dass die meisten Programmiersprachen sich in ihren imperativen Eigenschaften, Schleifen und weitreichenden Seiteneffekten nicht stark verändert haben.
      Wenn man Compiler für rein funktionale Sprachen schreibt, braucht man ganz sicher neueres Material.
  • Ich freue mich, dass es solche Kurse gibt.
    Jetzt kann ich fortgeschrittene Themen in meinem eigenen Tempo mit Anleitung verfolgen.
    Ich wollte schon immer eine Karriere als Compiler Engineer, aber dort, wo ich lebe, gibt es nicht viele Bildungs- und Jobmöglichkeiten.
    Wenn ich auf den US-Markt schaue, wirkt der Wettbewerb auf dem Arbeitsmarkt überwältigend intensiv, und ehrlich gesagt weiß ich nicht, wie man dort hineinkommt.
    Ich habe nur die Erfahrung aus einem einzigen Kurs im Bachelorstudium, aber dieser Kurs war wirklich durchweg großartig.

    • Dieses Feld hat eine harte Lernkurve, an der viele scheitern.
      Wahrscheinlich, weil man Code schreiben muss, der anderen Code manipuliert, und weil Semantik und Verhaltensziele meist recht unterschiedlich sind. Dazu kommt viel stilles Erfahrungswissen und Rauschen.
      Deshalb bevorzugen Compiler-Teams besonders gern Leute, die schon lange Compiler bauen. Natürlich gibt es dann das Bootstrap-Problem, also stellen große Teams auch Absolventen ein, bei denen es so aussieht, als könnten sie diese Lernkurve schaffen; ungefähr so bin ich auch eingestiegen.
      Wenn du insgesamt Berufserfahrung hast, aber keine Compiler-Erfahrung, ist eine klare Strategie, in ein Unternehmen zu gehen, das dir vertraute Arbeit macht und auch ein Compiler-Team hat – grob gesagt ein ziemlich großes Softwareunternehmen – und dann einen internen Wechsel anzustreben.
  • Schön, dass auch „A Unified Theory of Garbage Collection“ enthalten ist.
    Zumindest werden diese Studierenden dann den Unterschied zwischen Referenzzählung und Tracing Garbage Collection richtig verstehen.

  • Wenn „CS 6120 eine Cornell-CS-Vorlesung auf Doktorandenniveau zur Implementierung von Programmiersprachen von Adrian Sampson“ ist, ist das dann eine ziemlich fortgeschrittene Vorlesung?
    Ich glaube nicht, dass ich in Informatik auf Doktorandenniveau bin.

    • Es ist besser, den Vorbereitungsstand nicht nach traditionellen Abschlussstufen zu messen.
      Probier es einfach aus; wenn du es schaffst, bist du bereit, und wenn nicht, dann eben noch nicht.
    • Dass es ein Doktorandenkurs ist, heißt nicht, dass es schwieriger ist als im Bachelor.
      Probier es einfach einmal.
  • Es sieht immer noch weitgehend ähnlich aus wie das, was in einer allgemeinen Vorlesung zum Compilerbau behandelt wurde, die Gerhard Goos vor 20 Jahren gegeben hat.
    Es sind auch neuere Papers verlinkt, also könnte ich da mal hineinschauen.
    Ich mochte das Buch Advanced Compiler Design and Implementation von Steven Muchnick.
    Da ich seit 18 Jahren keinen Compiler-Quellcode mehr angesehen habe, habe ich besonders beim Profiling und bei pfadbasierten Optimierungen das Gefühl, nicht mehr ganz mitzukommen, und wenn ich mir heutiges Machine Learning anschaue, scheint es auch viele fortgeschrittenere SIMD-bezogene Themen zu geben.

  • Ich habe diesen Online-Kurs vor ein paar Jahren im Sommer mitgemacht und wirklich viel gelernt.
    Einen PR für ein kleines Problem in Bril IR einzureichen und es dann gemeinsam mit dem Professor zu beheben, war sehr mitreißend.

  • Ich frage mich, ob es eine vorgelagerte Vorlesung zu diesem Kurs gibt.