Principia Softwarica
(principia-softwarica.org)- Principia Softwarica は、Plan 9 from Bell Labs のカーネル、シェル、ウィンドウシステム、コンパイラ、リンカ、エディタ、ブラウザ、デバッガのソースコードを書籍として読み解き、コンピュータ内部の動作理解を助けるシリーズである
- 各書籍は、ソースコードと文書を一体化した リテレートプログラム(literate program) から生成され、実際のコードと書籍は同じ文書から自動生成される
- シリーズ全体は 205,081 LOC、82,014 LOE、6,312ページ 規模で、目標はコード1行ごとに説明1行を対応させる LOE/LOC 1.0 の達成である
- Plan 9 はシステム全体が 183K LOC と小規模で、一貫した C スタイルと「すべてはファイル」、プロセスごとの名前空間、ネットワーク透過性といった考え方を均一に適用し、OS 全体を説明可能な対象にしている
- プロジェクトのソースは github.com/aryx/principia-softwarica で公開されており、Getting Started では Docker またはソースから Plan 9 をビルドして実行する方法を案内している
プロジェクト概要
- Principia Softwarica は、プログラマが使う中核的なシステムプログラムの全ソースコードを詳しく解説し、コンピュータ内部の動作理解を助ける書籍シリーズである
- すべてのプログラムは、Unix の後継として設計された OS である Plan 9 from Bell Labs から取られており、コードが小さくエレガントであることを重要な前提としている
- 対象となるプログラムには カーネル、シェル、ウィンドウシステム、コンパイラ、リンカ、エディタ、Web ブラウザ、デバッガが含まれ、それぞれが独立した1冊の書籍として構成される
- 書籍は実装を解説する文書であると同時に、実装そのものでもある
- 各プログラムは、ソースコードと文書をともに含む リテレートプログラム(literate program) から生成され、実際のコードと書籍の両方がこの文書から自動生成される
- リテレートプログラミングの詳しい説明は more about literate programming にある
- プロジェクトのソースは github.com/aryx/principia-softwarica で公開されている
なぜ必要なのか
-
教育の空白
- ターミナルウィンドウで
lsを入力すると何が起こるのかという問いへの答えは、シェル、C ライブラリ、カーネル、グラフィックススタック、ウィンドウシステムのすべてをまたぐ - Keith Adams はかつて Facebook の同僚で、その後 Slack の Chief Architect となった人物で、この問いを面接質問として使っていた。全体の追跡は The Journey of
lsにある - 今日の「フルスタック」は通常 React、Node、クラウドを指すが、実際の下位スタックには コンパイラ、リンカ、カーネル、システムコールがある
- システムプログラムの概念を説明する優れた教科書はあるものの、実際のソースコードを見せる資料はほとんどなく、Principia Softwarica はこの隔たりを埋めようとしている
- ターミナルウィンドウで
-
AI 時代における重要性
- AI コーディングツールは、Principia Softwarica が解説する
grep、sed、diff、awk、gcc、ldのようなプログラムを1日に何百回も実行している - コーディング作業においてコードを書くことが20%で理解が80%だとすれば、AI がその20%を担うほど、コードが実際に何をしているのかをハードウェアの層まで掘り下げて理解する80%の重要性は増していく
- 機械がディープラーニングを経てきたのだから、人間も深く学ばなければならないという問題意識が根底にある
- AI コーディングツールは、Principia Softwarica が解説する
書籍と範囲
-
シリーズ全体は 205,081 LOC、82,014 LOE、6,312ページ規模で、全体の LOE/LOC 比率は 0.40
-
LOC はコード行数、LOE は説明行数、Pages は組版後のページ数を意味する
-
目標はすべての書籍で LOE/LOC 1.0 を達成し、コード1行ごとに説明1行を対応させること
- 緑色は 0.75 以上で、目標に近い
- 黄色は 0.50 以上で、進行中
- オレンジ色は 0.25 以上で、まだかなりの執筆が残っている
- 赤色は 0.25 未満で、まだ大部分がコードで説明が少ない
-
中核システム
-
開発ツールチェーン
-
開発者ツール
-
グラフィックス
- Graphics stack: libdraw, libmemdraw, libmemlayer, libimg, 18,528 LOC, 5,753 LOE, 562ページ
- Windowing system: rio, libframe, libcomplete, libplumb, 8,825 LOC, 7,696 LOE, 362ページ
- GUI toolkit: libpanel, 3,749 LOC, 2,986 LOE, 170ページ
-
ネットワーキングとその他のプログラム
- Network stack: libip, lib9p, 19,769 LOC, 3,884 LOE, 578ページ
-
Web browser: mothra, webfs, hget webcookies uhtml resize, tcs, 12,949 LOC, 4,482 LOE, 384ページ
Plan 9を選んだ理由
- Plan 9は、システム全体を現実的に理解できるほど小さく、一貫したCスタイルで書かれており、いくつかの強力なアイデアを均一に適用している
- すべてがファイルである
- プロセスごとの名前空間を使う
- ネットワーク透過性を提供する
- macOSやWindowsほど華やかではないが、本質的には同じ中核サービスを提供している
- プロセスとメモリを管理するカーネル
- ウィンドウシステム
- シェル
- コンパイラ
- ネットワーキング
- グラフィカルアプリケーション
- Plan 9システム全体は、カーネル、コンパイラ、シェル、ウィンドウシステムなどをすべて含めて 183K LOC で、vim 350K LOC よりほぼ2倍小さい
- 400ページの本1冊が約12K LOCを扱うとすると、Principia SoftwaricaはPlan 9全体を約15冊で扱える
gdbのような単一プログラムには、その10倍の本が必要になるgccにはその100倍の本が必要になる
- WaylandはX11の現代的な代替であり、ClangはGCCの現代的な代替だが、「クリーンな再実装」だけでプログラムが小さくなるわけではない
- 最初から単純さを目標に設計されたPlan 9のアプローチによって、すべての行を本で説明できるようになっている
学んだ内容を他のシステムに適用する方法
- Plan 9を直接使う必要はなく、小さくてエレガントなOSを1つ理解すれば、Linux、macOS、Windowsに対する直観が得られる
- カーネル、コンパイラ、リンカ、シェル、エディタ、デバッガ、GUIツールキット、ネットワークスタックはすべて同じ根本問題を解いており、コードが5千行でも50万行でも問題の本質は同じである
- Plan 9のCコンパイラを読めば、GCCを探るときに必要な語彙が得られる
- Plan 9のリンカを一度で理解すれば、LLDの再配置処理も圧倒される対象ではなく、読める対象になる
acidがシンボルテーブルを読み、スタックをたどる方法を見ることで、GDBで何を見るべきかを学べる- 小さな実装は、大規模コードベースで 本質的複雑性 と偶発的複雑性を区別するための作業モデルを与えてくれる
- Plan 9のアイデアはすでに広く普及している
- UTF-8はThompsonとPikeがPlan 9のために作った
/procはPlan 9に由来する- Dockerやコンテナの基盤であるLinux namespacesはPlan 9に由来する
- GoはPikeとThompsonが作り、goroutineはPlan 9のlibthreadに着想を得ている
- 9PプロトコルはWSL2で使われている
- Principia Softwaricaが説明する
grep,sed,awk,diff,cc,ldはプログラマが毎日使うツールであり、同じ概念がPlan 9でははるかに明確に表現されている - plan9port はPlan 9ユーザー空間の
grep,sed,awkをLinuxとmacOSにもたらす - goken9cc は、Linux、macOS、WindowsでPlan 9 Cツールチェーンを使って、それぞれのプラットフォーム向けネイティブバイナリを作れるようにする
ソースコードと実行
- github.com/aryx/principia-softwarica — Principia Softwaricaで使われているPlan 9コードとリテラルプログラム
- Getting Started — DockerまたはソースからPlan 9をビルドして実行する方法
- The Journey of
ls— 単純なコマンドがシステムの各層を通過する追跡と、本同士がどうつながるか
OCaml移植と補助ツール
- 複数巻の本を書いた後、一部のプログラムが静的型付き関数型言語である OCaml に移植された
- 元の動機はCコードをより深く理解することだった
- プログラムを別の言語に移すと、どの部分が本質的で、どの部分が副次的かが明らかになる
- 移植版のバグは、原版に潜んでいた微妙な部分を浮かび上がらせる
- OCaml移植は別プロジェクトの XIX へと発展し、OCaml版ツールを扱う独自サイトと、リテラルプログラミングの書籍シリーズを持つ
- syncweb — すべての本を作るのに使われているリテラルプログラミングツールで、Nowebの後継である
- goken9cc — Linux、macOS、WindowsでPlan 9をビルドするためのCクロスコンパイラで、Kenccの後継である
関連する取り組みと違い
- Project Oberon は、コンパイラとウィンドウシステムを含むOS全体をフルソースコード付きで提示する点で、Principia Softwaricaに最も精神的に近い
- OberonはOberonプログラムしか実行できないため、Smalltalkのように美しいが孤立した自己完結世界である
- Plan 9とUnixは、どんな言語で書かれたプログラムでもコンパイルして実行できる汎用システムである
- Oberonにはネットワーキングがなく、カスタムハードウェア上で動作する
- Principia Softwaricaは、実際のOS上でコンパイラ、リンカ、シェル、デバッガ、グラフィックス、ネットワーキングまで、より広い範囲を扱う
- The Elements of Computing Systems はNand2Tetrisとしても知られ、NANDゲートからTetrisまでコンピュータを構築する
- 教育的には素晴らしいが、ハードウェアとソフトウェアはいずれも講義のために作られたおもちゃのCPU、おもちゃのOS、おもちゃの言語である
- Principia Softwaricaは、実機で動く実際のコードと実際のOSを説明するという逆のアプローチを取る
- Computer Systems: A Programmer's Perspective はCS:APPとして知られ、メモリ配置、リンク、仮想メモリ、並行性といったシステムプログラミングの概念を説明する優れた教科書である
- CS:APPは概念で止まり、実際のカーネル、実際のリンカ、実際のコンパイラのソースコードは見せない
- Principia Softwaricaはそのソースコードを行単位で説明することで、CS:APPを補完する
進行履歴と著者
- 2026年3月にPrincipia SoftwaricaのWebサイトが公開された
- 2025年にQEMUとRaspberry Piで再びビルド・実行できるよう再開され、DockerfileとCIが追加された
- 2019年から2024年までは Semgrep の仕事により中断期間があった
- 2017年にカーネルがRaspberry Piへ移植され、ShellとGraphicsの書籍作業が進められた
- 2016年にBuild Systemの本が完成し、最初のLibcoreおよびCompilerのリテラルプログラムが作られた
- 2015年にAssemblerとLinkerの本が完成し、Knuthに会った
- 2014年にPlan 9をフォークしてmacOSでクロスコンパイルし、最初のリテラルプログラムを作ったところからプロジェクトが始まった
- Principia SoftwaricaはYoann Padioleauによって書かれ、コードにはKen Thompson、Rob Pike、Dave Presotto、Phil Winterbottom、Tom Duff、Andrew Hume、Russ Coxのコードが含まれている
- Principia Mathematicaが数学の基礎を扱うように、Principia Softwaricaの目標は 基礎的なシステムプログラム を扱うことにある
1件のコメント
Lobste.rsのコメント
タイトルが明らかに Principia Mathematica を参照しているのは確かだが、「softwarica」はラテン語ではない。
ラテン語っぽく見せようとして書いた C の関数呼び出しが
foo(bar; baz]のように壊れている感じで、よりよい題名は「Principia Programmatum」(プログラムの原理)や「Principia Artis Programmatoriae」(プログラミング技術の原理)あたりかもしれない。ラテン語にはソフトウェアやプログラミングを指す語がないのだから、新語を作るのも構わない。
「Programmum/Programmatum」がもっともらしく聞こえるのは、英語の「program」がフランス語の「programme」を経て、さらにラテン語の「programmum」に由来するからだ。
フランス語の logiciel からより直接的に取るなら、「logique」(論理)+「iel」(matériel に由来する接尾辞)であり、これをラテン語の「logica」、「materialis/materia」と結びつけて、「program」を「logicia」、「programs」を「logicium」と訳すこともできるかもしれない。
ただ、ラテン語は高校で 2 年学んだ程度なので確信はない。
すでに死語であり、しかもよく知られた 失敗したプロジェクト を参照するタイトルなのだから、現代の英語の本にきちんとしたラテン語タイトルを付けること自体が少し滑稽でもある。
昔かなり流暢にラテン語を読めた立場からしてもそう感じる。
最初は Plan 9 という言及で身構えたが、著者がなぜ Plan 9 を選んだのかについての詳しい説明はよかった。
要するに小さいからで、その説明自体が本の宣伝としても優れた文章のように読める。
著者が OCamlをPlan 9へ移植 した後、C で何が起きているのかをよりよく理解するために、ユーザー空間の大部分を OCaml で書き直したのがよい。
その過程でコードが驚くことに Windows でも動くようになっており、誰がこの作業に資金を出しているのかも気になる。
https://aryx.github.io/xix/#about
本当に途方もなく大きな作業だ。
17巻、6,000ページ超 なのに、全部が先週公開されたように見える。
著者について追加の文脈や背景を知っている人がいるのか気になる。
https://www.mail-archive.com/9fans@9fans.net/msg45156.html
要約すると 2014 年に始まり、著者は明日、現地時間 13:45 に IWP9 でこの作業を発表する予定だ。
http://iwp9.org/#prg
もちろん著者自身はこの過程で非常に多くを学んだのだろう。
Principia Softwarica は、プログラマが使う中核的なプログラム群の全ソースコードを詳しく解説しながら、コンピュータ内部の動作を説明する書籍シリーズだ。
カーネル、シェル、ウィンドウシステム、コンパイラ、リンカ、エディタ、デバッガなどがそれぞれ別の巻で扱われ、対象 OS は Plan 9 のように見える。
ページには Learn Here, Apply Everywhere とあり、Plan 9 を使う必要はないと説明している。
小さくてエレガントな OS を 1 つ理解すれば、Linux、macOS、さらには Windows についても深い直感が得られる、という趣旨だ。
著者の言いたいことは分かるが、「Oberon は Oberon プログラムしか実行できない」というのは Oberon システム の制約と見るべきではない。
原理的には、どんなプログラミング言語でもそのアーキテクチャとランタイムを対象にできる。
Plan 9 から派生しているのは分かるが、Plan 9 と Inferno のどちらがより優れているのか気になる。
とても野心的なプロジェクトに見える。
良いコード、とりわけ設計上の選択について説明が付いたコードを読むことで、より良いプログラマになれると信じている。
自分の専門から少し外れた領域のコードならなおさらで、これは素晴らしい学習ツールになり得る。