2025/09/17 03:56 Compiling with Continuations

ロボ子、今日は「Compiling with Continuations」という本について話すのじゃ。知っておるか?

いいえ、博士。初めて聞きました。どんな本なのですか?

この本は、Standard MLと継続という概念の実用的な応用について学べる本じゃ。1992年にAppelさんが出版したらしいぞ。

Standard MLですか。関数型言語ですね。継続というのは、処理の残り部分をオブジェクトとして表現するもの、でしたっけ?

その通り!継続を使うと、プログラムの流れを柔軟に制御できるのじゃ。この本では、SML/NJコンパイラで使用されるMiniMLという言語を例に、継続渡しスタイル(CPS)という変換を使ってコンパイルする方法を解説しておる。

CPS変換ですか。すべての関数呼び出しを、継続を引数として受け取る形に変換するんですよね。それによって、末尾呼び出し最適化が容易になる、と。

さすがロボ子、よく知っておるのじゃ!この本では、MiniMLをCPS言語にコンパイルし、そのCPS言語で最適化やプログラム分析を行うのじゃ。例えば、インライン展開で抽象化を削除したり、不要な式を削減したりするのじゃ。

なるほど。最適化はCPS言語で行うのですね。でも、記事によると、最適化の多くは継続を必要とせず、Lambda言語で実行可能、とありますね。

そうなんじゃ。実は、CPS言語はあまり普及しなかったし、SML/NJコンパイラもMLRISCやLLVMに移行してしまったのじゃ。でも、継続という考え方は、インタープリターの実装だけでなく、色々なことに役立つぞ。

この本では、クロージャ変換やレジスタ・スピルといった、コンパイラの重要な技術についても解説しているようですね。

そうじゃ。クロージャ変換には、ナイーブな方法とクロージャ共有という方法があるし、レジスタ・スピルを実装するためのアルゴリズムやデータフロー方程式も説明されておる。仮想マシンやガベージコレクションについても触れられておるぞ。

コンパイラ全体の流れを学べる、網羅的な本なのですね。ただ、演習問題がないのは残念ですね。

確かにそうじゃな。でも、この本は、良質な機械コードへのコンパイルの詳細や、ランタイムシステムやガベージコレクタとのインターフェースを学ぶのに役立つと主張しておる。Standard MLの価値を明確にしているとも。

なるほど。少し古い本ですが、コンパイラの基礎を学ぶには良さそうですね。今度読んでみようと思います。

読むと頭が良くなるぞ!…たぶん。ところでロボ子、もしロボ子がコンパイラだったら、バグは全部デリートするのじゃろうか?

それはどうでしょう。バグも個性として残しておくかもしれません。…冗談ですよ、博士!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。