Tính di động của mã byte giữa các phiên bản Emacs


9

Đôi khi tôi chạy nhiều phiên bản Emacs từ cùng một thư mục nhà. Tôi có một số tập tin được biên dịch byte. Bytecode không tương thích trên tất cả các phiên bản Emacs, vì vậy tôi duy trì các thư mục riêng cho .elccác tệp cho từng phạm vi phiên bản.

Phạm vi phiên bản mà mã byte tương thích là gì? Tôi hiện đang có

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

tức là các thư mục cho mỗi bản phát hành chính, với sự phân tách bổ sung vào 19,29 (tôi chưa bao giờ sử dụng phiên bản cũ hơn trên máy này, nếu không gnu-19) và các thư mục riêng cho GNU Emacs và XEmac. Tôi có lẽ quá thận trọng.

Chính sách chính thức liên quan đến khả năng tương thích mã byte trên các phiên bản Emacs là gì? Tôi có thể tự tin tiếp tục sử dụng phiên bản chính? Tôi có thể hợp nhất một số phiên bản không? Có một dấu hiệu hoặc tổng kiểm tra phiên bản mã byte mà tôi có thể truy vấn khi biên dịch để tạo tên thư mục thay vì dựa vào phiên bản Emacs không?

Lưu ý rằng tôi chủ yếu quan tâm đến khả năng tương thích hoàn toàn, không chỉ là khả năng tương thích ngược. Tôi có thể chạy Emacs 27.3 và biên dịch byte một số tệp, và sau đó là Emacs 27.2 với cùng thư mục chính.


Vì tò mò, tại sao bạn chạy các phiên bản cũ như vậy? 19 phải được hơn một thập kỷ cho đến nay.
Tyler

Một số tệp Emacs 24.2 .elc không hoạt động với Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

Câu trả lời:


9

Là người duy trì, tôi cố gắng giữ gìn những điều sau:

  • Khả năng tương thích ngược của mã byte. Tức là bạn sẽ có thể lấy tệp .elc của mình được biên dịch bằng Emacs-19 và chạy nó trong Emacs-27 thành công. Tất nhiên, trong thực tế, nó không phải lúc nào cũng hoạt động, bởi vì sự không tương thích ngược được đưa vào một cách tình cờ hoặc có ý thức (tho chúng thường không đặc trưng cho các tệp được biên dịch).
  • Tương thích mã byte đầy đủ trong một phiên bản chính. Điều này được theo dõi với ít sự quan tâm hơn, chủ yếu là vì nó có xu hướng tự động xảy ra, nhưng thông thường bạn sẽ có thể biên dịch byte vào ngày 27.N và chạy thành công vào ngày 27.1. Điều này nói rằng, nó luôn được khuyến nghị để biên dịch byte trên phiên bản cũ hơn.

Tất nhiên, ở trên cụ thể là về mã được biên dịch byte và vẫn phụ thuộc vào khả năng tương thích chung thực tế: nếu foo.elchạy trong Emacs-19 và Emacs-27, thì một trình foo.elcbiên dịch trên Emacs-19 sẽ hoạt động trên Emacs-27. Nhưng nếu điều foo.elđó không hoạt động trên Emacs-19 hoặc trên Emacs-27, thì phần foo.elctổng hợp trên Emacs-19 có thể sẽ không hoạt động trên Emacs-27.

Ngoài ra, có một vài trường hợp chúng tôi cố tình phá vỡ tính tương thích ngược của mã được biên dịch byte.


5

Bạn không nên mong đợi các tệp mã byte tương thích giữa các phiên bản Emacs khác nhau. Định dạng mã byte thực tế hầu hết tương thích trở lên, nhưng bạn sẽ gặp rắc rối với các macro mở rộng.

Hãy để tôi giải thích. Khi trình biên dịch byte gặp macro, nó sẽ tính toán mở rộng của macro và biên dịch kết quả. Nếu macro được mở rộng thành một lệnh gọi đến một hàm, thì tệp bytecode kết quả sẽ chứa một tham chiếu đến hàm. Nếu một chức năng nội bộ xuất hiện trong việc mở rộng macro thay đổi giữa các phiên bản Emacs, thì mã byte sẽ không tương thích.

Rõ ràng, các nhà phát triển Emacs cố gắng tránh các macro mở rộng sang các chức năng bên trong có thể thay đổi. Tuy nhiên, điều này đôi khi khó đạt được và tôi sẽ không tính đến điều đó, đặc biệt là khi có sự thay đổi lớn như giới thiệu gv.eltrong Emacs 24.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.