Иногда я запускаю несколько версий 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 с тем же домашним каталогом.
Ответы:
Как сопровождающий, я стараюсь сохранить следующее:
Конечно, вышеизложенное относится конкретно к байтовому скомпилированному коду и все еще зависит от фактической общей совместимости: если
foo.el
работает в Emacs-19 и Emacs-27, тоfoo.elc
скомпилированный на Emacs-19 должен работать на Emacs-27. Но еслиfoo.el
это не работает на Emacs-19 или на Emacs-27, тоfoo.elc
скомпилированный на Emacs-19, вероятно, не будет работать на Emacs-27.Также есть несколько случаев, когда мы сознательно нарушаем обратную совместимость скомпилированного байта кода.
источник
Вы не должны ожидать, что файлы байт-кода будут совместимы между различными версиями Emacs. Фактический формат байт-кода в основном совместим вверх, но у вас возникнут проблемы с расширенными макросами.
Позволь мне объяснить. Когда байт-компилятор встречает макрос, он вычисляет расширение макроса и компилирует результат. Если макрос расширяется до вызова функции, то полученный файл байт-кода будет содержать ссылку на функцию. Если внутренняя функция, которая появляется в расширении макроса, изменяется между версиями Emacs, тогда байт-код не будет совместимым.
Очевидно, что разработчики Emacs стараются избегать макросов, которые расширяются до внутренних функций, которые могут измениться. Однако этого иногда трудно достичь, и я бы не стал рассчитывать на это, особенно при наличии больших изменений, таких как введение
gv.el
в Emacs 24.источник