Portabilité du bytecode entre les versions d'Emacs


9

Je lance parfois plusieurs versions d'Emacs à partir du même répertoire personnel. J'ai un certain nombre de fichiers compilés en octets. Le bytecode n'est pas compatible avec toutes les versions d'Emacs, donc je gère des répertoires distincts pour les .elcfichiers pour chaque plage de versions.

Quelles sont les gammes de versions pour lesquelles le bytecode est compatible? J'ai actuellement

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

c'est-à-dire des répertoires pour chaque version majeure, avec une séparation supplémentaire à 19.29 (je n'ai jamais utilisé une version plus ancienne sur cette machine, sinon il y en aurait gnu-19), et des répertoires séparés pour GNU Emacs et XEmacs. Je suis probablement trop prudent, cependant.

Quelle est la politique officielle concernant la compatibilité des bytecodes entre les versions Emacs? Puis-je continuer à utiliser la version principale en toute confiance? Puis-je fusionner certaines versions? Existe-t-il une indication de version de bytecode ou une somme de contrôle que je pourrais interroger lors de la compilation pour créer le nom du répertoire au lieu de compter sur la version d'Emacs?

Notez que je suis principalement intéressé par la compatibilité complète, pas seulement par la compatibilité descendante. Je pourrais exécuter Emacs 27.3 et compiler des fichiers en octets, puis plus tard Emacs 27.2 avec le même répertoire personnel.


Par curiosité, pourquoi utilisez-vous de telles anciennes versions? 19 doit être plus d'une décennie maintenant.
Tyler

Certains fichiers Emacs 24.2 .elc ne fonctionnent pas avec Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Réponses:


9

En tant que responsable, je m'efforce de préserver les éléments suivants:

  • Compatibilité descendante du code octet. C'est-à-dire que vous devriez pouvoir prendre votre fichier .elc compilé avec Emacs-19 et l'exécuter avec succès dans Emacs-27. Bien sûr, dans la pratique, cela ne fonctionne pas toujours, car des incompatibilités en amont sont introduites soit accidentellement, soit consciemment (mais celles-ci ne sont généralement pas spécifiques aux fichiers bytecompiled).
  • Compatibilité octet-code complète dans une version majeure. Ceci est suivi avec moins de soin, principalement parce que cela a tendance à se produire automatiquement, mais normalement vous devriez pouvoir compiler des octets sur 27.N et l'exécuter avec succès sur 27.1. Cela dit, il est toujours recommandé de compiler des octets sur l'ancienne version.

Bien sûr, ce qui précède concerne spécifiquement le code compilé en octets, et dépend toujours de la compatibilité générale réelle: s'il foo.els'exécute dans Emacs-19 et Emacs-27, un foo.elccompilé sur Emacs-19 devrait fonctionner sur Emacs-27. Mais si cela foo.elne fonctionne pas sur Emacs-19 ou sur Emacs-27, alors le foo.elccompilé sur Emacs-19 ne fonctionnera probablement pas sur Emacs-27.

En outre, il existe quelques cas où nous brisons consciemment la compatibilité descendante du code compilé en octets.


5

Vous ne devez pas vous attendre à ce que les fichiers de bytecode soient compatibles entre les différentes versions d'Emacs. Le format de bytecode réel est principalement compatible avec les versions ascendantes, mais vous rencontrerez des problèmes avec les macros étendues.

Laisse-moi expliquer. Lorsque le compilateur d'octets rencontre une macro, il calcule l'expansion de la macro et compile le résultat. Si la macro s'est développée pour appeler une fonction, le fichier de bytecode résultant contiendra une référence à la fonction. Si une fonction interne qui apparaît dans l'extension d'une macro change entre les versions d'Emacs, alors le bytecode ne sera pas compatible.

Évidemment, les développeurs d'Emacs essaient d'éviter les macros qui s'étendent aux fonctions internes qui pourraient changer. Cependant, cela est parfois difficile à réaliser, et je ne compterais pas là-dessus, en particulier en présence de grands changements tels que l'introduction d' gv.elEmacs 24.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.