Переносимість байт-коду між версіями 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/isissue/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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.