世界を動かす技術を、日本語で。

コンパイラを書きたいですか?この2本の論文を読んでみてください(2008年)

概要

  • プログラミング初心者がコンパイラ本に直面する難しさの指摘
  • 多くの入門書が難解で実践的な知識に繋がりにくい現状
  • Jack Crenshawの「Let’s Build a Compiler!」シリーズの紹介
  • 内部表現(抽象構文木)の重要性と高水準言語の利点
  • Nanopass Frameworkの考え方と学習への活用提案

コンパイラ本の難しさと神話

  • プログラミング初心者 がAmazonで高評価の本「The Art of Computer Programming」を購入する状況の例示
  • 全ての入門書が高度すぎる というコンパイラ本の現状
  • 内容が広範囲すぎて どこから始めるべきかわからない問題
  • 正規表現から状態機械、文法理論まで 分厚い章 が続く構成
  • 読破しても 実際のコンパイラ作成 には結びつきにくい現実
  • この難解さが「 コンパイラは難しい」という 神話 を生む原因

Jack Crenshawの「Let’s Build a Compiler!」シリーズ

  • Jack Crenshaw による1988年開始の連載「Let’s Build a Compiler!」の紹介
  • Turbo Pascalクラス のシンプルなコンパイラを題材
  • シングルパスで パースとコード生成を一体化、最小限の最適化のみ実装
  • Pascal での実装例が中心だが、 CやForth版 も存在
  • Forth版 は対話的で実験しやすく、理解が容易
  • このシリーズの大きな欠点は 抽象構文木(AST) などの内部表現がない点

抽象構文木(AST)と高水準言語

  • 内部表現を省略することで 柔軟性を犠牲 にしている問題
  • Pascalでは 木構造操作が煩雑 なため、チュートリアルでは省略
  • Python, Ruby, Erlang, Haskell, Lisp などの高水準言語では 木構造の扱いが容易
  • 特に Lisp, Erlang, Haskell木構造データの操作 を得意とする設計

Nanopass Frameworkの提案

  • Sarkar, Waddell, Dybvig による「A Nanopass Framework for Compiler Education」の紹介
  • 重要なコンセプトは 「コンパイラ=内部表現の変換の連続」 という発想
  • 1パスごとに 単純な変換処理 を行い、 複雑な変換は分割 して独立させる方針
  • 各パスの 入出力仕様を明確化 するフレームワーク
  • Scheme で実装され、動的型付けによる 実行時検証 が特徴

学習ステップの提案

  • 1~2本のコンパイラ を自作して基礎を体得
  • その後で「 Dragon Book」などの有名専門書に挑戦する選択肢
  • 場合によっては 専門書が不要 になる可能性も示唆

Hackerたちの意見

コンパイラのコースを受けてから約4年経ったけど、今でも震える... 本当に、今まで受けた中で一番難しかった(でもやりがいのあった)授業だったよ。

それで、ベネチアンブラインドみたいに飲んじゃった。

このコメントには同意したいけど、全然やりがいを感じなかったな。純粋に苦痛だった。

別の返信を見て、もしかして見逃してるウィンドウに関するしゃれがあるのかな? もしそうじゃないなら、ここでは「shudder」じゃなくて「shutter」って言いたいんだと思うよ。もしジョークを台無しにしちゃったらごめんね。

コンパイラについて、他のプログラミングと比べて何が一番辛かった?

最近は「Crafting Interpreters」がおすすめって聞いたよ。(https://craftinginterpreters.com) Nanopassの論文のリンクは使えないみたい。

すごいコースだね!最終学年のCSの授業を受けてるときに終わらせたよ。たくさんの授業を待たなきゃいけなかったから(正直、授業前に話す相手もいなかったし)。ナノパスは試してないけど、他にも使えるリンクがあるから、やってみるつもり。

自習に最適な本だね!

コンパイラって幅広いから、誰かが「コンパイラの本」を勧めると、だいたい自分が欲しかった内容とはちょっと違うことが多いんだよね。だから、「Crafting Interpreters」のために実行可能なチートシートを作ったんだ。デモ用のパースは続けてて、ASTは本のよりちょっとLispっぽいかな。注意点として、これは学べることの本質を伝えるためのもので、決して本の代わりにはならないよ。むしろ、この本はコンパイラのマニュアルというより、Nystromが明らかに楽しんでいたような体験(ビジターパターンとか)を含むものだと思う。興味があれば、ビジターパターンのチートシートもPythonで作れるよ。プライベートなスクリプトからAIエージェントを使って「公に見えるアーティファクト」にしたんだ。[0] https://ouatu.ro/blog/crafting-interpreters-cheat-sheet/

「Crafting Interpreters」は素晴らしいけど、次のことをカバーしたサブ本があればいいなと思う:- 型と型付け - 最適化パス - オブジェクトファイル、実行可能ファイル、ライブラリ、リンク これがあれば、コンパイラを書くのに十分だと思う。

Nanopassの論文はもうダメみたいだけど、ここで見つけられるよ:https://stanleymiracle.github.io/blogs/compiler/docs/extra/n...

あと、こちらも:https://www.cambridge.org/core/journals/journal-of-functiona...

Hacker Newsで議論の続きを見る