Open9

Evolution of Emacs Lisp副読本

にゃんだーすわんにゃんだーすわん

Evolution of Emacs LispはACM SIGPLAN(プログラミング言語についての学会)で2021年に開催されたHOPL IV(History of Programming Language Vol. 4)という会議に投稿されたStefan Monnier氏とMichael Sperber氏による論文です。

https://dl.acm.org/doi/10.1145/3386324

このHOPL4の論文誌自体がとても興味が引かれる内容だったのですが、いままで斜め読みしかできていませんでした。この数日で一気に読んだらとても興味深かったので内容について補足します。

本文

私は英語がとても苦手なので、機械翻訳しやすいようにPDFの内容をMarkdownに起こすところから作業を始めました。

https://gist.github.com/zonuexe/4a717951d041880de046dcc72d773351

この状態でChromeの機械翻訳機能などで十分に意味がとれる状態だと思います。

前提知識

Emacs Lispの進化について説明する論文なので、Lispについて自信のない方はとりあえずEmacsを書く前のLispあたり読んでおいてもらうと理解が進むと思います。

https://qiita.com/tadsan/items/0d3a772f4b8fb733bf52

執筆時期について

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.

Creative Commons License
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漫才が見れるぞ!

https://www.pldi21.org/prerecorded_hopl.16.html

にゃんだーすわんにゃんだーすわん

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らくらく入門」の著者です。

にゃんだーすわんにゃんだーすわん

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でネイティブコンパイルがサポートされました。

https://blog.tomoya.dev/posts/hello-native-comp-emacs/

また、実際に導入されたネイティブコンパイル機能についてはBringing GNU Emacs to Native Code | Zenodoという論文も出ています。

にゃんだーすわんにゃんだーすわん

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の汎変数がとても詳しいです。

https://qiita.com/kawabata@github/items/9a1a1e211c57a56578d8

8.6 Object-Oriented Programming

Emacs Lispでもオブジェクト指向プログラミングできるよ…! という話なのですが、ほかの言語のオブジェクト指向と同じような感じで使おうと思うと結構面喰らうんじゃないかと思いますが、その真価は多重ディスパッチ - Wikipediaにあるんじゃないかと思います。ないかもしれません。

8.8 Generators

ほかの言語のジェネレータ(PHP、Python、JavaScriptにもある)と同じもので、(古典的)コルーチンとも呼ばれます。

やはりこれもkawabataさんの記事が詳しいです。

https://qiita.com/kawabata@github/items/239345c38c431e1feb7d

Emacsとは関係ないのですが、私もこういう記事を書きました。

https://tadsan.fanbox.cc/posts/833584