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岁必须已经超过十年了。
泰勒2014年

某些Emacs 24.2 .elc文件不适用于Emacs 24.3:github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Answers:


9

作为维护者,我努力保留以下内容:

  • 字节码的向后兼容性。也就是说,您应该能够使用Emacs-19编译您的.elc文件,并在Emacs-27中成功运行它。当然,实际上,它并不总是有效,因为向后不兼容是偶然或有意识地引入的(通常这些不适用于字节编译文件)。
  • 在主要版本中具有完整的字节码兼容性。紧随其后的是这种情况,这主要是因为它倾向于自动发生,但通常情况下,您应该能够在27.N上进行字节编译并在27.1上成功运行它。也就是说,始终建议在旧版本上进行字节编译。

当然,以上内容专门针对字节编译的代码,仍然取决于实际的一般兼容性:如果foo.el在Emacs-19和Emacs-27中运行,则foo.elc在Emacs-19上进行编译的代码应在Emacs-27上运行。但是,如果foo.el在Emacs-19或Emacs-27上不起作用,则在Emacs-19上foo.elc编译的文件可能在Emacs-27上不起作用。

另外,在某些情况下,我们有意识地破坏了字节编译代码的向后兼容性。


5

您不应该期望字节码文件在不同的Emacs版本之间兼容。实际的字节码格式大部分是向上兼容的,但是扩展宏会给您带来麻烦。

让我解释。当字节编译器遇到宏时,它将计算宏的扩展并编译结果。如果宏扩展为对函数的调用,则生成的字节码文件将包含对该函数的引用。如果出现在宏扩展中的内部函数在Emacs版本之间发生了变化,则字节码将不兼容。

显然,Emacs开发人员试图避免将宏扩展为可能会更改的内部函数。但是,有时很难做到这一点,我不会指望这一点,尤其是在存在诸如gv.elEmacs 24中引入之类的较大更改的情况下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.