つまり、Emacs 20 に dynamic loading 機能を付けてしまおうという訳です。
dynamic loading 機能というのは dynamic loading module を読み込む機能のことで、これにより、従来 compile 後には拡張できなかった組み込み (builtin) 関数を実行時に load 出来るようになります。
え、何がうれしいかって?
例えば、library とかの関係で C の世界で書かざるを得なかったようなこととかを実行時に拡張できます。 あるいは、elisp で書くと遅いような部分を C で置き換えるような場合にも便利です。
汎用性のない特殊用途用の機能を 組込み関数として実現したい場合にも便利でしょう。 『Emacs に組み込んじゃうのもなんなんだけど、elisp で書くのもなんだよなあ』というような場合に dynamic loading module 化するのは良い方法でしょう。
組み込み機能を開発する場合にも dynamic loading 機能は便利です。もし、emacs に組み込んでしまうと、修正するたびに link して、dump しなおしになります。遅くて鬱陶しいです。 『たった1行変えただけなんだけどなあ』と嘆くことになります。 こういう場合に dynamic loading 機能があれば、変更した dynamic loading module だけを再 compile するだけです。
ELF 形式が普及している今、dynamic loading 機能を使わない手はないでしょう。
では、dynamic loading 機能付き Emacs 20.4 を作ってみましょう。
まず、 Emacs 20.4 用の dynamic loading patch [注1] を手に入れます。
- [注1]
- この patch は元々 g新部さんが Guile の dynamic loading を元に作成したもので、その後私が細々と管理しています。
% tar xvzf [source 置場]/emacs-20.4.tar.gz
% tar xvzf [source 置場]/leim-20.4.tar.gz
% cd emacs-20.4
% zcat < [source 置場]/emacs-20-dl.diff.gz | patch -p1
これらを使っている方はラッキーにもすぐに compile することが出来ます。
現在 support している OS 以外の場合でもすぐにあきらめる必要はありません。
例えば、ELF 形式を採用しているシステムの場合、emacs-20.4/src/s/ 以下に存在している OS 依存定義 file の適当な場所に
#define HAVE_DYNAMIC_LOADERを書き込めば動く可能性が高いです。
#define HAVE_LIBDL
それ以外でも OS が dynamic link を support していれば動く公算が高いです。
また、それ以外でも scm の dld が動く OS だと動くかも知れません。
もし運良くうまく動いたら patch をください。(^_^;;;
emacs-20.4/INSTALL を見て install してください。
私の場合、
% ./configure --infodir='${datadir}/emacs/${version}/info'という手順でやっています。configure の option はお好みでどうぞ。
% make
うまく build できたら、install しましょう。私の場合、
% make installします。
いくつかの dynamic loading module が公開されています。例えば、
その昔、base64 encoder/decoder を dynamic loading module にした ``mel-dl'' というのがありましたが、Emacs 20.4 には base64 用の組み込み 関数が追加されたので…
大本の patch を作成されたg新部さん、および、その元ネタとなった Guile / scm の開発者に感謝します。
また、FreeBSD 用の patch を送ってくださった方(名前をお忘れしました。 申し訳ありません)および NetBSD, BSD/OS 4 用の patch を送ってくださっ た伊藤 (Kenji Itoh <keit@tpj.co.jp>)さんに感謝します。