このページは、Emacs Advent Calendar 2016 が空いていたので、休日の暇な午前中を使って、こっそり駄文を仕込むものです。読んでも1ビットもEmacsの利便性は向上しませんので、その点をご覚悟とご了承の上、お読みいただければ幸甚です。
GNU Emacs が誕生してから、31年が経過しました。流石に歳を取りました。
30年前といえば、日本の Unix 界隈ではまだ JUNET だのシグマプロジェクトだの発足したての頃です。インターネットはまだ一部の大学や研究機関にしかない時代だったようです。64kbpsの回線がバックボーンと呼ばれ、常時接続するだけで、毎月、ウン十万円のお金が取られていたそうです。資金に余裕のある組織は、3.4Kbpsで常時接続していたそうです。そんな時代にできた GNU Emacsが、まだ使われているのです。(伝聞系なのは全部、古老の話の聞き伝えのためです。)
1985年頃、Gosling Emacs をシグマプロジェクト向けに日本語対応させたシグマEmacsが誕生し、これが日本語対応Emacs普及の嚆矢となります。のちにシグマEmacsは、ソニーのNEWSワークステーションにも搭載されたそうです。ただ、シグマは色々とアレだったそうですし、高価な商用ソフトウェアであったため、「無料で、ソースコードが読めて、かつ自分で自由に改造できて、拡張もLispプログラムで可能な」テキストエディタ〝GNU Emacs” 爆誕は当時の Unix な人々に、救世主のように見えたそうです。
ただし当時は、個人はおろか、企業ですら GNU Emacs のソースコードをネットでダウンロードするのは困難だったそうです。新しいバージョンが出る毎に、マサチューセッツのFSFから航空便でソースコードを磁気テープで送ってもらい、それを東京都内の某ソフトハウスでコピーして、有志がバイクで都内各所を周り、希望者に配布していましたそうです。ソースコードが自由にいじれるため、日本語対応を試みる人も雨後の筍のように現れました。とはいえ、syntax や category 等の日本語対応は設計方針を決める段階から困難で、フルスクラッチで書き直す人々がでる一方で、本家GNU Emacsの日本語対応は電総研の「日本語Emacs(NEmacs)」に収斂していったようです。
さて、30年以上前からメンテナンスされている大型ソフトはそれほど多くは無いと思います。GCCもまだ28年です。思いつくのは、X Window System (1984年生まれ)、TeX/LaTeX (1978/1985年生まれ)、Emacs(1985年生まれ)くらいしかないのではないでしょうか。その中でも未だに、各種メジャーOSで利用でき、毎日、多数のメンテナからパッチがコミットされているのは Emacs くらいなものではないかとも思っています。
30年前も重すぎると叩かれていた Emacs ですが、当時に比べてCPUもメモリもネット帯域も何千倍も進化した今でも重いとか言われるのはいったいどういうことなんでしょうか。(お
これだけ長い間使われていると、利用者の年齢分布も、10歳代台から60歳代まで、幅広く分布してきます。1980年代・90年代に活躍したEmacs開発者を過去の変更履歴から検索すると、すでに鬼籍に入っている人もいます。
話が脇道にそれますが、Emacsのあまり知られていない特筆すべき特徴の一つとして、30年近い変更履歴をきちんと保存してきたことがあります。Emacsのバージョン管理は、RCS・CVS・Bazaar・Git と変遷を続けてきました。そして新しいバージョン管理システムに移行するたびに、過去の変更履歴は細心の注意をもって移行されてきたのです(開発のごく初期の履歴を除く)。そのため、我々はたとえば「この変更はいつ行われたのだろう?」という疑問を、1990年代まで遡って調べることができるのです。これは、実は凄いことです。この履歴をgit の log機能で見ると、色々と気付かされます。きちんと手入れされたご長寿ソフトウエアは、多くの場合、当初に比べてソースコードが読みやすくなります。古く汚いコードは抽象化・局所化されて見やすくなり、不要な機能は削ぎ落とされていくからです。Emacs に今でも大掛かりな新機能を入れやすいのはそのためです。
さて、話を戻します。開発者が幅広い年齢層に分散し、ソースコードの経緯を知る人々が高齢化すると、序列のようなものが形成され、意思決定が遅くなるのは仕方がないです。そして、その遅さのために、今、Emacsの存亡の危機が刻一刻と迫ってきています。そして開発コミュニティはなかなか身動きできていません。いわゆる unexec 問題です。
unexec とは、exec の逆です。execは、実行バイナリをファイルからメモリに読み込んで実行しますが、unexecは実行中のメモリからバイナリをファイルに書き出し(ダンプ)ます。そしてこの機能は「Emacsの中核部分だけはCで書き、残りは別言語(Emacs Lisp)で書いて初期化する」役割分担に利用されます。すなわち、Cで書かれた中核部分 (temacs) が、lispで書かれた部分を読み込み、各種変数を初期化したメモリをそのままダンプして、実行ファイルを生成するまでの仕組みがEmacsに入っているのです。
unexecの肝は「リンカ」なのですが、この部分をOSに頼らずに実現することはできません。Emacsでは、Linux・Windows・Macなど、各種プラットフォーム用にばらばらに unexecが用意されています。Linux版のEmacs はunexecを実現するために、glibcの malloc() の途中状態を操作する、malloc_get_state() および、malloc_set_state() 関数を使っています。
しかしこれら2関数は、10年以上、Emacs以外では使われていない関数でした。かつては、TeXもEmacsと同様に、中核のinitexにマクロをコンパイルしたものをダンプして plain tex や latexを生成していましたが、この仕組は2000年代までになくなりました。そして、このEmacsのためだけにしか使われない関数のため、glibcのmallocは最新のメモリ管理技術への対応が遅れています。そして1年以上前から、glibcの開発陣は、Emacs開発者グループに対策を求めてきました。
今年の10月、glibcの先端ブランチから、malloc_get_state と、malloc_set_state は削除されました。これらの関数がない glibc2.2 5が、予定されてる2017年2月にリリースされると、Emacsはコンパイルできなくなります。(さらっと言いましたが、この間には幾つかの議論や誤算がありました。詳しく知りたい人は巻末のリンクを参照)。
すなわち、Emacsはいよいよ、 unexec から脱却しなければいけません。その1つの有力な代替方法は portable dumper です。portable dumper は、従来のメモリから実行ファイルを直接ダンプするというOS依存の手法から脱却し、Lispのメモリ状態をプラットフォームに依存しない形でファイルに取り出す手法です。これにより、各機種・OS毎に unexec をばらばらに実装する必要がなくなり、ソフトウェアの可搬性も高まります。
GNU Emacs への portable dumper の最初の実装は、2002年に京大で行われ、その成果はMeadowに取り入れられました。しかし、portable dumper の最大の難点は、その性質上、Emacsの最深部に関わる変更する上に、インクリメンタルな開発とデバッグが困難なところにあります。この portable dumper を本家 GNU Emacsに入れようとする動きはありました。しかし、当時は10年以上、無事に動き続けているソフトウェアの根本を変更する機運がなく、結局、本家のEmacsに入ることはありませんでした。しかし今、この状況を打開するために、改めて Portable Dumper が4,000行以上のパッチとして提案されたのです。最初の提案から14年、Emacsの内部オブジェクトデータ構造も大きく進化しており、当時に比べてさらに Portable Dumper の実現は難しくなっています。
長寿ソフトウェアでは、安定性重視のモーメンタムが大きく、大規模改造がすんなりと受け入れられるのは困難です。Emacsでは、若年層のCの部分の開発者の少なさの問題もあり、「自分たちの手が負えないのではないか」「若い人たちがEmacs開発コミュニティに入ってこなくなるのではないか」などの意見が交錯し、なかなかまとまりませんでした。
はっきり言います。もはや、EmacsのC部分の全貌をきちんと把握しているアクティブな開発者は、片手で数えるくらいしかいないのです。30年の間に、能力の衰えを感じたり、興味を失ったり、別の職業についたり、管理職として忙しくなったり、または不慮の事故や病気などで、多くの初期メンバーは去って消え、後継者は少数しか育ちませんでした。
さて、タイムリミットである 2017年2月は刻一刻と迫ってきています。Portable Dumperのテストブランチもなんとか動き始めました。しかし、未だにEmacs開発者MLは揺れ続けているようにも見えます。30年無事に動いてきたシステムの根幹を変更する責任を負う勇気を、一部の開発者はなかなか持てないのです。表面的な変更で何とか対応できないか、模索する動きもまだ残っています。
Emacsは衰退しました。
そして来年の2月、glibc 2.25 のリリースと同時に、死ぬかもしれません。
多分、死なないと信じています。ここにきて急激に、Portable Dumper ブランチのテストが盛り上がっています。しかし、事態はここに至っても流動的です。
かつて、GNU Emacs は、FSF のGNU Manifesto と同時に登場しました。マニフェストに賛同した多くのフリーソフトは、配布tarファイルを紐解くと、README, INSTALL, ChangeLog, configure, GPLを謳ったLICENSEファイルが同梱され、マニュアルはTeXinfoで書かれ、綺麗に印刷できると同時にEmacsのinfoで分かりやすく読むことができました。かつて、すべての自由なソフトウェアの中心にEmacsがいました。今はもう、その時代の面影はありません。
参考文献