Evolution of Emacs Lisp副読本
Evolution of Emacs LispはACM SIGPLAN(プログラミング言語についての学会)で2021年に開催されたHOPL IV(History of Programming Language Vol. 4)という会議に投稿されたStefan Monnier氏とMichael Sperber氏による論文です。
このHOPL4の論文誌自体がとても興味が引かれる内容だったのですが、いままで斜め読みしかできていませんでした。この数日で一気に読んだらとても興味深かったので内容について補足します。
本文
私は英語がとても苦手なので、機械翻訳しやすいようにPDFの内容をMarkdownに起こすところから作業を始めました。
この状態でChromeの機械翻訳機能などで十分に意味がとれる状態だと思います。
前提知識
Emacs Lispの進化について説明する論文なので、Lispについて自信のない方はとりあえずEmacsを書く前のLispあたり読んでおいてもらうと理解が進むと思います。
執筆時期について
2018年に募集されて2020年にかけて完成した論文なので、2023年現在としては最新ではない部分もあります。
著作権表記
論文の内容もこの記事に抜萃しているので表記します。
ACM Reference Format:
Stefan Monnier and Michael Sperber. 2020. Evolution of Emacs Lisp. Proc. ACM Program. Lang. 4, HOPL,
Article 74 (June 2020), 55 pages. https://doi.org/10.1145/3386324
Authors' addresses: Stefan Monnier, Université de Montréal, C.P. 6128, succ. centre-ville, Montréal, QC, H3C 3J7, Canada,
monnier@iro.umontreal.ca
; Michael Sperber, Active Group GmbH, Hechinger Str. 12/1, Tübingen, Germany,sperber@deinprogramm.de
.
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for third-party components of this work must be honored. For all other uses, contact the owner/author(s).
© 2020 Copyright held by the owner/author(s).
目次
機械翻訳では意味がとりにくいところがあるので、目次を仮に訳しておいておきます。
- 概要
- 目次
- 1 はじめに
- 1.1 著者について
- 1.2 論文の構成
- 2 Emacsの歴史
- 2.1 初期Emacsの歴史
- 2.2 設計のゴール
- 2.3 大分裂《シスマ》
- 2.4 開発年表
- 2.5 開発モデル
- 3 初期の言語設計
- 3.1 Mock Lisp
- 3.2 Maclisp
- 4 基礎言語設計
- 4.1 シンボルと動的スコープ
- 4.2 バッククォート
- 4.3 ラムダ (lambda)
- 4.4 マクロ
- 4.5 構造体 (structures)
- 4.6 大域脱出 (non-local exits)
- 4.7 フック
- 4.8 ドキュメント文字列
- 4.9 インタラクティブ関数
- 4.10 バッファローカル変数
- 4.11 文字列
- 4.12 入出力 (I/O)
- 5 基礎言語実装
- 5.1 バイトコード インタプリタ
- 5.2 末尾呼び出し最適化
- 5.3 起動
- 5.4 データ表現
- 5.5 Vector-Blocの割り当て
- 5.6 スタックの走査
- 5.7 XEmacsのヒープ管理
- 5.8 新しいGCアルゴリズム
- 5.9 イメージのダンプ
- 5.10 デバッグ
- 5.11 プロファイリング
- 5.12 JITコンパイル
- 6 XEmacsの時代
- 6.1 イベントとキーマップ表現
- 6.2 文字表現
- 6.3 C FFI
- 6.4 エイリアス
- 7 EmacsとXEmacsの共進化
- 7.1 パフォーマンスの向上
- 7.2 Customライブラリ
- 7.3 Unicode
- 7.4 多倍長整数 (bignums)
- 7.5 ターミナルローカル・フレームローカル変数、Specifiers
- 8 XEmacs後の時代
- 8.1 レキシカルスコープ
- 8.2 先行マクロ展開 (eager macro-expansion)
- 8.3 パターンマッチング
- 8.4 CL-Lib
- 8.5 汎変数 (generalized variables)
- 8.6 オブジェクト指向プログラミング
- 8.6.1 CLOS
- 8.6.2 EIEIO
- 8.6.3 CL-Generic
- 8.6.4 クラスの全面サポート
- 8.7 実際のオブジェクト
- 8.8 ジェネレータ
- 8.9 並行性 (concurrency)
- 8.10 インライン関数
- 8.11 モジュールシステム
- 9 結び
- 謝辞
- A Emacsの代替実装たち
- A.1 Edwin
- A.2 Librep
- A.3 Elisp in Common Lisp
- A.4 JEmacs
- A.5 Guile
- A.6 Emacs-Ejit
- B Joseph Arceneauxへのインタビュー
- 参考文献
動画
HOPL IVで発表された著者ふたりの動画があります。本文を読み終わった後に見るとおもしろいと思います。新旧(X)Emacs開発者のEmacs Lisp漫才が見れるぞ!
1 はじめに
WIP
2 Emacsの歴史
2.1 Emacs's Early History
TECOのマクロ集としてのEmacsの誕生と、それに次いでLispマシンに実装されたEINE/ZWEI、そしてUNIXに実装されたGosling EmacsからGPL誕生への道がまとめられています。
このGosling Emacsと呼ばれるEmacsを実装したのは、後にJavaの作者になるジェームズ・ゴスリンのことです。現在のGNU EmacsにはGosling Emacs由来のコードは直接的に含まれていませんが、後の章ではこのGoslingが現在まで及ぼしている影響にも言及されています。
2.3 The Great Schism
この章題の“The Great Schism”は世界史のシスマのことで、GNU EmacsとXEmacsの分裂をキリスト教会の大分裂になぞらえています。
2.5 Development Model
開発年表を雑に訳したものを置いておきます。
Date | Version | Maintainer | Notes |
---|---|---|---|
1985-03 | Emacs 13 | Richard Stallman | 記録に残る最古のリリース |
1985-07 | Emacs 16.56 | Richard Stallman | まだ利用可能な最古のバージョン Gosling Emacsのコードが除去された |
1987-09 | Emacs 18.49 | Richard Stallman | |
1987 | Epoch | Alan M. Carroll | Emacs 18.49からフォーク |
1988-12 | Epoch 1.0 | Alan M. Caroll, Simon Kaplan | |
1989-08 | Emacs 18.55 | Richard Stallman | |
1990 | Emacs 19 | Joe Arcenaux | Emacs 18.55からフォーク テキストプロパティ (Sec. 4.11( advice.el (Sec. 4.7) |
1990-04 | Lucid Emacs 19.0 | Jamie Zawinski | エクステント (extents, Sec. 4.11) |
1990-08 | Epoch 4.0 | Marc Andreesen | |
1992-10 | Emacs 18.59 | Richard Stallman | Emacs 18系の最終リリース |
1993-05 | Emacs 19.7 beta | Jim Blandy | Emacs 19最初の公開ベータ版lambda マクロ(Sec. 4.3) |
1993-05 | Emacs 19.8 beta | Jim Blandy | |
1993-09 | Lucid Emacs 19.8 | Jamie Zawinski | 4-bitタグ (Sec 5.4) EpochがEmacs 19.8にマージされる |
1994-05 | Emacs 19.23 beta | Richard Stallman | |
1994-05 | Lucid Emacs 19.10 | Jamie Zawinski | |
1994-09 | XEmacs 19.11 | Chuck Thompson, Ben Wing | |
1994-11 | Emacs 19.28 | Richard Stallman | 正しいバッククォート (Sec. 4.2) 実際にリリースされた最初のEmacs 19 |
1995-06 | Emacs 19.29 | Richard Stallman | 3-bitタグ (Sec. 5.4) |
1995 | XEmacs 20 | Steve Baur | MULEサポートの作業開始 |
1995-09 | XEmacs 19.13 | Chuck Thompson, Ben Wing | Emacs 19.30をマージ |
1996-08 | Emacs 19.34 | Richard Stallman | Emacs 19系の最終リリース |
1997-02 | XEmacs 20.0 | Steve Baur | Customライブラリ (Sec. 7.2) |
1997-03 | XEmacs 19.15 | Steve Baur | |
1997-09 | Emacs 20.1 | Richard Stallman | MULEが統合された最初のリリース |
1997-10 | XEmacs 19.16 | Steve Baur | |
1998-02 | XEmacs 20.4 | Steve Baur | MULEパッケージが個別に出荷された初の安定版リリース |
1998-07 | XEmacs 21.0 | Steve Baur | 1-bitタグ |
2001-04 | XEmacs 21.4 | Stephen Turnbull | |
2001-10 | Emacs 21.1 | Gerd Möllmann New | 再表示エンジン |
2007-06 | Emacs 22.1 | Richard Stallman | Mock Lispの最後の断片が削除 |
2009-07 | Emacs 23.1 | Chong Yidong, Stefan Monnier | 内部処理がUnicode化 (Sec. 7.3) |
2012-06 | Emacs 24.1 | Chong Yidong, Stefan Monnier | レキシカスルコープ (Sec. 8.1) |
2013-03 | Emacs 24.3 | Chong Yidong, Stefan Monnier | CL-Lib (Sec. 8.4) |
2014-10 | Emacs 24.4 | Chong Yidong, Stefan Monnier |
nadvice.el (Sec. 4.7) |
2016-09 | Emacs 25.1 | John Wiegley, Eli Zaretskii | |
2018-05 | Emacs 26.1 | John Wiegley, Eli Zaretskii | レコード (Sec. 4.5) スレッド (Sec 8.9) |
ここに登場するMuleとは日本の電子総合研究所(現・産業技術総合研究所)で開発されたEmacsの多言語拡張で、現在のGNU Emacs国際化の基礎になっています。日本から見たHistory of Emacs and Muleのタイムラインと併せて見るとおもしろいですね。ちなみに、このページをまとめている藤原誠さんは、私がEmacsとLispに触れるきっかけになった「便利なツール Emacsらくらく入門」の著者です。
3 EARLY LANGUAGE DESIGN
4 BASE LANGUAGE DESIGN
5 BASE LANGUAGE IMPLEMENTATION
5.2 Tail-Call Optimization
末尾呼び出し最適化のこと。見出しを見て「えーっ、EmacsにTCOにござるかあ!?」と思ったのですが、なるほど…
2023年現在でもEmacs LispにTCOは実装されていませんが、@ROCKTAKEYさんのROCKTAKEY/recur: Tail call optimization for Emacs.パッケージを使うとユーザーランドで末尾呼び出しを最適化できるようになります。
5.12 JIT Compilation
これが2023年現在で最も進捗したといえる箇所で、2021年にリリースされたEmacs 28でネイティブコンパイルがサポートされました。
また、実際に導入されたネイティブコンパイル機能についてはBringing GNU Emacs to Native Code | Zenodoという論文も出ています。
6 XEMACS PERIOD
7 EMACS/XEMACS CO-EVOLUTION
7.2 Custom Library
M-x customize
で画面からぽちぽち設定できるようにするやつのことです。
Emacs 29ではLispからカスタム変数を設定しやすくなる setopt
が追加されました。
7.4 Bignums
多倍長整数のことです。
7.5 Terminal-Local and Frame-Local Variables, Specifiers
私は初耳の概念でした…
8 POST-XEMACS PERIOD
ここからは私も同時代的に知っていた内容になってきます。
8.1 Lexical Scoping
個人的に語りたいことがたくさんあるテーマなのですが、とりあえず静的スコープとかクロージャを読んでおいてください。
8.4 CL-Lib
この節にも年表がありますが、いろんなことがありました…
8.5 Generalized Variables
Generalized Variablesはしばしば「<ruby>汎変数<rt>はんへんすう</ruby>」と呼ばれます。
詳細はkawabataさんのEmacs Lispの汎変数がとても詳しいです。
8.6 Object-Oriented Programming
Emacs Lispでもオブジェクト指向プログラミングできるよ…! という話なのですが、ほかの言語のオブジェクト指向と同じような感じで使おうと思うと結構面喰らうんじゃないかと思いますが、その真価は多重ディスパッチ - Wikipediaにあるんじゃないかと思います。ないかもしれません。
8.8 Generators
ほかの言語のジェネレータ(PHP、Python、JavaScriptにもある)と同じもので、(古典的)コルーチンとも呼ばれます。
やはりこれもkawabataさんの記事が詳しいです。
Emacsとは関係ないのですが、私もこういう記事を書きました。