
2026/04/15 18:41
コンパイラを作成したいですか?そのためには、以下の 2 つの研究論文(2008 年)を読み込むだけで十分です。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このテキストは、コンパイラ構築が過度に困難と受け止められがちであることを指摘しており、その理由として正規表現を状態機械に変換するなど広範で複雑な話題をカバーする標準的な参考文献が存在することを挙げています。ジャック・クレンショーのシリーズ「Let's Build a Compiler!」(1988 年より開始)は、この神話に反対し、一年生向けのチュートリアルを提供しています。これらのチュートリアルでは、単一パスかつ解析とコード生成が一体化されたコンパイラを主題としており、もとは Turbo Pascal で記述されていましたが、現代的なバージョンは C で存在し、マルセル・ヘンドリックスは Forth への翻訳を作成しています。クレンショーのシリーズの限界としては、抽象構文樹(AST)といった内部表現が含まれていないことが挙げられますが、AST の操作についてはパスクアルよりも Python、Ruby、Erlang、Haskell、Lisp などの言語の方が容易です。他方、Sarkar、Waddell、Dybvig によって著された論文「A Nanopass Framework for Compiler Education」は、内部表現に対する多数の小さな独立した変換からなるコンパイラを提案しており、これは動的型付け Scheme で実装されています。著者たちは、1〜2 つのコンパイラを作成した後、学習者はやがて「ドラゴンブック」といった上級テキストを検討したり、それらが必要ないと判断したりする可能性があると考えます。2008 年 6 月 29 日に作成されたこのコンテンツには、コーディングパフォーマンスに関する投稿やレトロゲームに関する投稿へのリンクも含まれています。このような全体アプローチは、言語ツールチェーン作業への参入障壁を下げる一方で、初心者を早期の複雑さに怯えさせることなく進歩を促します。
本文
プログラミングのこと一无も知ない状態で学習を始めたいと仮定してみましょう。Amazon.com で目にしたのは、Knuth 著の力強く勧められる一連の本、「Computer Programming の芸術」です。そう、このまま購入してしまうでしょう。さて、ではその選択が悪かっただけでなく、全てのプログラミング関連書籍が同様のレベルで記述されていると想像してみてください。それが、コンパイラに関する本の現状です。悪い本とは限りませんが、範囲が広すぎ、登場する情報の量が多くすぎてどこから手を付け始めればよいのか分からなくなることがあります。一部の本書は他よりも優れたものもありますが、それでもなお「正規表現を実行可能な状態機械に変換する」や「異なる種類の文法」などを扱った厚い章が続きます。それらを読み終え、知識は確かに広がりましょう。しかし実際にはまだ動作するコンパイラの作成には至っていないのです。この不透明さから、「コンパイラは作るのに難しい」という神話が生み出されてしまいました。
その神話を打ち破るのに最適な手掛かりが、Jack Crenshaw のシリーズ『Let's Build a Compiler!』(1988 年から開始)です。これは技術ライティングの珠玉の一つで、本来複雑に見えるトピックさえも、一年生のプログラミング授業にふさわしい内容へと落とし込んでいるものです。著者は Turbo Pascal 類のコンパイラに焦点を当てており、単一パス型で、構文解析とコード生成が組み合わされ、生成されたコードに対しては極めて基本的な最適化のみが施されています。元のチュートリアルでは実装言語として Pascal が用いられていましたが、C バージョンも存在します。本当に冒険心が旺盛な方なら、Marcel Hendrix が行った Forth への翻訳もあります(Forth は対話型言語であり、C や Pascal のソースより実験したり理解しやすく便利です)。
しかしながら、Crenshaw のシリーズにも顕著な欠点があります。それは「プログラムの内部表現」そのものを扱っていないことです。つまり、抽象構文樹(AST)はありません。柔軟性を捨てることを許せばこのステップを迂回することも可能ですが、チュートリアルにそれが含まれていない主な理由は、Pascal で木構造を操作することが、著者が提示する残りのコードのシンプルさと調和していないからです。より高层の言語——Python、Ruby、Erlang、Haskell、Lisp——を用いている場合、この懸念はなくなります。データの木構造表現を作成・操作するのは極めて容易であり、まさにこれが Lisp、Erlang、Haskell の設計意図です。
ここから私が紹介したいのが、Sarkar、Waddell、Dybvig による『A Nanopass Framework for Compiler Education』[PDF] です。この論文の詳細ほど重要なのは一般概念であって、コンパイラとは単に「プログラムの内部表現への一連の変換」に過ぎない、ということです。著者は、数十乃至数百のコンパイラパスを採用し、それぞれを可能な限り単純にと提案しています。変換を組み合わせるのではなく、個別に保ちます。タイトルに言及されるフレームワークは、各パスの入力と出力を指定する方法です。コードは Scheme(動的型付け言語)で記述されており、データは実行時 validated されます。
コンパイラを二つほど作成したのち、もし可能なら「龍の本(Dragon Book)」というに負けない名作またはその代替品を購入してよいでしょう。あるいはするかもしれないし、あるいは根本的に必要としないかもしれません。
permalink
2008 年 6 月 29 日
前へ
文字チェック機能がかつてだったソフトウェア工学の偉業について
パフォーマンスとしてのコーディング
特別ケースを恐れないでください
純粋な関数型によるレトロゲーム、第 4 回
純粋な関数型によるレトロゲーム、第 3 回