CS 6120: 上級コンパイラ自己主導型オンライン講座
(cs.cornell.edu)- Cornell CSの博士課程レベル科目 CS 6120 をオンラインで追えるように、講義動画、ノート、論文リーディング、実装課題をまとめた自己主導型カリキュラム
- 中間表現、データフロー、古典的最適化といった コンパイラの中核トピック から、並列化、JITコンパイル、ガベージコレクションまで扱う
- 実習では LLVM と教育用IR Bril を使い、抽象的な概念を自分で実装してみるオープンソースハッキング課題へとつながる
- 自己主導版では締め切りを無視できるが、実際の授業の Zulipディスカッション や学期末プロジェクトには参加できない
- 資料はGitHubでオープンソース公開されており、問題を報告でき、修了後にはフィードバックフォームを記入できる
受講方法と扱う範囲
- CS 6120 は、Cornell CS の Adrian Sampson が作成したプログラミング言語実装の科目
- 講座の範囲には、コンパイラ実装の共通基盤と研究志向のトピックがともに含まれる
- 中間表現
- データフロー
- 「古典的」最適化
- 並列化
- JITコンパイル
- ガベージコレクション
- 学習は 論文リーディング とオープンソースハッキング課題で進む
- 自己主導カリキュラムは、「想像上の大学」で4単位の無採点科目を履修する形式で構成されている
- 講義は線形の順序で並べられている
- 各レッスンには動画と文章ノートがある
- 一部のレッスンには実装課題が含まれる
- 動画視聴と論文リーディングを織り交ぜて進めるよう推奨順が設定されている
実際の授業との違い
- 自己主導受講者は課題の締め切りを無視できる
- 実際の授業の Zulipディスカッション には参加できない
- 実際のCS 6120には学期末プロジェクトがある
- 自己主導版の学期末課題は「コンパイラの魔法で世界を変えること」
- 講義制作の品質は、特に初期レッスンでは低い可能性がある
- CS 6120 の資料は GitHub でオープンソース公開されており、問題を見つけたらバグ報告できる
- 修了後には フィードバックフォーム を記入できる
レッスンと読み物
- 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件のコメント
Hacker Newsのコメント
学部課程を終えて最初の正社員の仕事を探していたとき、この講義のおかげでMANGA(Meta, Apple, NVIDIA, Google, Amazon)のコンパイラエンジニアリングチームの面接を通過できた。
University of Waterlooの低レベル計算システムのカリキュラムも素晴らしく、オープンソースのコンパイラプロジェクトにも貢献していたが、面接で最も難しい質問に答えるうえでこの講義は本当に大きな助けになった。
より自然に書くなら「my university has the low level computing systems curriculum par excellence」くらいのほうがよかったと思う。
コンパイラを書く前に、コンピュータアーキテクチャを理解し、最も効率的な機械語コードを作るためにコンパイラが何を生成すべきかを知ることが先だと思う。
ただ経験上、学校や大学はコンピュータアーキテクチャ、さらにはシステムプログラミングまでもますます優先順位を下げているようで、おそらく技術的すぎると見なしているからだと思う。
それでもその知識は、業界で良い仕事を得るうえで非常に重要だ。
大学と関わっていて感じる根本的な問題は、限られた授業時間の中で扱いうる内容が多すぎることだ。
この分野で知るべき情報量は時間とともに指数関数的に増え、すでに限界を超えているので、一般トラックでシステムプログラミングの授業時間が減るのは、年々より多くの学生にとって関連性が低くなっているからであり、合理的だ。
コンパイラレベルでやるべきことは依然として多いが、そのかなりの部分はコンピュータの マイクロアーキテクチャ レベルまで気にしなくて済むべきだ。
x86やMIPSを勉強する必要はないとしても、CUDAはそれらよりさらに奇妙な構造を見せる。
低レベルな内容を強調しない通常の理由は、実装ごとに異なり、すぐ古くなり、一般化しにくいからだ。
付け加えると、私は「システムプログラマ」タイプとはあまり相性がよくない。こうした極度に具体的な雑学を自分の職業的アイデンティティ全体にしてしまう傾向があり、そのせいでアセンブリは使えても 関手 が何かは知らない人まで出てくる。
高度なコンパイラ最適化 を深く扱う良い学術資料がないように思う。
かなり探したが、ほとんどの講義は入門レベルで、実際に面白い技法は人気のあるオープンソースコンパイラのソースコードの奥深くまで入らないと見つからず、かなり驚いた。
コンパイラはおよそ30年間、大きく進歩していない分野の一つだと思う。
2004〜2006年にPerugia Universityで講義していたときも、15〜25年前の資料を特に問題なく使えた。
最近は状況が変わってきたようだ。
2004〜2006年当時でも新しい内容として教えられたが、おそらく扱わなかったものだけ見ても SSA構築、SLPベクトル化、自動ピープホール超最適化があり、これは今思いついただけでもそれくらいある。
変わっていないのはコンパイラ教科書のほうだ。パーサ生成器の作り方に過度に集中し、実際にコンパイラをどう設計するか、まして現代のコンピュータアーキテクチャ設計についてはほとんど扱わない。この不満は何十年も前からあった。
この10年で地形は インクリメンタルコンパイル 技法の方向へ大きく進化した。
理論的進展は主にパーサに閉じ込められているが、実装面ではパイプライン全体にわたってグローバルなプログラム最適化やコード生成にまで適用されている。
新しいプロセッサ世代ごとに命令やオプションが増え、それによってコンパイラが活用できる新しい最適化や組み合わせが生まれているようだ。
純粋関数型言語 用のコンパイラを書くなら、確かに新しい資料が必要になるはずだ。
こういう講義があるのはうれしい。
これで高度なテーマを案内されながら自分のペースで進められる。
ずっと コンパイラエンジニア のキャリアを望んでいたが、私の住む場所には教育や仕事の機会が多くない。
アメリカを見ると採用市場の競争は圧倒的に激しく、正直どうやって入ればよいのかわからない。
持っている経験は学部のときに受けた講義一つだけだが、そのコースは本当にすべてが良かった。
他のコードを操作するコードを書かなければならず、たいてい意味論と動作目標がかなり異なるからだと思う。そこに口伝えの知識や雑音も多い。
だからコンパイラチームは、すでに長いことコンパイラを作ってきた人を特に好む。ただ、当然ながらブートストラップ問題があるので、大きなチームはその曲線を越えられそうな卒業生も採用し、私もだいたいそういう形で入った。
全般的なキャリアはあるがコンパイラ経験がないなら、自分が慣れている仕事をしている会社のうちコンパイラチームもあるところ、つまり「かなり大きいソフトウェア会社」に入り、社内異動 を狙うのが明確な戦略だ。
「A Unified Theory of Garbage Collection」も入っているのがよい。
少なくともこの学生たちは 参照カウントとトレーシングガベージコレクション の違いをきちんと理解するようになるだろう。
「CS 6120はAdrian Sampsonによるプログラミング言語実装に関するCornell CSの博士課程レベルの講義」だというが、かなり高度な講義ということ?
私はコンピュータサイエンスで 博士課程レベル ではない気がする。
とにかくやってみて、できるなら準備できているし、できないならまだというだけだ。
とにかく一度やってみればよい。
20年前にGerhard Goosが行っていた一般的なコンパイラ構成の講義で扱っていた内容と、今でもおおむね似ているように見える。
さらに新しい論文もリンクされているので、一度見てみるのもよさそうだ。
Steven Muchnickの Advanced Compiler Design and Implementation という本が好きだった。
18年間コンパイラのソースコードを見ていないので、特にプロファイリングや経路ベース最適化のあたりはついていけていない感じがするし、最近の機械学習を見ると、もっと高度なSIMD関連の内容もたくさんありそうだ。
数年前の夏にこのオンライン講義を追いかけて、本当に多くを学んだ。
Bril IR の小さな問題にPRを送り、教授と一緒に修正していく過程がとても没入感のあるものだった。
この講義の 前提講義 があるのか気になる。
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/