Portabilitas bytecode antara versi Emacs

9

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 .elcfile 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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Karena penasaran, mengapa Anda menjalankan versi lama seperti itu? 19 harus lebih dari satu dekade sekarang.
Tyler
Beberapa file Emacs 24.2 .elc tidak berfungsi dengan Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Jawaban:

9

Sebagai pengelola, saya berupaya untuk mempertahankan yang berikut:

  • Kompatibilitas mundur kode byte. Yaitu Anda harus dapat mengambil file .elc Anda dikompilasi dengan Emacs-19 dan menjalankannya di Emacs-27 dengan sukses. Tentu saja, dalam praktiknya hal itu tidak selalu berhasil, karena ketidaksesuaian mundur diperkenalkan baik secara kebetulan atau secara sadar (ini biasanya tidak spesifik untuk file bytecompile).
  • Kompatibilitas kode byte penuh dalam versi utama. Ini diikuti dengan kurang hati-hati, sebagian besar karena itu cenderung terjadi secara otomatis, tetapi biasanya Anda harus dapat mengkompilasi byte pada 27.N dan menjalankannya dengan sukses pada 27.1. Ini mengatakan, selalu disarankan untuk byte-compile pada versi yang lebih lama.

Tentu saja, di atas secara khusus tentang byte kode yang dikompilasi, dan masih tergantung pada kompatibilitas umum yang sebenarnya: jika foo.elberjalan di Emacs-19 dan Emacs-27, maka yang foo.elcdikompilasi pada Emacs-19 harus bekerja pada Emacs-27. Tetapi jika itu foo.eltidak bekerja pada Emacs-19 atau pada Emacs-27, maka foo.elckompilasi pada Emacs-19 mungkin tidak akan bekerja pada Emacs-27.

Juga, ada beberapa kasus di mana kita secara sadar memecah kompatibilitas kode byte-dikompilasi.

Stefan
sumber
5

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.eldi Emacs 24.

jch
sumber