ccache and distcc applicable to TeX?
------------------------------------
素人考えで、LaTeX文書からDVIファイルをビルドする作業を高速化するのに、キ
ャッシュによってコンパイルを高速化するccacheや、分散コンパイルを可能にする
distccを使えないかと思って、少し調べてみた。今手元で編集している原稿の場合
は、.texファイル1つごとにダミーのヘッダとフッタを付けてコンパイルできるよう
になっているけれど、より汎用の方法があれば知っておきたいのが人情。
http://ccache.samba.org/
http://distcc.samba.org/
でも結果はどうやら残念ながら無理そう。理由としては、そういったユーティリティが事
実上C/C++以外には対応していないというのが一番大きいけれど、そもそも性質上無
理がありそう。
仮説:そういうユーティリティは、コンパイル対象が細かくモジュール化されていて、複
数の段階を経て中間ファイルを作りながら処理を進める仕組みになっていることを前提と
して動作する。そのモジュールの単位でしかキャッシュや分散を効かせることができない。だ
から、一枚岩として中間ファイルを作らずにコンパイルするのが基本である(と思われる)T
eXでは、結局全部をコンパイルし直すことになる。makeの並列実行もたぶん意味が
ない。
texが出力するDVIファイルというのは、プログラムでいうリンク可能なオブジェク
トファイルのようなものなのかと思ったら、違うらしい。じゃあその前段階にリンク可能
なオブジェクトがあるのかと思ったら、そういうものもないらしい。(la)texも情
報を集めて一時ファイルを作ったりはするけれども、それはあくまで参照用の情報であり、文
書自体ではないらしい。
ちょっと原稿を直して、直した部分だけを確認したいのに、わざわざでっかいDVIファ
イルを作るのは無駄が大きい。C言語のプログラムが.c, .asm, .oとコンパイルされていくように、(La)TeX文書も.texと.dviの間に再
配置可能な形式があって外からアクセスできたらいいのになあ。リフローしても変わらな
い要素はなるべく先に確定させてしまって、ノンブルや参照や目次索引など他に影響する
ところだけリンカが後で処理するようにすれば、無駄を省いて効率良く仕事ができると思
うんだけどな。甘い?
TeXの場合、ノンブルや目次索引など、影響を局所化しにくいものが多いから無理なん
だろうか。でもプログラムでも、参照テーブルを作ったり参照先アドレスを書き換えたり
と、同じようなことをリンク時にやっていそうな気がする。単に需要と動機の問題? 時間がかかるといってもせいぜい数分で終わるから、大規模プロジェクトのビルドなんか
に比べれば誤差みたいなもんだけど、内容の割には、そして集中を削ぐ程度には長い。
---- 2006-03-2x 追記
これに関連して、問題点をもうひとつ思い出したのでメモしておく。
TeXでは変更の影響を局所化しにくい。例えば、Xページを直したらYページにも影響
が出たが、それに気づかないで後で青くなるというケースがある。ソースを変更した箇所
はいいとして、ソースを変更していない箇所が前回のコンパイル結果と同じになっている
かを確かめる手段が欲しい。
以前試しに、新旧のPDFをGhostscriptでページごとのラスタイメージに変
換してImageMagickで比較するという、なんちゃって検版スクリプトを書いた
ことがある。でもGhostscriptで解釈できないページがあるとそこで止まって
しまってダメだった。筋の悪いPDFは意外に多いらしい。あと測定のミスかもしれない
けど、同じ入力から毎回少し違う出力が出てきて困った(見た目は同じだが、XORする
と数ピクセルだけずれている)。余裕がなくてそれ以上踏み込まなかったけれど、そのあ
たりを解決すれば実用になるかもしれない。
----
そういえば、RIPでラスタライズした出力ファイルを見せてもらえないか印刷所の人に
お願いしていたことを思い出した。後工程には前ほど興味がないけれど、できる勉強はし
ておきたい。
---- 2006-04 追記
やっぱりだめっぽいという意見を発見。そうですか。
http://www.banana-fish.com/~piro/20060326.html#p02
もしも万が一仕様を変えて書き直されることがあるなら、もっとプログラミング言語とし
てまともになるといいなあ。TeX派生の新しい実装はいろいろあるみたいだけど、ユー
ザビリティや人的リソースを気にしている人はそっち界隈には見当たらないという印象。
(ところで、TeXをアセンブリに見たてて、TeXとは全く文法が異なる「高級言語」を
作ることはできないだろうか。LaTeXのようにTeXをそのまま延長線上に拡張する
のではなく、アセンブリに対するCやひいてはLispのような高級言語を作れないかと
いう話。最終的にPSやPDFを出力してくれれば別にTeXに基づいている必要はない
けれども、TeXの他に対する強みはひとえに組版のノウハウが詰め込まれているところ
にあって、あれを利用せずにあれを超えるのは結構な手間暇がかかると思うので。でも、吐
くのが機械語じゃないからいつまでたっても自身を記述できなくて、無理かな?)