-
ผสาน Deno runtime เข้ากับ Emacs ทำให้สามารถใช้ JavaScript/TypeScript ได้
-
เอนจิน V8 ได้รับการปรับแต่งให้มีประสิทธิภาพดีกว่า Elisp VM
-
สามารถจัดการข้อจำกัดของ Emacs ด้านการประมวลผลแบบอะซิงโครนัสและมัลติเธรดด้วย JavaScript ได้ (Async/Await, Web Worker) และยังรองรับ WebAssembly
-
ใช้
native-compที่แปลง Elisp เป็น Native Code และใช้ Webrender ของ Firefox เป็น compositor เพื่อรองรับการเร่งความเร็วด้วย GPU (อยู่ในช่วงทดลอง)
ไม่นานมานี้เคยขึ้นบน Hacker News ด้วย
6 ความคิดเห็น
ผมเคยใช้ Emacs แค่ผ่าน Spacemacs มาก่อนเลยอาจไม่ค่อยรู้ลึกนัก แต่พอได้อ่านส่วนด้านล่างในหน้าหลักแล้วก็น่าสนใจครับ สุดท้ายแล้วดูเหมือนว่าหัวใจสำคัญคือการทำให้ ecosystem คึกคักขึ้นผ่าน Deno ทั้งในด้านการเพิ่มประสิทธิภาพและการรองรับภาษา ผ่านการขยายความสามารถ
Performance#
v8's world-class JIT offers the potential for massive performance gains. For a simple benchmark (fibonacci), using the following implementations:
(defun fibonacci(n)
(if (<= n 1)
const fib = (n) => {
};
อิมพลีเมนเทชัน JS ของ emacs-ng ทำเวลาได้เร็วกว่า emacs 28 ที่ไม่ใช้ native-comp มากกว่า 50 เท่าในการคำนวณ fib(40) และเมื่อใช้ native-comp ระดับ 3 แล้ว JS ก็ยังเร็วกว่าเกิน 15 เท่า สิ่งนี้รวมกับ Async I/O จาก Deno, WebWorkers และ WebAsm ทำให้คุณมีเครื่องมือที่จะทำให้ Emacs ลื่นไหลและเร็วขึ้น โดยไม่ต้องติดตั้งเครื่องมือเพิ่มเติมเพื่อรันเป็นโปรเซสเบื้องหลังหรือกังวลเรื่องเวอร์ชันของ shared library — ได้ประสิทธิภาพเต็มที่โดยที่ EVERYTHING อยู่ในชั้นสคริปต์ทั้งหมด
จริงๆ แล้วความสามารถในการขยายระบบเองก็ไม่ได้แย่นัก
มาโครที่เป็นเอกลักษณ์ของ Lisp
การรองรับโมดูลแบบไดนามิก ทำให้มี native language binding ได้ (โปรเจ็กต์อย่าง tree-sitter เป็นตัวอย่างเด่น)
รวมถึงรองรับ libvterm และ Xwidget เลยสามารถใช้เทอร์มินัลอีมูเลเตอร์และเบราว์เซอร์แบบเนทีฟภายในได้ด้วย..
https://github.com/canatella/xwwp
ปัญหาคือเรื่อง I/O กับเธรดครับ
เพราะ I/O ไม่ได้ถูกทำเป็นแบบอะซิงก์ ไฟล์ขนาดใหญ่เลยเกิดอาการค้างได้ และถึงจะสร้างเธรดได้ก็รองรับแค่ concurrency ไม่ใช่ parallelism พอโหลดสูงขึ้นก็มักจะมีปัญหาแน่ๆ 😢😢😢
แต่โปรเจ็กต์นี้
https://github.com/DavidDeSimone/ng-async-files
ดูเหมือนจะมีความพยายามเพิ่มการรองรับการประมวลผลไฟล์แบบอะซิงก์
ก็เลยกำลังสนใจอยู่
แถมยังอาศัยระบบนิเวศอันมหาศาลของ NPM ได้ด้วยครับ
https://emacs-ng.github.io/emacs-ng/main-features/
เนื่องจากเป็นเลเยอร์ที่ถูกเพิ่มเข้ามาแบบแยกอย่างเคร่งครัด จึงสามารถนำแพตช์จาก upstream มาปรับใช้ได้อย่างเรียบร้อย
ตัวอย่างที่ชัดเจนคือ เมื่อวานผมลองรวม native-comp branch ของ Emacs mirror ดู
มีมากกว่า 1200 คอมมิต แต่เกิด conflict แค่ประมาณ 4~5 ไฟล์เท่านั้น
https://github.com/emacs-mirror/emacs/tree/feature/native-comp
https://github.com/emacs-ng/emacs-ng/pull/185
ไม่รู้ไปไม่รู้มายังไง สุดท้ายก็ได้มาร่วมทีมซะแล้ว 555
ว้าว เจ๋งมากครับ สู้ๆ นะครับ!!
ขอบคุณครับ!!