言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Linux で文芸プログラミング

Scratch Conference で Active Essays のデモをした時のコメントに、これって文芸プログラミングに似てない? というのがありました。そうそうそうなんです! と言ってみた物の、実は自分で文芸プログラミングを体験した事無いのです。C5 では Active Essays の話を書きますとみんなに約束をしたので、これを機に試してみる事にしました。

tex はどのように出来ているか?

有名なのが Knuth による TeX の実装自体が文芸プログラミングになっている話です。TeX の実装は web という Pascal ソースコードTeX コードを混ぜた形になっていて、一つのファイルからプログラムとドキュメントが出来上がる仕組みになっています。ちょっくらダウンロードします。

wget http://tug.org/texlive/devsrc/Build/source/texk/web2c/tex.web
weave tex.web
tex tex.tex
dvipdf tex.dvi 
evince tex.pdf

まずこれで TeXソースコードから PDF ドキュメントが出来ます。

wget http://tug.org/texlive/devsrc/Build/source/texk/web2c/tex.ch
tangle tex.web tex.ch

これで tex.p という Pascal ソースコードが出来上がります。このソースコードからどうやったら tex のバイナリが出来るのかは分かりませんでした。ちなみに、すごい難読化されたソースコードになります。

文芸的プログラミングとはどのような物か?

参考までに、Hello World のプログラムを実際に文芸プログラミング(WEB)で書いてみました。

% hello.web
\centerline{\bf Hello World}
\centerline{\sl by Takashi Yamamiya}
\vskip .5cm
This is a silly example for WEB.

@ First, it decides a text printed.
 
@<Content to print@>=
'Hello, Literate Programming!'

@ This is the top level definition. $\langle$ $\rangle$ expression is
substituted by its definition.

@p
Program HelloWorld(output);
begin
  @<Do something inside a program@>
end.

@ You can define an identifier after reference in WEB language.
@<Do something inside a program@>=
writeLn( @<Content to print@> )

たかが Hello World に何て大げさな。。。コンパイルはこうします。

tangle hello.web # Pascal ファイルを作る。
fpc hello.p      # 実行ファイルを作る。

文書を読むにはこうします。

weave hello.web  # tex ファイルの作成
tex hello.tex    # dvi ファイルの作成
xdvi hello.dvi   # div ファイルの閲覧

大雑把に文法を書くと、まず地の文には TeX をそのまま使います。セクションは @ (@ とスペース)で始まり、一つのセクションには文書、マクロ、プログラムが含まれます。プログラムは @p か @< で始めます。@< で始めた場合は定義文(マクロとだいたい同じ)の開始になります。

Pod や JavaDoc と違うのは、WEB がマクロ機能を持つことです。これで Pascal の先に定義されたシンボルしか使えないという制限を回避します。プログラマが考えた順序でプログラムを理解するのが一番自然であるというのが Knuth の意見なので、Pascal の機能制限の回避は大きな意味を持ちます。

Knuth の自信

knuthweb.pdf を読むと、Knuth の並々ならぬ自信の程が伺えます。私もこうありたい物です。

Now that I am writing all my programs in WEB, an unforeseen problem has, however, arisen: I suddenly have a collection of programs that seem quite beautiful in my own eyes, and I have a compelling urge to publish all of them so that everybody can admire these works of art. A nice little 10-page program can easily be written and debugged in an afternoon and evening; if I keep accumulating such gems, I’ll soon run out of storage space, and my office will be encrusted with webs of my own making. There is no telling what will happen if lots of other people catch WEB fever and start foisting their creations on each other.

最近ずっと WEB でプログラムを書いていますが、ちょっと問題があります。すごくかっこいい沢山のプログラムが出来ちゃったのです。早く出版して自慢したくてたまりません。ナイスな 10 ページ程のプログラムがたった一日で出来ちゃうし、そういうのがどんどん溜まって部屋が一杯になって、オフィス中私の作品でこんがらがりそうです(訳注: ここは WEB の入る洒落が思い浮かばなかった)。他のみんなも WEB 中毒にかかってしまってお互いの作品を押し付け合うハメになるとも限りません。