LaTeX メモ: Emacs 28.1 以降のバージョンにおける AUCTeX の設定

最近 PC を新調したとき、emacs の設定変更が必要になったことがあった。取り急ぎ、AUCTeX まわりに限定してここに記録しておきたい。ここで、emacs と AUCTeX については、Emacs 28.1(現時点での最新バージョンは 28.2), AUCTeX 13.1.4 にアップグレードした。

その後、AUCTeX で LaTeX ファイルを C-c C-c しようとすると、


Latex: problems after [0] pages


というエラーが出て、コンパイルに失敗する。具体的には、以下のような症状である。


auctex - Emacs gives me "Latex: problems after [0] pages" - TeX - LaTeX Stack Exchange
https://tex.stackexchange.com/questions/232273/emacs-gives-me-latex-problems-after-0-pages


その解決策は、上記ページを参考にして、


(add-hook 'LaTeX-mode-hook
  (lambda ()
     (add-to-list 'TeX-expand-list
              (list "%(extraopts)" (lambda nil TeX-command-extra-options)))))


という一文を、.emacs.el などの初期化ファイルに書いておけばよい。以上。



ということでエントリが終わってもいいのだが、emacs の初期化についても多少調べたことがあるので、ついでにメモしておきたい。


emacs の初期化ファイル(ここでは .emacs とする)に上記のような設定変更を行い、いつものようにバイトコンパイルした。すると、28.1 からは、以下のような warning が出るようになったのである(ここでは私のホームディレクトリを "/home/taro/" とした):


Warning (comp): Cannot look-up eln file as no source file was found for /home/taro/.emacs.elc Disable showing Disable logging


このようなメッセージは初めて見たので、最初は当惑した。そもそも "eln file" とは何なのか。

実は、emacs 28 から、従来の byte compile に加え、native compilation がサポートされるようになったのである。

native compile については、Emacs Lisp info の "18 Compilation of Lisp to Native Code" に簡単なドキュメントがあるが、その技術についてより詳しく知りたければ、以下の論文:


Bringing GNU Emacs to Native Code
https://zenodo.org/record/3736363


を参照すればよい。2節まで読めば十分だろう。簡単に言うと、従来の byte compile は、elisp を汎用的な byte-code (いわゆる中間コード)にコンパイルしていた。そこでどんなマシンでも、一度コンパイルすれば code は同じという利点があったが、VM 上の実行となるため、実行時マシンのアセンブリによる直接的な実行と比べれば、速度の点から問題があった。

一方、native compilation においては、libgccjit を用いて、マシンの実行時コード(native code と呼ばれる)が出力される。当然ながらこのとき GCC(GNU Compiler Collection)による最適化も利用できる。結果として、byte compile と比較すると、native compile は 2.3 倍から 42 倍の速度向上を実現できたという。もちろん、native compile はマシンごとに実行されるので、byte code のような汎用性はない。

まとめると、JIT(Just-In-Time)コンパイルという技術は最新ではないが、いまだに emacs は進化を続けている。そう思うと、感動するものがあった。

ちなみに、私の emacs 28.1 では、(native-comp-available-p) を評価しても結果は nil となることから分かるように、native compile はできない。今後、時間があるときに以下のページを参考にして emacs を libgccjit つきでビルドしてみたい:


[Home] Gcc Emacs
https://www.emacswiki.org/emacs/GccEmacs


話は多少長くなったが、eln というのは、native compile された elisp ファイルの拡張子のことである。現状、native compile は単独で行われるのではなく、同時に byte compile も行われる(elisp info の "18.1 Native-Compilation Functions" 参照)。その結果だろうか、単に byte compile するだけであっても、ソースとなる elisp ファイルがないと、上記のような警告が出るようになってしまったようだ。

しかし、eln ファイルはマシンごとに違うので、デバッグの際にソースとなる elisp がないと困るとかいう理由ならまだ分かるが、byte compile だけでも上記のような警告が出るのは納得いかない。そもそも分かりにくいだろう。

まあ私は横着なので、emacs の初期化ファイルとしていまだに .emacs を使っていたので、ソースがないと判断されたのだろう。.emacs.el と名前を変えて、再度 byte compile すると、警告は出なくなった。

.emacs はさすがにどうかと思うが、そもそもホームディレクトリに dot file を置くのも古いスタイルなので(emacs info の "49.4.4 How Emacs Finds Your Init File" 参照)、今後改善していきたい。




関連エントリ




コメント

このブログの人気の投稿

LaTeX メモ - 数式における「|」 (縦線, vertical bar)の扱い(その2)

人間はどんなところでも,どんな時でも何歳からでも学ぶことができる

ブログを始めるにあたって - 継続は力

イエスは地面に何を書いていたか

へんろう宿 (井伏鱒二)