Portabilidade do bytecode entre as versões do Emacs

9

Às vezes, executo várias versões do Emacs a partir do mesmo diretório inicial. Eu tenho vários arquivos compilados em bytes. O bytecode não é compatível em todas as versões do Emacs, por isso mantenho diretórios separados para .elcarquivos para cada intervalo de versões.

Quais são os intervalos de versões para os quais o bytecode é compatível? Eu tenho atualmente

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

isto é, diretórios para cada versão principal, com uma separação adicional em 19.29 (eu nunca usei uma versão mais antiga nesta máquina, caso contrário, haveria gnu-19) e separar diretórios para GNU Emacs e XEmacs. Eu sou provavelmente muito cauteloso, no entanto.

Qual é a política oficial em relação à compatibilidade de bytecode nas versões do Emacs? Posso continuar usando a versão principal com confiança? Posso mesclar algumas versões? Existe uma indicação de versão de bytecode ou soma de verificação que eu poderia consultar ao compilar para criar o nome do diretório em vez de confiar na versão do Emacs?

Observe que meu principal interesse é a compatibilidade total, não apenas a compatibilidade com versões anteriores. Posso executar o Emacs 27.3 e compilar alguns arquivos e depois o Emacs 27.2 com o mesmo diretório inicial.

Gilles 'SO- parar de ser mau'
fonte
Por curiosidade, por que você executa versões tão antigas? 19 já deve ter mais de uma década.
Tyler
Alguns Emacs 24.2 arquivos .elc não funcionam com o Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Respostas:

9

Como mantenedor, eu me esforço para preservar o seguinte:

  • Compatibilidade com versões anteriores do código de bytes. Ou seja, você poderá levar seu arquivo .elc compilado com o Emacs-19 e executá-lo com sucesso no Emacs-27. Obviamente, na prática, isso nem sempre funciona, porque as incompatibilidades anteriores são introduzidas por acidente ou conscientemente (embora isso geralmente não seja específico dos arquivos compilados).
  • Compatibilidade total com código de bytes em uma versão principal. Isso é seguido com menos cuidado, principalmente porque costuma ocorrer automaticamente, mas normalmente você deve poder compilar em 27.N e executá-lo com sucesso em 27.1. Dito isto, é sempre recomendável compilar em bytes na versão mais antiga.

Obviamente, o acima é especificamente sobre o código compilado de bytes e ainda depende da compatibilidade geral real: se for foo.elexecutado no Emacs-19 e Emacs-27, um foo.elccompilado no Emacs-19 deverá funcionar no Emacs-27. Mas se isso foo.elnão funcionar no Emacs-19 ou no Emacs-27, então o foo.elccompilado no Emacs-19 provavelmente não funcionará no Emacs-27.

Além disso, existem alguns casos em que conscientemente quebramos a compatibilidade com versões anteriores do código compilado por bytes.

Stefan
fonte
5

Você não deve esperar que os arquivos de bytecode sejam compatíveis entre diferentes versões do Emacs. O formato real do bytecode é principalmente compatível com versões anteriores, mas você terá problemas com macros expandidas.

Deixe-me explicar. Quando o byte-compiler encontra uma macro, ele calcula a expansão da macro e compila o resultado. Se a macro for expandida para uma chamada para uma função, o arquivo de bytecode resultante conterá uma referência à função. Se uma função interna que aparece na expansão de uma macro for alterada entre as versões do Emacs, o bytecode não será compatível.

Obviamente, os desenvolvedores do Emacs tentam evitar macros que se expandem para funções internas que podem mudar. No entanto, isso às vezes é difícil de conseguir, e eu não contaria com isso, principalmente na presença de grandes mudanças, como a introdução do gv.elEmacs 24.

jch
fonte