Saya terkadang menjalankan beberapa versi Emacs dari direktori home yang sama. Saya memiliki sejumlah file yang dikompilasi dengan byte. Bytecode tidak kompatibel di semua versi Emacs, jadi saya memelihara direktori terpisah untuk .elc
file untuk setiap rentang versi.
Berapa kisaran versi yang bytecode-nya kompatibel? Saat ini saya punya
gnu-19.29
gnu-20
gnu-21
gnu-22
gnu-23
gnu-24
source
x-19
x-20
x-21
yaitu direktori untuk setiap rilis utama, dengan pemisahan tambahan pada 19,29 (saya tidak pernah menggunakan versi yang lebih lama pada mesin ini, jika tidak akan ada gnu-19
), dan direktori terpisah untuk GNU Emacs dan XEmacs. Saya mungkin terlalu berhati-hati.
Apa kebijakan resmi mengenai kompatibilitas bytecode lintas versi Emacs? Bisakah saya dengan percaya diri terus menggunakan versi utama? Bisakah saya menggabungkan beberapa versi? Apakah ada indikasi versi bytecode atau checksum yang dapat saya query ketika kompilasi untuk membuat nama direktori alih-alih mengandalkan versi Emacs?
Perhatikan bahwa saya terutama tertarik pada kompatibilitas penuh, bukan hanya kompatibilitas ke belakang. Saya mungkin menjalankan Emacs 27.3 dan byte-compile beberapa file, dan kemudian Emacs 27.2 dengan direktori home yang sama.
Jawaban:
Sebagai pengelola, saya berupaya untuk mempertahankan yang berikut:
Tentu saja, di atas secara khusus tentang byte kode yang dikompilasi, dan masih tergantung pada kompatibilitas umum yang sebenarnya: jika
foo.el
berjalan di Emacs-19 dan Emacs-27, maka yangfoo.elc
dikompilasi pada Emacs-19 harus bekerja pada Emacs-27. Tetapi jika itufoo.el
tidak bekerja pada Emacs-19 atau pada Emacs-27, makafoo.elc
kompilasi pada Emacs-19 mungkin tidak akan bekerja pada Emacs-27.Juga, ada beberapa kasus di mana kita secara sadar memecah kompatibilitas kode byte-dikompilasi.
sumber
Anda seharusnya tidak mengharapkan file bytecode kompatibel antara versi Emacs yang berbeda. Format bytecode yang sebenarnya sebagian besar kompatibel ke atas, tetapi Anda akan mengalami masalah dengan makro yang diperluas.
Biarkan saya jelaskan. Ketika byte-compiler menemui makro, ia menghitung ekspansi makro dan mengkompilasi hasilnya. Jika makro diperluas ke panggilan ke fungsi, maka file bytecode yang dihasilkan akan berisi referensi ke fungsi. Jika fungsi internal yang muncul dalam perluasan perubahan makro antara versi Emacs, maka bytecode tidak akan kompatibel.
Jelas, pengembang Emacs mencoba untuk menghindari makro yang meluas ke fungsi internal yang mungkin berubah. Namun, ini terkadang sulit untuk dicapai, dan saya tidak akan mengandalkan itu, terutama dengan adanya perubahan besar seperti pengenalan
gv.el
di Emacs 24.sumber