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 .elc
archivos 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.
Respuestas:
Como mantenedor, me esfuerzo por preservar lo siguiente:
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.el
ejecuta en Emacs-19 y Emacs-27, unfoo.elc
compilado en Emacs-19 debería funcionar en Emacs-27. Pero si esofoo.el
no funciona en Emacs-19 o en Emacs-27, entonces elfoo.elc
compilado 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.
fuente
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.el
Emacs 24.fuente