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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.