Portabilidad de bytecode entre versiones de Emacs

9

A veces ejecuto varias versiones de Emacs desde el mismo directorio de inicio. Tengo varios archivos compilados en bytes. Bytecode no es compatible con todas las versiones de Emacs, por lo que mantengo directorios separados para .elcarchivos para cada rango de versiones.

¿Cuáles son los rangos de versión para los cuales el bytecode es compatible? Actualmente tengo

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

es decir, directorios para cada versión principal, con una separación adicional en 19.29 (nunca he usado una versión anterior en esta máquina, de lo contrario habría gnu-19), y directorios separados para GNU Emacs y XEmacs. Sin embargo, probablemente soy demasiado cauteloso.

¿Cuál es la política oficial con respecto a la compatibilidad de bytecode en las versiones de Emacs? ¿Puedo seguir usando con confianza la versión principal? ¿Puedo fusionar algunas versiones? ¿Hay alguna indicación de versión de bytecode o suma de comprobación que pueda consultar al compilar para crear el nombre del directorio en lugar de confiar en la versión de Emacs?

Tenga en cuenta que me interesa principalmente la compatibilidad total, no solo la compatibilidad con versiones anteriores. Podría ejecutar Emacs 27.3 y compilar byte algunos archivos, y luego Emacs 27.2 con el mismo directorio de inicio.

Gilles 'SO- deja de ser malvado'
fuente
Por curiosidad, ¿por qué ejecutas versiones tan antiguas? 19 debe ser más de una década por ahora.
Tyler
Algunos archivos .elc de Emacs 24.2 no funcionan con Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Respuestas:

9

Como mantenedor, me esfuerzo por preservar lo siguiente:

  • Compatibilidad con versiones anteriores de código de bytes. Es decir, debería poder tomar su archivo .elc compilado con Emacs-19 y ejecutarlo con éxito en Emacs-27. Por supuesto, en la práctica no siempre funciona, porque las incompatibilidades hacia atrás se introducen por accidente o conscientemente (aunque generalmente no son específicas de los archivos compilados en bytes).
  • Compatibilidad total con el código de bytes dentro de una versión principal. Esto se sigue con menos cuidado, principalmente porque tiende a suceder automáticamente, pero normalmente debería poder compilar byte en 27.N y ejecutarlo con éxito en 27.1. Dicho esto, siempre se recomienda compilar byte en la versión anterior.

Por supuesto, lo anterior se refiere específicamente al código compilado de bytes, y aún depende de la compatibilidad general real: si se foo.elejecuta en Emacs-19 y Emacs-27, un foo.elccompilado en Emacs-19 debería funcionar en Emacs-27. Pero si eso foo.elno funciona en Emacs-19 o en Emacs-27, entonces el foo.elccompilado en Emacs-19 probablemente no funcionará en Emacs-27.

Además, hay algunos casos en los que conscientemente rompemos la compatibilidad con versiones anteriores del código compilado por bytes.

Stefan
fuente
5

No debe esperar que los archivos de bytecode sean compatibles entre diferentes versiones de Emacs. El formato de bytecode real es en su mayoría compatible hacia arriba, pero tendrá problemas con las macros expandidas.

Dejame explicar. Cuando el compilador de bytes encuentra una macro, calcula la expansión de la macro y compila el resultado. Si la macro se expandió a una llamada a una función, el archivo de bytecode resultante contendrá una referencia a la función. Si una función interna que aparece en la expansión de una macro cambia entre las versiones de Emacs, entonces el código de bytes no será compatible.

Obviamente, los desarrolladores de Emacs intentan evitar las macros que se expanden a funciones internas que pueden cambiar. Sin embargo, esto a veces es difícil de lograr, y no contaría con eso, especialmente en presencia de grandes cambios, como la introducción de gv.elEmacs 24.

jch
fuente