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 .elc
plikó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.
Odpowiedzi:
Jako opiekun staram się zachować następujące elementy:
Oczywiście powyższe dotyczy konkretnie skompilowanego bajtu i nadal zależy od faktycznej ogólnej kompatybilności: jeśli
foo.el
działa w Emacs-19 i Emacs-27, tofoo.elc
skompilowana na Emacs-19 powinna działać na Emacs-27. Ale jeślifoo.el
to nie działa na Emacs-19 lub Emacs-27, tofoo.elc
skompilowane 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.
źródło
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.el
Emacsa 24.źródło