CS 6120 : cours avancé de compilation en ligne à suivre en autonomie
(cs.cornell.edu)- Il s’agit d’un cursus en autonomie qui regroupe vidéos de cours, notes, lectures d’articles et devoirs d’implémentation pour suivre en ligne CS 6120, un cours de niveau doctorat de Cornell CS
- Il couvre les sujets fondamentaux des compilateurs comme la représentation intermédiaire, le data flow et les optimisations « classiques », ainsi que la parallélisation, la compilation JIT et le garbage collection
- Les travaux pratiques utilisent LLVM et l’IR pédagogique Bril, avec des exercices de hacking open source où l’on implémente soi-même les concepts abstraits
- La version en autonomie permet d’ignorer les dates limites, mais ne donne pas accès aux discussions Zulip du vrai cours ni au projet de fin de semestre
- Les ressources sont publiées en open source sur GitHub, ce qui permet de signaler des problèmes, et un formulaire de retour est disponible après avoir terminé le cursus
Format du cours et périmètre
- CS 6120 est un cours sur l’implémentation des langages de programmation créé par Adrian Sampson de Cornell CS
- Le programme couvre à la fois les bases communes de l’implémentation des compilateurs et des sujets orientés recherche
- représentation intermédiaire
- data flow
- optimisations « classiques »
- parallélisation
- compilation JIT
- garbage collection
- L’apprentissage s’appuie sur la lecture d’articles et des exercices de hacking open source
- Le cursus en autonomie est présenté comme un cours non noté de 4 crédits dans une « université imaginaire »
- les leçons sont organisées dans un ordre linéaire
- chaque leçon comprend une vidéo et des notes écrites
- certaines leçons incluent des devoirs d’implémentation
- un ordre recommandé alterne visionnage des vidéos et lecture des articles
Différences avec le vrai cours
- Les participants en autonomie peuvent ignorer les dates limites des devoirs
- Ils ne peuvent pas participer aux discussions Zulip du vrai cours
- Le vrai CS 6120 comporte un projet de fin de semestre
- dans la version en autonomie, le devoir final consiste à « changer le monde grâce à la magie des compilateurs »
- La qualité de production des cours peut être faible, surtout dans les premières leçons
- Les supports de CS 6120 sont publiés en open source sur GitHub et vous pouvez signaler un bug si vous repérez un problème
- Après avoir terminé, vous pouvez remplir ce formulaire de retour
Leçons et lectures
- Lesson 1: Welcome & Overview
- Lesson 2: Representing Programs
- Lesson 3: Local Analysis & Optimization
- Lesson 4: Data Flow
- Lesson 5: Global Analysis
- Lesson 6: Static Single Assignment
- Lesson 7: LLVM
- Lesson 8: Loop Optimization
- Lesson 9: Interprocedural Analysis
- Lesson 10: Alias Analysis
- video
- A Unified Theory of Garbage Collection, OOPSLA 2004
- Fast Conservative Garbage Collection, OOPSLA 2014
- Lesson 11: Memory Management
- Lesson 12: Dynamic Compilers
- Lesson 13: Program Synthesis
- Lesson 14: Concurrency & Parallelism
1 commentaires
Avis sur Hacker News
Quand je terminais mon premier cycle et que je cherchais mon premier poste à temps plein, ce cours m’a permis de réussir des entretiens avec des équipes d’ingénierie compilateur chez MANGA (Meta, Apple, NVIDIA, Google, Amazon)
Le cursus de l’Université de Waterloo en systèmes de calcul bas niveau était aussi excellent, et je contribuais déjà à des projets open source de compilateurs, mais ce cours m’a vraiment beaucoup aidé à répondre aux questions les plus difficiles en entretien
Pour que ce soit plus naturel, quelque chose comme « my university has the low level computing systems curriculum par excellence » aurait mieux convenu
Avant d’écrire un compilateur, je pense qu’il faut d’abord comprendre l’architecture des ordinateurs et savoir ce que le compilateur doit générer pour produire le code machine le plus efficace
Mais, d’après mon expérience, les écoles et universités semblent reléguer de plus en plus l’architecture des ordinateurs, voire la programmation système, au second plan, probablement parce qu’elles les jugent trop techniques
Pourtant, ces connaissances sont très importantes pour obtenir de bons postes dans l’industrie
En travaillant avec des universités, le problème de fond que j’ai constaté est qu’il y a trop de contenus potentiels à couvrir dans un volume horaire limité
Dans notre domaine, la quantité d’informations à connaître augmente de façon exponentielle avec le temps et a déjà dépassé les limites ; si le temps consacré à la programmation système diminue dans les parcours généralistes, c’est parce qu’elle devient chaque année moins pertinente pour un nombre croissant d’étudiants, et c’est rationnel
Il reste encore beaucoup de travail à faire au niveau des compilateurs, mais une grande partie ne devrait pas nécessiter de se préoccuper jusqu’au niveau de la microarchitecture de l’ordinateur
Même s’il n’est pas nécessaire d’étudier x86 ou MIPS, CUDA expose une architecture encore plus étrange qu’eux
La raison habituelle pour laquelle on ne met pas l’accent sur le bas niveau est plutôt que cela dépend des implémentations, vieillit vite et se généralise difficilement
J’ajouterais que cela ne va pas très bien avec le profil du « programmeur système » : certains tendent à faire de ce savoir ultra-spécifique toute leur identité professionnelle, au point de savoir écrire de l’assembleur mais de ne pas savoir ce qu’est un foncteur
Il ne semble pas exister de bonnes ressources académiques qui traitent en profondeur de l’optimisation avancée des compilateurs
J’ai beaucoup cherché, mais la plupart des cours restent au niveau introductif ; j’ai été assez surpris de constater que, pour les techniques vraiment intéressantes, il faut plonger profondément dans le code source de compilateurs open source populaires
Je pense que les compilateurs font partie des domaines qui n’ont pas beaucoup évolué depuis environ 30 ans
Quand j’ai donné ce cours à l’Université de Pérouse en 2004–2006, je pouvais encore utiliser sans problème des supports vieux de 15 à 25 ans
Récemment, les choses semblent avoir changé
Rien que parmi les sujets qui pouvaient être enseignés comme nouveautés en 2004–2006 mais ne l’ont probablement pas été, il y a la construction SSA, la vectorisation SLP et la superoptimisation automatique par peephole, et ce ne sont que ceux qui me viennent à l’esprit
Ce qui n’a pas changé, ce sont les manuels de compilateurs. Ils se concentrent beaucoup trop sur la façon de fabriquer des générateurs de parseurs et parlent très peu de la manière de concevoir réellement un compilateur, sans même parler de la conception moderne des architectures d’ordinateurs. Cette critique existe depuis des décennies
Au cours des dix dernières années, le paysage a fortement évolué vers les techniques de compilation incrémentale
Les avancées théoriques restent surtout cantonnées aux parseurs, mais les implémentations réelles les appliquent à l’ensemble du pipeline, jusqu’aux optimisations globales de programme et à la génération de code
À chaque nouvelle génération de processeurs, des instructions et options s’ajoutent, ce qui semble ouvrir de nouvelles optimisations ou combinaisons exploitables par les compilateurs
Écrire un compilateur pour un langage purement fonctionnel nécessiterait certainement de nouveaux supports
Je suis content qu’un cours comme celui-ci existe
Je peux maintenant avancer à mon rythme avec un guide sur des sujets avancés
J’ai toujours voulu faire carrière comme ingénieur compilateur, mais là où je vis, les possibilités de formation et d’emploi ne sont pas nombreuses
Quand je regarde les États-Unis, la concurrence sur le marché du recrutement paraît écrasante, et honnêtement je ne sais pas comment y entrer
Ma seule expérience est un cours suivi pendant mon premier cycle, mais ce cursus était vraiment excellent dans son intégralité
Je pense que c’est parce qu’il faut écrire du code qui manipule d’autres codes, avec en général des objectifs sémantiques et comportementaux assez différents. Il y a aussi beaucoup de savoir transmis oralement et de bruit autour de tout ça
Les équipes compilateur préfèrent donc particulièrement les personnes qui construisent déjà des compilateurs depuis longtemps. Mais comme il y a évidemment un problème d’amorçage, les grandes équipes recrutent aussi des diplômés qui semblent capables de franchir cette courbe, et c’est à peu près comme ça que je suis entré dans le domaine
Si tu as une expérience professionnelle générale mais pas d’expérience en compilateurs, une stratégie claire consiste à rejoindre une entreprise qui fait un travail que tu connais déjà et qui possède aussi une équipe compilateur — en gros, une « assez grande entreprise logicielle » — puis à viser une mobilité interne
C’est bien que « A Unified Theory of Garbage Collection » soit aussi inclus
Au moins, ces étudiants comprendront correctement la différence entre le comptage de références et le garbage collection par traçage
Si « CS 6120 est un cours de niveau doctorat en informatique à Cornell, donné par Adrian Sampson, sur l’implémentation des langages de programmation », est-ce que c’est un cours assez avancé ?
Je ne pense pas avoir un niveau doctorat en informatique
Essaie simplement : si tu peux le faire, tu es prêt ; si tu ne peux pas, tu ne l’es pas encore
Il suffit d’essayer
Cela ressemble encore globalement au contenu du cours général de construction de compilateurs donné par Gerhard Goos il y a 20 ans
Il y a aussi des articles plus récents en lien, donc ça peut valoir le coup d’y jeter un œil
J’aimais bien le livre Advanced Compiler Design and Implementation de Steven Muchnick
Cela fait 18 ans que je n’ai pas regardé de code source de compilateur, donc j’ai surtout l’impression d’être dépassé sur le profiling et les optimisations basées sur les chemins ; avec l’apprentissage automatique aujourd’hui, j’imagine qu’il y a aussi beaucoup plus de contenu avancé autour du SIMD
J’ai suivi ce cours en ligne il y a quelques étés et j’ai vraiment beaucoup appris
Ouvrir une PR pour un petit ticket de Bril IR et la corriger avec le professeur a été une expérience très prenante
Je me demande s’il existe un cours prérequis pour celui-ci
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/