3 ポイント 投稿者 GN⁺ 2023-12-11 | 1件のコメント | WhatsAppで共有
  • 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つの手続き型プログラミング言語を知っている必要がある
    • 例としてCPascalが挙げられている
  • アセンブリ言語も1つ以上知っている必要があり、理想的にはZ80 CPU向けアセンブリの知識が求められる
  • CP/Mオペレーティングシステムの基礎知識も必要
  • 独学する読者のために、Z80アセンブリ言語の短い紹介が含まれている

コンパイラの構成要素

  • 多くの、表、例でコンパイラ内部の動作を説明
  • 扱うトピックは次のとおり
    • 字句解析
    • 構文解析
    • コード生成
    • 簡単な最適化
    • BDOSインターフェース

      • ランタイムライブラリ

提供リンクとコード

1件のコメント

 
GN⁺ 2023-12-11
Hacker Newsのコメント
  • 最近、コンパイラ本を出した。「Write Your Own Compiler」の拡張版に近く、今回は現代システムのELFではなく、Z80向けCP/Mコード生成を扱っているので、多くの部分がずっと単純になっている
    4MHzのZ80システムで10分以内に自分自身をコンパイルするコンパイラを作るには、どの程度の複雑さが必要なのかが分かる。コードは無料だが、本は有料

    • Nilsが何を作るのかはいつも楽しみ。こういうことをビジネスとしても採算が取れる形で続けられているといいし、いつか全部買って追体験してみたい
      ついでに、Forthについての無駄のない本と、Nils流の解釈も見てみたい
  • 最近、こうした古いx86 CPU向けのCマルチパスコンパイラとアセンブラをTypeScriptで作った
    https://github.com/Mati365/ts-c-compiler

    • この本のコンパイラはもう少し古いZ80向けで、乗算や除算の命令すらない。それでもこのコンパイラは8086と386向けのコードも出力できる
  • Practical Compiler Construction第2版の紙の本を持っているが、かなり気に入っている。興味がある人にはNilsの本をおすすめする

  • この本は面白そう。ただ、いまだにThe Dragon Bookの本格的な後継書を待っている
    現代CPU、できればGPU最適化まで扱い、高速な並行ガベージコレクタを備えた現代的な仮想マシンを設計して実装する方法も扱う本だといい。ある意味では、コンパイラを書くことより難しいかもしれない

    • Bob MorganのBuilding an Optimizing Compilerは、現代的なコンパイラ最適化に完全に焦点を当てた本で、1997年に出版された
      制御フローグラフの構築、その上で可能な各種最適化、エイリアス解析、静的単一代入形式、CFG支配関係に基づく最適化、命令スケジューリング、レジスタ割り当て、目的コード生成まで扱っている。多くのコンパイラ本のように、字句解析、構文解析、NFA/DFAのような内容は扱わない
      高度な解析を必要とする最適化コンパイラを作ろうとしている人には、Static Program Analysisも役に立ちそう: https://cs.au.dk/~amoeller/spa/
      ガベージコレクションについてはGarbage Collection handbookがある: https://gchandbook.org/
    • 学生のころ、The Dragon Bookがあまり好きではなかった記憶がある。理由はもうよく覚えていないが、おそらく構成がよくなく、ある話題は細かすぎる一方で、別の話題は説明不足だと感じたのだと思う
      ある程度の基礎知識があるなら、この講義が気に入るかもしれない: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      特にSSA形式の導入の仕方がよかった
      より高度な話題はこちらにある: https://www.cs.cmu.edu/~15745/handouts.html
    • 自分もそういう本を期待してきた。最近は現代のマイクロコード/ファームウェアのような要素のせいで複雑になりすぎていて、魔法のように感じるものが多い
      何かが「魔法」のように感じられるときは、誰かが限界だと思われていたものを賢く迂回したサインのように受け取っている。最近は、小さなスピーカーが実際に出せるより大きな低音を出しているように見せるフェイクベースについて読んでいるのだが、倍音を使って脳に実際より低い音を聞いているように錯覚させる仕組みが興味深い
  • 面白そうではあるが、読者がまず新しいプログラミング言語であるT3Xを知るか学ぶ必要があるという欠点がある
    外部との接点がキーボードと画面だけのレトロなCP/Mシステム上で、ゼロからコンパイラを書いて開発できるのかも気になる

    • この点は本を書く前にかなり悩んだ。最終的にT3Xを選んだ理由は、そのコンパイラが最小のCサブセットコンパイラよりずっと小さく、個人的にはT3Xのほうが学びやすく理解しやすいと思ったから
      SubCは3815行で、T3X/0は2330行
      もちろん外部ツールなしでCP/Mから始めることもできるが、その場合はブートストラップ用コンパイラをアセンブリ言語で書かなければならない。時間はかなりかかるが、十分に可能なことではある。ただ、読み物として面白いかどうかは疑問
    • 欠点には見えない。コンパイラを書こうとする人なら、新しいプログラミング言語は大きな障害にはならない可能性が高いし、単純できれいなトイ言語のほうが教育用には向いていることもある
      C風の構文ではなくALGOL風の構文を使うのは少し意外だが、これは自分の偏りかもしれない。頭の中でDOEND{}に対応させる程度なら、大きな負担ではない
  • 字句解析と構文解析の段階を越えて進むコンパイラチュートリアルなんて、ほとんど初めてではないかと思う
    冗談だが、実際多くの資料はそこで止まってしまう。これは買ってみるつもり

  • 自分だけのCP/M風オペレーティングシステムを書く本もあると面白そう

    • それはAndrew TanenbaumのOperating Systems Design and Implementationだ
      もちろんUnix風マイクロカーネルOSの作り方を示す本だが、ファイルシステムの章以外をすべて飛ばせばよい。そしてツリー構造に関する助言には従わず、フラットなテーブルだけを使い、正確なファイルサイズの実装も気にしなければよい。そうすればCP/Mになる
      個人的には第2版のほうが好き。第3版はデモ用のMinixコードを1980年代のPCではなく1990年代後半のPCで動かすために、不必要に複雑になったと思う
  • 否定的に書くつもりではなく、役に立つかもしれない観察として
    無料の章を読んでみたが、この分野の知識が多くない人には、一部が難しいかもしれないように見えた。各見出しの下では「言語の文法とは……」のように概念を最初から説明しているのに、数文後にはアセンブリ命令のような高度な話題が説明なしに出てくる
    読者が文法の意味を学ぶ必要があるレベルなら、そのすぐ次の文を理解するのは難しいかもしれない。なので、一貫性をもう少し高めると本の完成度が上がりそう

    • 本の紹介にも書いたように、コンパイラ構成に関する事前知識は不要だが、読者は少なくとも1つの手続き型言語と1つのアセンブリ言語には慣れているべきだと考えていた
      なので、アセンブリ命令のようなものは読者が知っていると仮定してもよいと思っていた
      本の付録にはZ80アセンブリについての短い入門もあるが、それもアセンブリ言語の基礎は知っていることを前提にしている
      どんな本もどこかから始めなければならない。コンピュータプログラミングの知識がまったくないと仮定してコンパイラ構成の本を書くのは難しい。ただし、知識の呪いがないという意味ではないので、この点は確かに念頭に置いておく
  • 実際の本の内容とは別に、ぴったり合ったレトロでミニマルなWebデザインも気に入った
    ノスタルジーを大いに刺激される。机の上に「HTML 3.2 UNLEASHED!!!!」のような題名の厚さ6インチの本を置いて、自分でサイトを作っていたよい思い出がよみがえる

    • よい時代だった
      ただし、静的ページ1500個ほどにグローバルな変更を適用しようとすると楽しさは終わる。まだCMSを自作するほど苦痛ではないが、たとえ作るとしてもデザインはそのままにするつもり
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...