Переносимость байт-кода между версиями 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 должно быть больше десятилетия к настоящему времени.
Тайлер
Некоторые файлы Emacs 24.2 .elc не работают с Emacs 24.3: github.com/mooz/js2-mode/issues/72
Уилфред Хьюз,

Ответы:

9

Как сопровождающий, я стараюсь сохранить следующее:

  • Обратная совместимость байт-кода. Т.е. вы должны быть в состоянии взять ваш файл .elc, скомпилированный с Emacs-19, и успешно запустить его в Emacs-27. Конечно, на практике это не всегда работает, потому что обратные несовместимости вводятся либо случайно, либо сознательно (хотя они, как правило, не являются специфичными для байтово скомпилированных файлов).
  • Полная совместимость с байт-кодом в основной версии. За этим следуют с меньшей осторожностью, в основном потому, что это происходит автоматически, но обычно вы должны быть в состоянии байтовой компиляции на 27.N и успешно запустить его на 27.1. Тем не менее, всегда рекомендуется байтовая компиляция на более старой версии.

Конечно, вышеизложенное относится конкретно к байтовому скомпилированному коду и все еще зависит от фактической общей совместимости: если foo.elработает в Emacs-19 и Emacs-27, то foo.elcскомпилированный на Emacs-19 должен работать на Emacs-27. Но если foo.elэто не работает на Emacs-19 или на Emacs-27, то foo.elcскомпилированный на Emacs-19, вероятно, не будет работать на Emacs-27.

Также есть несколько случаев, когда мы сознательно нарушаем обратную совместимость скомпилированного байта кода.

Стефан
источник
5

Вы не должны ожидать, что файлы байт-кода будут совместимы между различными версиями Emacs. Фактический формат байт-кода в основном совместим вверх, но у вас возникнут проблемы с расширенными макросами.

Позволь мне объяснить. Когда байт-компилятор встречает макрос, он вычисляет расширение макроса и компилирует результат. Если макрос расширяется до вызова функции, то полученный файл байт-кода будет содержать ссылку на функцию. Если внутренняя функция, которая появляется в расширении макроса, изменяется между версиями Emacs, тогда байт-код не будет совместимым.

Очевидно, что разработчики Emacs стараются избегать макросов, которые расширяются до внутренних функций, которые могут измениться. Однако этого иногда трудно достичь, и я бы не стал рассчитывать на это, особенно при наличии больших изменений, таких как введение gv.elв Emacs 24.

JCH
источник