3 points par GN⁺ 2024-03-04 | 1 commentaires | Partager sur WhatsApp
  • 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
    • Les travaux pratiques utilisent LLVM et Bril, un IR pédagogique conçu pour le cours
  • 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

1 commentaires

 
GN⁺ 2024-03-04
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

    • Ce n’est pas « par excellent », mais par excellence, et la structure de cette phrase est elle aussi maladroite
      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

    • Il est vrai que les universités accordent moins de priorité à la programmation système, mais la raison n’est pas que ce serait « trop technique »
      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
    • Peux-tu préciser ce que tu entends par bons postes dans l’industrie, et pourquoi tu les considères ainsi ?
    • Je pense que l’une des grandes avancées de l’industrie est justement qu’on peut désormais utiliser des compilateurs sans connaître ce niveau de détails bas niveau
      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
    • Les travaux liés aux GPU demandent encore beaucoup de compétences en architecture des ordinateurs et en compilateurs
      Même s’il n’est pas nécessaire d’étudier x86 ou MIPS, CUDA expose une architecture encore plus étrange qu’eux
    • D’après mon expérience, personne ne semble considérer les détails bas niveau comme « trop techniques »
      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

    • La plupart des cours universitaires semblent excessivement axés sur le parsing, et le reste n’est enseigné qu’en surface
  • 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é

    • Ce n’est pas vrai
      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
    • Je ne suis pas d’accord
      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
    • Depuis, les tests de compilateurs ont beaucoup changé, et les tests aléatoires à grande échelle sont devenus à la mode
    • Je ne suis pas spécialiste de la conception ou de l’implémentation de compilateurs, mais le langage machine et l’assembleur que ciblent les compilateurs semblent avoir beaucoup changé au fil du temps
      À 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
    • C’est probablement parce que la plupart des langages de programmation n’ont pas beaucoup changé sur des aspects comme le style impératif, les boucles et les effets de bord omniprésents
      É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é

    • Ce domaine a une courbe d’apprentissage brutale que beaucoup de gens n’arrivent pas à franchir
      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

    • Il vaut mieux ne pas mesurer son niveau de préparation avec les étapes de diplôme traditionnelles
      Essaie simplement : si tu peux le faire, tu es prêt ; si tu ne peux pas, tu ne l’es pas encore
    • Le fait que ce soit un cours de doctorat ne signifie pas qu’il soit plus difficile qu’un cours de premier cycle
      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