ความสามารถในการบายพาสระหว่างรุ่นของ Emacs


9

บางครั้งฉันรัน Emacs หลายรุ่นจากโฮมไดเร็กตอรี่เดียวกัน ฉันมีไฟล์ที่รวบรวมไบต์จำนวนหนึ่ง Bytecode ไม่สามารถใช้งานได้กับทุกรุ่นของ Emacs ดังนั้นฉันจึงดูแลไดเรกทอรีแยกต่างหากสำหรับ.elcไฟล์สำหรับแต่ละรุ่น

รุ่นใดบ้างที่ bytecode เข้ากันได้ ฉันมี

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

เช่นไดเรกทอรีสำหรับแต่ละรุ่นใหญ่โดยมีการแยกเพิ่มเติมที่ 19.29 (ฉันไม่เคยใช้รุ่นเก่าในเครื่องนี้มิฉะนั้นจะมีgnu-19) และไดเรกทอรีที่แยกต่างหากสำหรับ GNU Emacs และ XEmacs แม้ว่าฉันอาจจะระมัดระวังมากเกินไป

นโยบายอย่างเป็นทางการเกี่ยวกับความเข้ากันได้ของ bytecode ในรุ่น Emacs คืออะไร? ฉันสามารถใช้เวอร์ชันหลักอย่างมั่นใจได้หรือไม่? ฉันสามารถรวมบางเวอร์ชั่นได้หรือไม่ มีตัวบ่งชี้เวอร์ชัน bytecode หรือการตรวจสอบที่ฉันสามารถสอบถามเมื่อรวบรวมเพื่อสร้างชื่อไดเรกทอรีแทนการใช้รุ่น Emacs หรือไม่

โปรดทราบว่าฉันมักจะสนใจความเข้ากันได้แบบเต็มรูปแบบไม่ใช่แค่ความเข้ากันได้แบบย้อนหลัง ฉันอาจใช้ Emacs 27.3 และรวบรวมไฟล์บางไฟล์แล้วก็ Emacs 27.2 ในภายหลังพร้อมกับโฮมไดเร็กตอรี่เดียวกัน


ทำไมคุณถึงเรียกใช้เวอร์ชั่นเก่าเหล่านี้ ตอนนี้ต้องมากกว่าสิบปีแล้ว
ไทเลอร์

ไฟล์ Emacs 24.2 .elc บางไฟล์ไม่สามารถใช้งานได้กับ Emacs 24.3: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

คำตอบ:


9

ในฐานะผู้ดูแลฉันพยายามรักษาสิ่งต่อไปนี้:

  • ความเข้ากันได้ย้อนหลังของรหัสไบต์ นั่นคือคุณควรจะสามารถใช้ไฟล์. elc ที่คอมไพล์ด้วย Emacs-19 และรันใน Emacs-27 ได้สำเร็จ แน่นอนว่าในทางปฏิบัติมันไม่ได้ผลเสมอไปเพราะมีการใช้งานร่วมกันไม่ได้แบบย้อนกลับไม่ว่าจะโดยบังเอิญหรือโดยเจตนา (สิ่งเหล่านี้มักจะไม่เจาะจงกับไฟล์ที่คอมไพล์แล้วด้วย)
  • ความเข้ากันได้แบบเต็มไบต์โค้ดภายในเวอร์ชันหลัก ตามมาด้วยความระมัดระวังน้อยกว่าส่วนใหญ่เป็นเพราะมันมีแนวโน้มที่จะเกิดขึ้นโดยอัตโนมัติ แต่โดยปกติแล้วคุณควรจะสามารถคอมไพล์ไบต์ในวันที่ 27.N และรันมันสำเร็จในวันที่ 27.1 สิ่งนี้กล่าวว่าขอแนะนำให้คอมไพล์ไบต์ด้วยเวอร์ชันเก่ากว่าเสมอ

แน่นอนข้างต้นเป็นรหัสเฉพาะเกี่ยวกับการคอมไพล์รหัสไบต์และยังขึ้นอยู่กับความเข้ากันได้ทั่วไปที่แท้จริง: หากfoo.elทำงานใน Emacs-19 และ Emacs-27 ดังนั้นการfoo.elcคอมไพล์บน Emacs-27 ควรทำงานกับ Emacs-27 แต่ถ้านั่นfoo.elไม่ได้ผลกับ Emacs-19 หรือ Emacs-27 ดังนั้นการfoo.elcคอมไพล์บน Emacs-19 อาจจะไม่ทำงานกับ Emacs-27

นอกจากนี้ยังมีบางกรณีที่เราทำลายความเข้ากันได้แบบย้อนหลังของโค้ดที่คอมไพล์ด้วยไบต์


5

คุณไม่ควรคาดหวังว่าไฟล์ bytecode จะใช้งานร่วมกันได้ระหว่างเวอร์ชั่น Emacs ที่แตกต่างกัน รูปแบบไบต์ที่เกิดขึ้นจริงส่วนใหญ่เข้ากันได้ แต่คุณจะประสบปัญหากับมาโครที่ขยาย

ให้ฉันอธิบาย เมื่อ byte-compiler พบแมโครมันจะคำนวณการขยายตัวของแมโครและรวบรวมผลลัพธ์ หากแมโครขยายไปยังการเรียกใช้ฟังก์ชันไฟล์ bytecode ที่ได้จะมีการอ้างอิงไปยังฟังก์ชัน หากฟังก์ชั่นภายในที่ปรากฏในการขยายตัวของการเปลี่ยนแปลงแมโครระหว่างรุ่น Emacs แล้ว bytecode จะไม่เข้ากัน

เห็นได้ชัดว่าผู้พัฒนา Emacs พยายามหลีกเลี่ยงมาโครที่ขยายไปยังฟังก์ชั่นภายในที่อาจมีการเปลี่ยนแปลง อย่างไรก็ตามบางครั้งก็เป็นเรื่องยากที่จะประสบความสำเร็จและฉันจะไม่นับสิ่งนั้นโดยเฉพาะเมื่อมีการเปลี่ยนแปลงครั้งใหญ่เช่นการเปิดตัวgv.elใน Emacs 24

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.