文芸的プログラミング (Literate Programming)
Donald Knuthが1984年の論文「Literate Programming」(The Computer Journal, Vol.27 No.2, pp.97-111)で提唱したプログラミングのパラダイム。コードの中にコメントを埋め込むのではなく、人間向けの文章の中にコード片を埋め込む。プログラムを「コンピュータへの指示」ではなく「人間に向けて、何をさせたいかを説明する文章」として書く。
考え方
- 「複雑なソフトウェアは単純な部品と部品間の単純な関係からなる。プログラマの仕事はそれらを、人間の理解にとって最適な順序で述べることだ」(Knuth)。
- コンパイラが要求する順序ではなく、説明しやすい順序でコードを並べられる。
- コード片には「◯◯を初期化する」のような説明的な名前のマクロを付け、マクロの中からさらに別のマクロを参照する。Knuthは「プログラムはさまざまな部品からなる web(網)として捉えるのが最もよい」と言っており、トップダウン・ボトムアップのどちらにも縛られない。
- Knuth自身、当初はドキュメントのための仕組みと考えていたが、WEBで書いたプログラムは他の言語で書いたものより良くなった、と述べている。説明を書くことで推論を明示せざるを得なくなるため。
tangle と weave
1つのソースから2つの成果物を取り出す。
- tangle — マクロを展開し、コンパイラが要求する順序に並べ替えて、コンパイル可能なソースコードを生成する。
- weave — 組版されたドキュメント(Knuthの場合TeX)を生成する。
同じファイルから両方を作るので、コードとドキュメントがずれない。
ツール
- WEB — Knuthのオリジナル。Pascal + TeX。コンピューティング分野でまだ使われていなかった数少ない3文字の英単語、ということで命名。
- CWEB — KnuthとSilvio LevyによるC/C++版。
- noweb — 言語非依存。
- Org-mode Babel — Emacs上で多言語のコードブロックを実行・tangleできる。
- knitr / Sweave — R向け。再現可能な統計レポート用。
- Jupyter Notebook — コードセルとMarkdownセルを交互に並べる。2010年代、データサイエンス分野での計算ノートブックの普及によって文芸的プログラミングは再評価された。
Literate Computing への拡張
IPython作者のFernando Pérezは2013年に「Literate Computing」という言葉を使い、文芸的プログラミングの一歩先として位置づけた。テキストとコードと実行結果を織り交ぜ、ナラティブを生きた計算の中に直接織り込む、という考え方。Knuthの文芸的プログラミングが「プログラムを説明する文章」なのに対し、Literate Computingは「計算とその結果を説明する文章」を主眼にしている。
この流れをインフラ運用に持ち込んだのがLC4RI。