-
Có thể kết hợp runtime Deno vào Emacs để dùng JavaScript/TypeScript
-
Engine V8 được tối ưu hóa tốt hơn VM Elisp
-
Có thể xử lý những điểm còn thiếu của Emacs về xử lý bất đồng bộ và đa luồng bằng JavaScript (
Async/Await, Web Worker), đồng thời cũng hỗ trợ WebAssembly -
Có thể tăng tốc bằng GPU (mang tính thử nghiệm) nhờ
native-compchuyển Elisp sang Native Code và sử dụng WebRender của Firefox làm compositor
Cách đây không lâu, dự án này đã từng được đăng trên Hacker News.
6 bình luận
Tôi trước đây chỉ dùng Spacemacs chứ chưa dùng Emacs nhiều nên cũng không rõ lắm, nhưng tôi đã đọc đoạn bên dưới ở trang chính và thấy khá thú vị. Có vẻ cuối cùng thì điểm cốt lõi là kích hoạt hệ sinh thái bằng cách cải thiện hiệu năng thông qua Deno và mở rộng hỗ trợ ngôn ngữ.
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) => {
};
Triển khai JS của emacs-ng chạy nhanh hơn emacs 28 không có native-comp hơn 50 lần khi tính fib(40). Với native-comp ở mức 3, JS vẫn nhanh hơn hơn 15 lần. Điều này, cùng với Async I/O từ Deno, WebWorkers và WebAsm, mang lại cho bạn các công cụ để biến Emacs thành một trải nghiệm mượt và nhanh hơn mà không cần cài thêm công cụ để chạy như tiến trình nền hoặc phải lo về phiên bản thư viện dùng chung - hiệu năng đầy đủ với MỌI THỨ ở tầng scripting.
Thực ra khả năng mở rộng tự thân của nó không tệ.
Macro đặc trưng của Lisp
Hỗ trợ mô-đun động nên có thể binding với ngôn ngữ native (các dự án như tree-sitter là ví dụ tiêu biểu)
Cũng có thể dùng nội bộ trình giả lập terminal và trình duyệt theo kiểu native nhờ hỗ trợ libvterm và Xwidget..
https://github.com/canatella/xwwp
Vấn đề là I/O và thread.
Vì I/O chưa được triển khai bất đồng bộ nên các tệp lớn sẽ bị đơ, còn dù có tạo thread thì chỉ hỗ trợ concurrency chứ không phải parallelism, nên khi tải tăng lên là gần như chắc chắn sẽ phát sinh vấn đề.😢😢😢
Nhưng dự án này
https://github.com/DavidDeSimone/ng-async-files
cho thấy có nỗ lực hỗ trợ xử lý tệp bất đồng bộ,
nên mình đang khá quan tâm.
Ngoài ra còn có thể tận dụng hệ sinh thái khổng lồ của NPM nữa.
https://emacs-ng.github.io/emacs-ng/main-features/
Đây là một lớp được thêm vào theo cách tách biệt nghiêm ngặt, nên có thể áp dụng các bản vá từ upstream một cách gọn gàng.
Ví dụ tiêu biểu là hôm qua tôi đã thử gộp nhánh
native-compcủa bản mirror Emacs,có hơn 1200 commit nhưng xung đột chỉ phát sinh ở khoảng 4~5 tệp mà thôi.
https://github.com/emacs-mirror/emacs/tree/feature/native-comp
https://github.com/emacs-ng/emacs-ng/pull/185
Tình cờ lại gia nhập vào team rồi haha
Ồ, tuyệt vời quá. Cố lên nhé!!
Cảm ơn!!