Portabilität des Bytecodes zwischen Emacs-Versionen


9

Ich führe manchmal mehrere Versionen von Emacs aus demselben Home-Verzeichnis aus. Ich habe eine Reihe von bytekompilierten Dateien. Bytecode ist nicht für alle Emacs-Versionen kompatibel, daher verwalte ich separate Verzeichnisse für .elcDateien für jeden Versionsbereich.

Für welche Versionsbereiche ist der Bytecode kompatibel? Ich habe derzeit

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

dh Verzeichnisse für jede Hauptversion mit einer zusätzlichen Trennung um 19.29 Uhr (ich habe noch nie eine ältere Version auf diesem Computer verwendet, sonst würde es eine geben gnu-19) und separate Verzeichnisse für GNU Emacs und XEmacs. Ich bin jedoch wahrscheinlich übermäßig vorsichtig.

Was ist die offizielle Richtlinie bezüglich der Bytecode-Kompatibilität zwischen Emacs-Versionen? Kann ich die Hauptversion sicher weiter verwenden? Kann ich einige Versionen zusammenführen? Gibt es eine Bytecode-Versionsangabe oder Prüfsumme, die ich beim Kompilieren abfragen könnte, um den Verzeichnisnamen zu erstellen, anstatt mich auf die Emacs-Version zu verlassen?

Beachten Sie, dass ich hauptsächlich an der vollständigen Kompatibilität interessiert bin, nicht nur an der Abwärtskompatibilität. Ich könnte Emacs 27.3 ausführen und einige Dateien per Byte kompilieren, und später Emacs 27.2 mit demselben Home-Verzeichnis.


Warum führen Sie aus Neugier solche alten Versionen aus? 19 muss inzwischen mehr als ein Jahrzehnt sein.
Tyler

Einige Emacs 24.2 .elc-Dateien funktionieren nicht mit Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Antworten:


9

Als Betreuer bemühe ich mich, Folgendes zu bewahren:

  • Abwärtskompatibilität von Bytecode. Das heißt, Sie sollten in der Lage sein, Ihre mit Emacs-19 kompilierte .elc-Datei zu nehmen und sie erfolgreich in Emacs-27 auszuführen. In der Praxis funktioniert dies natürlich nicht immer, da Rückwärtsinkompatibilitäten entweder zufällig oder bewusst auftreten (obwohl diese normalerweise nicht spezifisch für bytekompilierte Dateien sind).
  • Volle Bytecode-Kompatibilität innerhalb einer Hauptversion. Dies wird mit weniger Sorgfalt befolgt, hauptsächlich, weil es dazu neigt, automatisch zu geschehen, aber normalerweise sollten Sie in der Lage sein, auf 27.N Byte zu kompilieren und es auf 27.1 erfolgreich auszuführen. Es wird jedoch immer empfohlen, die ältere Version per Byte zu kompilieren.

Das Obige bezieht sich natürlich speziell auf den Byte-kompilierten Code und hängt immer noch von der tatsächlichen allgemeinen Kompatibilität ab: Wenn er foo.elin Emacs-19 und Emacs-27 ausgeführt wird, sollte ein foo.elcauf Emacs-19 kompilierter Code auf Emacs-27 funktionieren. Aber wenn das foo.elauf Emacs-19 oder Emacs-27 nicht funktioniert, funktioniert das auf Emacs-19 foo.elckompilierte auf Emacs-27 wahrscheinlich nicht.

Es gibt auch einige Fälle, in denen wir die Abwärtskompatibilität von bytekompiliertem Code bewusst aufheben.


5

Sie sollten nicht erwarten, dass Bytecode-Dateien zwischen verschiedenen Emacs-Versionen kompatibel sind. Das eigentliche Bytecode-Format ist größtenteils aufwärtskompatibel, aber Sie werden Probleme mit erweiterten Makros haben.

Lassen Sie mich erklären. Wenn der Byte-Compiler auf ein Makro stößt, berechnet er die Erweiterung des Makros und kompiliert das Ergebnis. Wenn das Makro zu einem Aufruf einer Funktion erweitert wurde, enthält die resultierende Bytecodedatei einen Verweis auf die Funktion. Wenn sich eine interne Funktion, die in der Erweiterung eines Makros angezeigt wird, zwischen den Emacs-Versionen ändert, ist der Bytecode nicht kompatibel.

Offensichtlich versuchen die Emacs-Entwickler, Makros zu vermeiden, die sich auf interne Funktionen ausweiten, die sich möglicherweise ändern. Dies ist jedoch manchmal schwierig zu erreichen, und ich würde nicht damit rechnen, insbesondere bei großen Änderungen wie der Einführung von gv.elEmacs 24.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.