Emacsのportable dumperとTeX
ポ〰タブルダンパ〰(ガ〰リッシュナンバ〰風)
Emacs27からはportable dumper
NEWSにもあるようにEmacsはversion27からportable dumperという手法が用いられる。
これについて調べたらTeXとの関連があるみたいなので、それについてメモ。
emacs
実行可能バイナリの作られ方
そもそもEmacsはコア部分はC言語で実装され、それ以外の部分はEmacs Lispで実装されている。 EmacsはEmacs Lispを拡張言語とし、Emacs Lispインタプリンタとしての側面も持つ。
このような実装であることから、Emacsの起動において、「C言語からのバイナリ(Emacs Lispインタプリタを含む)」が読み込まれ「C言語以外の部分のEmacs Lispファイル」が全て評価された後に利用可能になる、というのは起動に時間がかかりすぎという問題がある。
これに対処するために、従来まではunexecという手法が用いられていた。
これは「Emacs Lisp評価後のEmacsプロセスのメモリ上のデータから実行ファイルにする」という手法である。
この手法で得られたemacs
を実行すると、Emacs Lispファイルの読み込みやその評価は発生せず、高速に起動できる。
しかし、この手法はメモリ上のデータから実行可能ファイルを組み立てるという手法であることから、実装がプラットフォームに依存し移植性がない。 そこで、Emacs 27からはunexecではなくportable dumperという手法になった。 これは評価後の状態をemacs.pdmpというファイルにダンプし、起動時にこれを読み込むという手法である。
(portable dumperの提案自体は相当前にあって、詳しい説明は http://lc.linux.or.jp/lc2002/detail.html#c37 の配布資料PDFを見るとだいたい理解できます)
TeXでの話
実は上のPDFにTeXについての言及がある。
TeXはportable dumperと同様のことをすでに行っているとのこと。
例えば、tex
というコマンドはtex.fmtというファイルを実行時に読み込む。
tex.fmtはplain.texというマクロパッケージの評価後のダンプであり、これはEmacsのportable dumper手法におけるemacs.pdmpに相当する。
portable dumperのメリットとして、ユーザ各自が編集するinitファイル評価後のemacsから再びダンプして、initファイルも含めて起動時間を高速化しようという試みが考えられることである(initファイルのせいで起動時間が長くなりがちなEmacsユーザにはありがたいものだが、現在はまだできないらしい)。 これはTeXにおけるマクロパッケージ(plain TeXやLaTeX)の変更に相当すると考えられる。(こじつけかもしれない...)
また、EmacsではRustでEmacsを作り直す(Emacsのコアの関数、Emacs Lispインタプリンタを実装し直す)remacsというプロジェクトがある。 これはTeX処理系(エンジン)(TeXやpdfTeX、pTeX)の変更に相当すると考えられる。(こじつけかもしれない...)
フォーマットファイルの出力
TeX Liveで、どの処理系が、どの<なんとか>.iniファイルを使ってフォーマットファイルを出力するかはfmtutil.cnfで決まるみたいだ。
ところで、Knuth先生オリジナルのTeX処理系は、texフォーマットファイル(tex.fmt)の出力にしか使われていない(etex
もlatex
もpdfTeXが使われている)。
tex
が残されている理由は以下の参考文献に示されていたので参照されたい。
また、TeX処理系実行時にどのフォーマットファイルが使われるかは、実行するファイル名で決まるようだ。例えばetex
はpdftex
のシンボリックリンクとなっていて同じ実行ファイルが使われている。
終わり
Emacsがとうとうportable dumperに移れたのは喜ばしいですね。
参考:
- https://dancol.org/pdumperpres.pdf
- portable dumperの話 英語
- https://oku.edu.mie-u.ac.jp/texconf10/presentations/yato.pdf
- 異様な LaTeX の話 - マクロツイーター
- フォーマットファイルとTeX処理系のINIモードの話(めちゃくちゃ知りたい内容だった)
- 古い(1997年)Web2cマニュアル
- virgin formとinitial formに加え、preloaded formがあったことが書かれている
- 現在のWeb2cマニュアルにpreloadedについての記述はない