Przenośność kodu bajtowego między wersjami Emacsa

9

Czasami uruchamiam wiele wersji Emacsa z tego samego katalogu domowego. Mam wiele skompilowanych bajtów plików. Kod bajtowy nie jest kompatybilny ze wszystkimi wersjami Emacsa, więc utrzymuję osobne katalogi dla .elcplików dla każdego zakresu wersji.

Jakie są zakresy wersji, dla których kod bajtowy jest zgodny? Obecnie mam

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

tj. katalogi dla każdego głównego wydania, z dodatkową separacją 19.29 (nigdy nie korzystałem ze starszej wersji na tym komputerze, inaczej byłoby gnu-19) i osobne katalogi dla GNU Emacs i XEmacs. Ale prawdopodobnie jestem zbyt ostrożny.

Jakie są oficjalne zasady dotyczące zgodności kodu bajtowego między wersjami Emacsa? Czy mogę śmiało używać głównej wersji? Czy mogę scalić niektóre wersje? Czy istnieje wskazanie wersji kodu bajtowego lub suma kontrolna, które można zapytać podczas kompilacji, aby utworzyć nazwę katalogu zamiast polegać na wersji Emacsa?

Zauważ, że interesuje mnie przede wszystkim pełna kompatybilność, a nie tylko kompatybilność wsteczna. Mogę uruchomić Emacsa 27.3 i skompilować bajtowo niektóre pliki, a później Emacsa 27.2 z tym samym katalogiem domowym.

Gilles „SO- przestań być zły”
źródło
Z ciekawości, dlaczego uruchamiasz tak stare wersje? 19 musi być już ponad dekadą.
Tyler,
Niektóre pliki .elc Emacsa 24.2 nie działają z Emacsem
Wilfred Hughes

Odpowiedzi:

9

Jako opiekun staram się zachować następujące elementy:

  • Kompatybilność wsteczna kodu bajtowego. Oznacza to, że powinieneś być w stanie pobrać plik .elc skompilowany z Emacs-19 i pomyślnie uruchomić go w Emacs-27. Oczywiście w praktyce nie zawsze działa, ponieważ wsteczne niezgodności są wprowadzane przypadkowo lub świadomie (zazwyczaj nie są one specyficzne dla plików skompilowanych według bajtów).
  • Pełna zgodność kodu bajtowego w głównej wersji. Jest to wykonywane z mniejszą ostrożnością, głównie dlatego, że dzieje się to automatycznie, ale zwykle powinieneś być w stanie skompilować bajtowo na 27.N i uruchomić go z powodzeniem na 27.1. To powiedziawszy, zawsze zaleca się bajtową kompilację na starszej wersji.

Oczywiście powyższe dotyczy konkretnie skompilowanego bajtu i nadal zależy od faktycznej ogólnej kompatybilności: jeśli foo.eldziała w Emacs-19 i Emacs-27, to foo.elcskompilowana na Emacs-19 powinna działać na Emacs-27. Ale jeśli foo.elto nie działa na Emacs-19 lub Emacs-27, to foo.elcskompilowane na Emacs-19 prawdopodobnie nie będzie działać na Emacs-27.

Ponadto istnieje kilka przypadków, w których świadomie łamiemy wsteczną zgodność kodu skompilowanego bajtowo.

Stefan
źródło
5

Nie należy oczekiwać, że pliki kodu bajtowego będą kompatybilne między różnymi wersjami Emacsa. Rzeczywisty format kodu bajtowego jest w większości kompatybilny w górę, ale będziesz mieć problemy z rozszerzonymi makrami.

Pozwól mi wyjaśnić. Gdy kompilator bajtów napotka makro, oblicza rozwinięcie makra i kompiluje wynik. Jeśli makro zostanie rozwinięte do wywołania funkcji, wynikowy plik kodu bajtowego będzie zawierał odwołanie do funkcji. Jeśli funkcja wewnętrzna pojawiająca się w rozszerzeniu makra zmienia się między wersjami Emacsa, kod bajtowy nie będzie kompatybilny.

Oczywiście programiści Emacsa starają się unikać makr, które rozszerzają się na funkcje wewnętrzne, które mogą ulec zmianie. Czasami jest to jednak trudne do osiągnięcia i nie liczyłbym na to, zwłaszcza w obliczu dużych zmian, takich jak wprowadzenie gv.elEmacsa 24.

jch
źródło