let-go là gì và tại sao nó đáng chú ý?

let-go là một biến thể của ngôn ngữ Clojure được viết hoàn toàn bằng Go, không cần máy ảo JVM. Kết quả là một file nhị phân chỉ nặng ~10MB, thời gian khởi động chỉ 7ms, nhanh hơn khoảng 50 lần so với Clojure JVM và 3 lần so với Babashka. Dự án này ra đời từ năm 2021 như một trò đùa của tác giả, nhưng nhanh chóng trở thành công cụ hữu ích cho CLI, script và web server. Người dùng có thể biên dịch chương trình let-go thành file nhị phân độc lập hoặc trang web WASM tự chứa, thậm chí chạy được trên Plan 9.

Hiệu năng và khả năng tương thích

Trong bài kiểm tra với bộ thử nghiệm jank-lang, let-go đạt 95.4% số assertion (4696/4921). Nó hỗ trợ hầu hết các tính năng cốt lõi của Clojure: cấu trúc dữ liệu bền vững, lazy seq, transducer, protocol, multimethod, core.async và BigInt. Điểm yếu là các tác vụ số học nặng (fibonacci, reduce) vẫn thua go-joker nhờ JIT, và JVM vẫn thắng trên các tác vụ chạy dài sau khi HotSpot warm up. Tuy nhiên, let-go vượt trội ở các tác vụ ngắn: map/filter chỉ 7.9ms so với 21.5ms của Babashka, và persistent maps đạt 20.8ms so với 23.7ms.

Tích hợp Go và hệ sinh thái Babashka

let-go cho phép gọi trực tiếp code Go (function, struct, channel) và có thể nạp pod của Babashka, mở ra kho plugin khổng lồ: SQLite, AWS, Docker, file watching. Ví dụ, bạn có thể viết (pods/load-pod 'org.babashka/go-sqlite3 "0.3.13") và thao tác với database như một ứng dụng Clojure thông thường. Điều này giúp lập trình viên Go có thể sử dụng Clojure ngay trong công việc hàng ngày mà không cần chuyển đổi ngôn ngữ.

Ý nghĩa cho cộng đồng công nghệ

Dự án này không nhằm thay thế JVM Clojure, nhưng nó mang lại lựa chọn nhẹ nhàng hơn cho các tác vụ nhỏ, script nhanh và ứng dụng realtime. Với khả năng khởi động dưới 10ms, let-go có thể chạy bên trong một vòng lặp requestAnimationFrame (10ms còn lại ở 60fps). Đây là bước tiến thú vị trong phong trào đưa các ngôn ngữ hàm vào môi trường nhẹ, và có thể truyền cảm hứng cho các dự án công nghệ tương tự.