Vì sao tôi chọn Common Lisp
(blog.djhaskin.com)Tạm biệt, Clojure
- Tôi đã dùng Clojure khoảng 7 năm, nhưng không còn thấy hài lòng vì vấn đề "tốc độ khởi động chậm" của các ứng dụng CLI
- Đã có những dự án như babashka, nhưng ngay cả với
native-imagecủa GraalVM cũng khó giải quyết được tốc độ khởi động chậm - "Tốc độ khởi động nhanh của tệp thực thi độc lập" đã trở thành yêu cầu bắt buộc, và tôi kết luận rằng Clojure không đáp ứng được điều này
Tìm một Lisp mới
- Tôi đã khảo sát nhiều ngôn ngữ để tìm một ngôn ngữ Lisp mới, với mục tiêu giải quyết những vấn đề từng gặp ở các dự án trước
- Dù ban đầu không có "yêu cầu rõ ràng", cuối cùng tôi đã hệ thống lại các tiêu chí như sau
- Phải có khả năng tạo ra "tệp thực thi độc lập, có thể chạy ngay và khởi động nhanh" bằng một toolchain hợp lý (để giải quyết phàn nàn lớn nhất với Clojure)
- Vì tôi không thể dùng Emacs, nên phải dùng được với Vim
- Hỗ trợ Windows và Mac là bắt buộc, không thể chỉ hỗ trợ Linux/POSIX
- Sẽ tốt hơn nếu có khả năng tích hợp với các ngôn ngữ cộng đồng lớn khác như cách Clojure tích hợp với Java
- Tốc độ runtime phải đủ nhanh (ưu tiên ngang hoặc hơn Clojure)
- Phải có hỗ trợ đa luồng mạnh mẽ, và nếu có thể thì không có thứ gì như GIL (Global Interpreter Lock)
- Cộng đồng mạnh là điều bắt buộc
- Phải có hệ sinh thái phong phú, tối thiểu cần có các thư viện sau
- Phân tích và tuần tự hóa JSON
- Hỗ trợ Sqlite3
- Thư viện gửi HTTP request
- Hỗ trợ cấu trúc dữ liệu hàm kiểu như Clojure (dù phần này ít quan trọng hơn)
- Những ngôn ngữ đã khảo sát
- Scheme: cộng đồng bị chia rẽ vì vấn đề chuẩn hóa với r6rs và r7rs nên không thật sự thu hút tôi, và hệ sinh thái cũng quá nhỏ để đáp ứng nhu cầu
- Racket: tôi từng dùng thời còn đi học, nhưng không thích vì runtime chậm và cảm giác khá nặng
- Common Lisp: tôi phát hiện ra qua lisp-lang.org. Cộng đồng và tài liệu gây ấn tượng mạnh, nên tôi quyết định thử
Phép màu bắt đầu từ đây
- Tôi sẽ bỏ qua toàn bộ câu chuyện về hành trình học Common Lisp, nhưng quá trình đó thực sự khá gian nan
- Khởi đầu đã không suôn sẻ. Vào dịp Giáng sinh tôi nhận được cuốn CLtLv2 và bắt đầu bằng cách đọc nó
- Sau đó tôi phát hiện ra HyperSpec và bắt đầu đọc, từ đó việc học đi theo hướng tốt hơn
- Common Lisp có một số đặc điểm rất riêng
- Đây là một ngôn ngữ đã được chuẩn hóa, giống C hơn là Java ở khía cạnh đó
- Có nhiều compiler, interpreter và runtime cùng triển khai tiêu chuẩn này
- Có những công cụ như Roswell để cài đặt và quản lý nhiều implementation khác nhau
- SBCL được xem là implementation phổ biến nhất trong cộng đồng
- Nếu lúc bắt đầu khám phá mà tôi đã biết đến Janet thì sao?
- Janet có những đặc điểm sau, nên có lẽ tôi đã thấy hài lòng ngay cả trước khi học Common Lisp
- Cú pháp gọn gàng, tệp thực thi nhanh và nhỏ, có hỗ trợ C FFI
- Có một tài liệu nhập môn rất thú vị
- Đáp ứng mọi yêu cầu mà cá nhân tôi coi trọng
- Nhưng lý do tôi vẫn chọn Common Lisp
- Nếu không, tôi đã bỏ lỡ những tính năng nâng cao như CLOS và Condition System mà về sau mới biết đến
- Common Lisp là một ngôn ngữ mạnh mẽ hơn
Đáp ứng các yêu cầu
Sau khi xác nhận Common Lisp đáp ứng được các yêu cầu, tôi đã chọn nó làm ngôn ngữ Lisp tiếp theo và dùng cho đến nay. Những phát hiện chính như sau:
- Tệp thực thi độc lập:
- Có nhiều cách để tạo tệp thực thi độc lập trong Common Lisp
- Tùy việc có nén tệp thực thi hay không, thời gian khởi động có thể chỉ là một phần nhỏ của một giây hoặc gần như tức thì
- Đây không phải là một tùy chọn phụ thêm mà được thiết kế như phương thức chính để triển khai chương trình Lisp
- Quy trình làm việc với Vim:
- Có nhiều lựa chọn rất tốt, nhưng cá nhân tôi tự dựng quy trình làm việc với Vim để dùng
- Tôi cũng xác nhận rằng VS Code đủ ổn để dùng như một IDE cho Common Lisp
- Hỗ trợ Windows/Mac/Linux:
- SBCL hỗ trợ tốt các hệ điều hành chính
- Tích hợp với hệ sinh thái mệnh lệnh quy mô lớn:
- Hầu hết các implementation đều hỗ trợ tích hợp tốt với ngôn ngữ C và có thể tận dụng qua CFFI
- Tốc độ runtime:
- SBCL có tốc độ runtime rất nhanh
- Đa luồng:
- Chuẩn Common Lisp không bao gồm hỗ trợ đa luồng một cách tường minh, nhưng các implementation chính đều có hỗ trợ
- Thư viện Bordeaux-Threads giúp giảm khác biệt giữa các implementation
- Có thể lập trình đa luồng và bất đồng bộ bằng các thư viện như lparallel, cl-async, blackbird
- Cộng đồng mạnh:
- Tôi đã tham gia sau khi nhận ra mức độ hoạt động của cộng đồng
- Kết quả khảo sát cộng đồng năm 2024 và European Lisp Symposium cho thấy cộng đồng Common Lisp rất sôi động
- Sự hỗ trợ từ cộng đồng cũng rất mạnh trên mạng lưới blog và subreddit
- Hệ sinh thái:
- Đa số dùng Quicklisp, nhưng cá nhân tôi quản lý gói bằng OCICL
- Có thể tìm thư viện và thông tin kỹ thuật qua Common Lisp Cookbook, CLiki, Awesome CL
- Hỗ trợ các thư viện cụ thể:
- JSON: jzon
- Sqlite3: cl-sqlite
- HTTP request: dexador
- Cấu trúc dữ liệu hàm: FSet, cl-hamt
Lưu ý dành cho người mới
- Vì ngày càng có nhiều người mới trên Discord Common Lisp, tôi viết bài này để chia sẻ quá trình mình đã chọn và thích nghi với Common Lisp
- Tôi hy vọng bài viết này sẽ hữu ích với những ai đang quan tâm đến Common Lisp
2 bình luận
Ý kiến trên Hacker News
Trải nghiệm dùng SBCL để giải quyết vấn đề ngay cả khi không có mã nguồn đã để lại ấn tượng mạnh. Với các stack công nghệ khác, có lẽ đã không thể sửa nhanh như vậy khi thiếu mã nguồn
Chia sẻ trải nghiệm chuyển từ Common Lisp sang Clojure, và thấy các tính năng đồng thời của Clojure rất hấp dẫn
Dùng vim-slime giúp năng suất và mức độ hài lòng của lập trình viên tăng lên đáng kể
Không hiểu được giá trị của Lisp, nhưng vẫn nhớ một bài hát liên quan đến nó
Cho rằng Emacs/slime là IDE Lisp tốt hơn vim-slime
Dùng Common Lisp như sở thích cá nhân và muốn chạy mã C# trong SBCL REPL
Chia sẻ trải nghiệm phát triển ứng dụng CLI bằng Clojure và babashka
Gặp vấn đề khi dùng native-image và cho rằng Clojure là một ngôn ngữ gần như hoàn hảo
Bày tỏ sự quan tâm đến ngôn ngữ Janet, đồng thời nhắc rằng README và FAQ trên GitHub của dự án rất hữu ích
Chia sẻ một trải nghiệm khiến họ muốn học Lisp, đặc biệt bị thu hút bởi tác giả là một người hâm mộ vim rất nhiệt thành
Tôi không hiểu được giá trị của Lisp, nhưng lại nhớ những bài hát liên quan... Có khá nhiều bài hát về Lisp, và trên YouTube có một bài tên là Land of Lisp ;-)