Portabilità del bytecode tra le versioni di Emacs


9

A volte eseguo più versioni di Emacs dalla stessa directory home. Ho un numero di file compilati in byte. Bytecode non è compatibile con tutte le versioni di Emacs, quindi mantengo directory separate per i .elcfile per ogni intervallo di versioni.

Quali sono gli intervalli di versione per i quali il bytecode è compatibile? Ho attualmente

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

vale a dire directory per ogni versione principale, con una separazione aggiuntiva alle 19.29 (non ho mai usato una versione precedente su questa macchina, altrimenti ce ne sarebbero gnu-19) e directory separate per GNU Emacs e XEmacs. Tuttavia, probabilmente sono troppo cauto.

Qual è la politica ufficiale relativa alla compatibilità bytecode tra le versioni di Emacs? Posso continuare a utilizzare con sicurezza la versione principale? Posso unire alcune versioni? Esiste un'indicazione della versione del bytecode o un checksum che potrei interrogare durante la compilazione per creare il nome della directory anziché fare affidamento sulla versione di Emacs?

Nota che sono principalmente interessato alla piena compatibilità, non solo alla retrocompatibilità. Potrei eseguire Emacs 27.3 e compilare byte alcuni file, quindi Emacs 27.2 con la stessa directory home.


Per curiosità, perché esegui versioni così vecchie? 19 devono essere ormai più di un decennio.
Tyler,

Alcuni file .elc Emacs 24.2 non funzionano con Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Risposte:


9

Come manutentore, mi sforzo di preservare quanto segue:

  • Retrocompatibilità del codice byte. Vale a dire che dovresti essere in grado di prendere il tuo file .elc compilato con Emacs-19 ed eseguirlo con successo in Emacs-27. Ovviamente, in pratica non sempre funziona, perché le incompatibilità con le versioni precedenti vengono introdotte per caso o consapevolmente (anche se di solito non sono specifiche per i file compilati in modo automatico).
  • Piena compatibilità con codice byte all'interno di una versione principale. Questo è seguito con meno attenzione, principalmente perché tende ad accadere automaticamente, ma normalmente dovresti essere in grado di compilare byte su 27.N ed eseguirlo correttamente su 27.1. Detto questo, si consiglia sempre di compilare byte sulla versione precedente.

Naturalmente, quanto sopra riguarda in particolare il codice compilato in byte e dipende ancora dall'effettiva compatibilità generale: se foo.elviene eseguito in Emacs-19 ed Emacs-27, un foo.elccompilato su Emacs-19 dovrebbe funzionare su Emacs-27. Ma se questo foo.elnon funziona su Emacs-19 o su Emacs-27, foo.elcprobabilmente il compilato su Emacs-19 non funzionerà su Emacs-27.

Inoltre, ci sono alcuni casi in cui interrompiamo consapevolmente la retrocompatibilità del codice compilato con byte.


5

Non dovresti aspettarti che i file bytecode siano compatibili tra le diverse versioni di Emacs. Il formato del bytecode attuale è per lo più compatibile verso l'alto, ma potresti riscontrare problemi con le macro espanse.

Lasciatemi spiegare. Quando il compilatore di byte rileva una macro, calcola l'espansione della macro e compila il risultato. Se la macro si espande in una chiamata a una funzione, il file bytecode risultante conterrà un riferimento alla funzione. Se una funzione interna che appare nell'espansione di una macro cambia tra le versioni di Emacs, il bytecode non sarà compatibile.

Ovviamente, gli sviluppatori di Emacs cercano di evitare le macro che si espandono in funzioni interne che potrebbero cambiare. Tuttavia, questo a volte è difficile da raggiungere, e non vorrei contare su questo, soprattutto in presenza di grandi cambiamenti come l'introduzione di gv.elEmacs 24.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.