あるいはGNU Emacsのビルド時の特徴
2018-08-10 TANAKA Shinichi
みんな大好きなテキストエディタ
- コアとその他機能が分離されている
- それにより高い拡張性をもつ
- ほとんどのエディタ機能がEmacs Lispで書かれているほど
- 拡張性高すぎてtwitterとかできる😎
- 画像すら表示できてしまう
- 全機能のドキュメントを内包している
- 自由ソフトウェア である
- GNUの筆頭プロジェクト
- もちろん使ってるよね…?
- 激重なんじゃないの…?
- 「お父さんが使ってます!」
これほどまで多機能で重そうなのに GNU Emacsの起動がなぜ速いのかをお話します
そのために、まずはGNU Emacsのソースコードを眺めてみる
- バージョン
- GNU Emacs 26.1
- ソース
- https://git.savannah.gnu.org/cgit/emacs.git/snapshot/emacs-26.1.tar.gz
GNU Emacsのコア機能はC言語、その他の機能はEmacs Lispで書かれている
コア機能とそれ以外の機能の量を比較すると…
~/emacs-26.1$ find . -name '*.c' | wc -l
281
Emacs Lispのインタプリタを含んでいる
~.emacs-26.1$ find . -name '*.el' | wc -l
1764
コアに対してEmacs Lispの数が約6倍
問い. 2000弱あるEmacs Lispを高速にロードする方法とは?
Emacs Lispファイルは起動時にロードされていない 実行ファイルの中に既にロードされているのだ…
- Emacs Lispやファイル操作等のコア部分をビルドする
- 裸のGNU Emacs実行ファイル
temacs
ができる
- 裸のGNU Emacs実行ファイル
- できた
temacs
でコア以外の機能(マウスホイールサポート等)をロードする- メモリ上にELispの解釈結果が乗る
- メモリに乗ったELisp解釈結果を
temacs
に書き戻してリンクする- 実際に使う実行ファイル
emacs
ができる - こいつには
2.
でロードした機能が始めから書き込まれている!
- 実際に使う実行ファイル
どういうこったい…🤔
ビルド過程の
- メモリに乗ったELisp解釈結果を
temacs
に書き戻してリンクする
を実行するために用意されている関数
exec
は、実行バイナリを読み込んで実行できる形でメモリにロードする
unexec
は、実行できる形(マシン語)になったメモリ上のデータを実行バイナリの形で吐き出す
メモリ上のデータ形式は アーキテクチャにがっちり依存 するので、
unexec
の実装はアーキテクチャが増える/変わる毎に作り直す必要がある
_人人人人人人人人人_ > めっちゃつらい <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
GNU Linux版 unexec
は glibc
の拡張機能を使って実装されていた
malloc
の途中状態を読み取る機能- ほかには ptex や latex が昔この機能を使っていた
しかし glibc
開発メンバーがその機能を消すことを宣言
その理由は:
- 10年以上、GNU Emacsしか使っていなかった
- その機能のせいで最新のメモリ管理技術を取り入れられない
“Emacsは衰退しました - Qiita”, http://archive.fo/WgLkS
- GNU Emacsは実行バイナリにロード後のElisp実行状態をぶっこんでいる
- それは廃止される機能を利用している
- そして実際に廃止されました
……。
つ い に E m a c s は 死 ぬ の か …
解決策: Elispの実行状態を アーキテクチャ非依存な形 で吐き出せばよい
- とても巨大なGNU Emacsの最下層に手を入れなければならない
- テスト・品質保証どうするんだ
- 保存すべきElispインタプリタの状態(グローバル変数)を特定するのは 手作業
でも、無事に取り込まれて GNU Emacsはこうして動いています
Portable dumperは開発者の中でも賛否両論
- 「これ入れるんなら開発者止める!!」と言った人も。
10年前に一度京大の人がPortable Dumpoerを提案したら、却下されたらしい
- 変更がでかすぎて開発者が拒否したんだそうな
- 論文
- “portable dumper: アーキテクチャに依存しない Emacs の起動時間短縮手法”, 永野圭一郎, 林芳樹, 2002,
- GNU Emacsは実行ファイル自体にELispコードを読み込んだ状態なので速い
- その影には黒魔術的なテクニックが潜んでいる
- そのおかげで存亡の危機に晒されたこともあった
- しかしそれをも克服する執念をもっている
つまり…
E m a c s は 永 遠 に 不 滅 で す ! ! !
Emacsの実装は一つではない!!
- EMACS
- TECOエディタのマクロ集
- EINE / ZWEI
- LISPマシン用
- Gosling Emacs
- 初のUNIX上Emacs
- ちなみにJavaの開発者のJames Goslingの作
- GNU Emacs
- Richard M. Stallmanの作
- いろんな派生がある
- XEmacs
- GNU Emacs 19.xのフォーク
- 自由ソフトウェアのフォークの初期の例
- Meadow
- Windows用で日本語入力ができる
- GNU Emacsフォーク
- ファイルへの入出力
- バッファ(編集領域)の基本構造・基本操作
- Emacs Lispのインタプリタ
- X Widndow Systemとのやりとり