Emacsバージョン間のバイトコードの移植性


9

同じホームディレクトリからEmacsの複数のバージョンを実行することがあります。バイトコンパイルされたファイルがたくさんあります。バイトコードはEmacsのすべてのバージョン間で互換性があるわけではない.elcため、バージョン範囲ごとにファイル用に個別のディレクトリを保持しています。

バイトコードが互換性のあるバージョン範囲は何ですか?私は現在持っています

gnu-19.29
gnu-20
gnu-21
gnu-22
gnu-23
gnu-24
source
x-19
x-20
x-21

つまり、19.29でさらに分離された各メジャーリリース用のディレクトリ(このマシンでは古いバージョンを使用したことがないため、そうでない場合はありますgnu-19)と、GNU EmacsとXEmacs用の個別のディレクトリです。しかし、私はおそらく過度に用心深いです。

Emacsのバージョン間のバイトコードの互換性に関する公式のポリシーは何ですか?自信を持ってメジャーバージョンを使い続けることはできますか?一部のバージョンをマージできますか?Emacsのバージョンに依存するのではなく、コンパイルしてディレクトリ名を作成するときにクエリできるバイトコードバージョンの表示またはチェックサムはありますか?

私は、下位互換性だけでなく、主に完全な互換性に関心があることに注意してください。Emacs 27.3を実行していくつかのファイルをバイトコンパイルし、その後同じホームディレクトリでEmacs 27.2を実行する可能性があります。


好奇心から、なぜそのような古いバージョンを実行するのですか?19年は今では10年以上でなければなりません。
タイラー

Emacs 24.2の一部の.elcファイルがEmacs 24.3で機能しない:github.com/mooz/js2-mode/issues/72
Wilfred Hughes

回答:


9

メンテナーとして、私は以下を維持するよう努めています:

  • バイトコードの下位互換性。つまり、Emacs-19でコンパイルした.elcファイルをEmacs-27で正常に実行できるはずです。もちろん、後方非互換性は偶然または意識的に導入されるため、実際には常に機能するとは限りません(これらは通常、バイトコンパイルされたファイルに固有ではありません)。
  • メジャーバージョン内での完全なバイトコード互換性。これはほとんど自動的に行われる傾向があるため、あまり注意せずに実行されますが、通常は27.Nでバイトコンパイルして27.1で正常に実行できるはずです。これは、古いバージョンでは常にバイトコンパイルすることをお勧めします。

もちろん、上記は特にバイトコンパイルされたコードに関するものであり、実際の一般的な互換性にも依存しますfoo.el。Emacs-19およびEmacs-27で実行する場合、Emacs-19でfoo.elcコンパイルするとEmacs-27で動作するはずです。しかし、それfoo.elがEmacs-19またはEmacs-27 で機能しない場合、Emacs-19でfoo.elcコンパイルされたものはおそらくEmacs-27では機能しません。

また、バイトコンパイルされたコードの後方互換性を意識的に壊すケースもいくつかあります。


5

バイトコードファイルが異なるEmacsバージョン間で互換性があると期待すべきではありません。実際のバイトコード形式はほとんど上位互換性がありますが、拡張マクロで問題が発生します。

説明させてください。バイトコンパイラは、マクロを検出すると、マクロの展開を計算し、結果をコンパイルします。マクロが関数の呼び出しに展開された場合、結果のバイトコードファイルには関数への参照が含まれます。マクロの展開に現れる内部関数がEmacsのバージョン間で異なる場合、バイトコードには互換性がありません。

明らかに、Emacs開発者は、変更される可能性のある内部関数に展開されるマクロを回避しようとします。ただし、これを達成するのは難しい場合があり、特にgv.elEmacs 24での導入などの大きな変更が存在する場合は、これを当てにしないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.