自分だけのレトロコンパイラを開発する
(t3x.org)- Write Your Own Retro Compilerは、Z80ベースのCP/M上で動作し、同じ環境向けのコードを生成するセルフホスティングコンパイラを、全ソースとともに扱う339ページの書籍
- 実装対象のT3X/0はPascalとBCPLにルーツを持つシンプルな言語で、書籍内に20ページ分の完全なマニュアルを収録
- CやPascalのような手続き型言語とアセンブリ言語の知識が必要で、Z80アセンブリとCP/Mの基礎知識があると理解しやすい
- 字句解析、構文解析、コード生成、簡単な最適化、BDOSインターフェースとランタイムライブラリを、図・表・例で説明
- すべてのコードはパブリックドメインで提供され、紙の書籍・PDFの購入リンク、目次、サンプルページ、ソースダウンロードも公開
書籍の範囲と対象
- Write Your Own Retro Compilerは、2023年にLulu Pressから出た339ページ、図91点、6" x 9"判の書籍
- 中心テーマは、Z80プロセッサのCP/M上で動作し、同じ環境を対象にコードを生成するセルフホスティングコンパイラ
- コンパイラ制作の経験がなくても追っていけるように構成されている
- 実装言語であるT3X/0は、PascalとBCPLにルーツを持つシンプルな言語
- 書籍にはT3X/0についての20ページ分の完全なマニュアルが含まれる
必要な知識
- 少なくとも1つの手続き型プログラミング言語を知っている必要がある
- 例としてCとPascalが挙げられている
- アセンブリ言語も1つ以上知っている必要があり、理想的にはZ80 CPU向けアセンブリの知識が求められる
- CP/Mオペレーティングシステムの基礎知識も必要
- 独学する読者のために、Z80アセンブリ言語の短い紹介が含まれている
コンパイラの構成要素
- 多くの図、表、例でコンパイラ内部の動作を説明
- 扱うトピックは次のとおり
- 字句解析
- 構文解析
- コード生成
- 簡単な最適化
-
BDOSインターフェース
- ランタイムライブラリ
提供リンクとコード
- 書籍のすべてのコードはパブリックドメイン
- 紙の書籍を注文
- PDF版を注文
- 目次PDF
- サンプルページPDF
- ソースをダウンロード
- コードページ
1件のコメント
Hacker Newsのコメント
最近、コンパイラ本を出した。「Write Your Own Compiler」の拡張版に近く、今回は現代システムのELFではなく、Z80向けCP/Mコード生成を扱っているので、多くの部分がずっと単純になっている
4MHzのZ80システムで10分以内に自分自身をコンパイルするコンパイラを作るには、どの程度の複雑さが必要なのかが分かる。コードは無料だが、本は有料
ついでに、Forthについての無駄のない本と、Nils流の解釈も見てみたい
最近、こうした古いx86 CPU向けのCマルチパスコンパイラとアセンブラをTypeScriptで作った
https://github.com/Mati365/ts-c-compiler
Practical Compiler Construction第2版の紙の本を持っているが、かなり気に入っている。興味がある人にはNilsの本をおすすめする
この本は面白そう。ただ、いまだにThe Dragon Bookの本格的な後継書を待っている
現代CPU、できればGPU最適化まで扱い、高速な並行ガベージコレクタを備えた現代的な仮想マシンを設計して実装する方法も扱う本だといい。ある意味では、コンパイラを書くことより難しいかもしれない
制御フローグラフの構築、その上で可能な各種最適化、エイリアス解析、静的単一代入形式、CFG支配関係に基づく最適化、命令スケジューリング、レジスタ割り当て、目的コード生成まで扱っている。多くのコンパイラ本のように、字句解析、構文解析、NFA/DFAのような内容は扱わない
高度な解析を必要とする最適化コンパイラを作ろうとしている人には、Static Program Analysisも役に立ちそう: https://cs.au.dk/~amoeller/spa/
ガベージコレクションについてはGarbage Collection handbookがある: https://gchandbook.org/
ある程度の基礎知識があるなら、この講義が気に入るかもしれない: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
特にSSA形式の導入の仕方がよかった
より高度な話題はこちらにある: https://www.cs.cmu.edu/~15745/handouts.html
何かが「魔法」のように感じられるときは、誰かが限界だと思われていたものを賢く迂回したサインのように受け取っている。最近は、小さなスピーカーが実際に出せるより大きな低音を出しているように見せるフェイクベースについて読んでいるのだが、倍音を使って脳に実際より低い音を聞いているように錯覚させる仕組みが興味深い
面白そうではあるが、読者がまず新しいプログラミング言語であるT3Xを知るか学ぶ必要があるという欠点がある
外部との接点がキーボードと画面だけのレトロなCP/Mシステム上で、ゼロからコンパイラを書いて開発できるのかも気になる
SubCは3815行で、T3X/0は2330行
もちろん外部ツールなしでCP/Mから始めることもできるが、その場合はブートストラップ用コンパイラをアセンブリ言語で書かなければならない。時間はかなりかかるが、十分に可能なことではある。ただ、読み物として面白いかどうかは疑問
C風の構文ではなくALGOL風の構文を使うのは少し意外だが、これは自分の偏りかもしれない。頭の中で
DOとENDを{と}に対応させる程度なら、大きな負担ではない字句解析と構文解析の段階を越えて進むコンパイラチュートリアルなんて、ほとんど初めてではないかと思う
冗談だが、実際多くの資料はそこで止まってしまう。これは買ってみるつもり
自分だけのCP/M風オペレーティングシステムを書く本もあると面白そう
もちろんUnix風マイクロカーネルOSの作り方を示す本だが、ファイルシステムの章以外をすべて飛ばせばよい。そしてツリー構造に関する助言には従わず、フラットなテーブルだけを使い、正確なファイルサイズの実装も気にしなければよい。そうすればCP/Mになる
個人的には第2版のほうが好き。第3版はデモ用のMinixコードを1980年代のPCではなく1990年代後半のPCで動かすために、不必要に複雑になったと思う
否定的に書くつもりではなく、役に立つかもしれない観察として
無料の章を読んでみたが、この分野の知識が多くない人には、一部が難しいかもしれないように見えた。各見出しの下では「言語の文法とは……」のように概念を最初から説明しているのに、数文後にはアセンブリ命令のような高度な話題が説明なしに出てくる
読者が文法の意味を学ぶ必要があるレベルなら、そのすぐ次の文を理解するのは難しいかもしれない。なので、一貫性をもう少し高めると本の完成度が上がりそう
なので、アセンブリ命令のようなものは読者が知っていると仮定してもよいと思っていた
本の付録にはZ80アセンブリについての短い入門もあるが、それもアセンブリ言語の基礎は知っていることを前提にしている
どんな本もどこかから始めなければならない。コンピュータプログラミングの知識がまったくないと仮定してコンパイラ構成の本を書くのは難しい。ただし、知識の呪いがないという意味ではないので、この点は確かに念頭に置いておく
実際の本の内容とは別に、ぴったり合ったレトロでミニマルなWebデザインも気に入った
ノスタルジーを大いに刺激される。机の上に「HTML 3.2 UNLEASHED!!!!」のような題名の厚さ6インチの本を置いて、自分でサイトを作っていたよい思い出がよみがえる
ただし、静的ページ1500個ほどにグローバルな変更を適用しようとすると楽しさは終わる。まだCMSを自作するほど苦痛ではないが、たとえ作るとしてもデザインはそのままにするつもり
https://web.archive.org/web/20231210141834/http://t3x.org/t3...