Autology, một ngôn ngữ Lisp thông dịch hàm mới được viết bằng Clojure, đã tạo ra một cuộc thảo luận sôi nổi giữa những người đam mê ngôn ngữ lập trình. Đặc điểm nổi bật của dự án này là nó cung cấp cho các chương trình khả năng truy cập vào trình thông dịch của chính mình trong thời gian chạy, cho phép sửa đổi động hành vi của ngôn ngữ trong quá trình thực thi.
Sửa đổi ngôn ngữ trong thời gian chạy
Autology áp dụng một cách tiếp cận khác thường đối với lập trình meta bằng cách liên kết hàm thông dịch của nó với một biến có tên **
có thể truy cập được trong chương trình. Thiết kế này cho phép các nhà phát triển sửa đổi cách ngôn ngữ đánh giá các biểu thức trong khi chương trình đang chạy. Khác với các macro Lisp truyền thống hoạt động tại thời điểm biên dịch, Autology cho phép viết lại hoàn toàn cú pháp và ngữ nghĩa của ngôn ngữ trong thời gian chạy.
Người tạo ra dự án, với biệt danh Kimbsy, mô tả nó chủ yếu là để giải trí và khám phá một ý tưởng thú vị, đồng thời thừa nhận rằng cách triển khai hiện tại rất chậm và tốn nhiều tài nguyên. Kimbsy dự kiến sẽ trình bày về Autology tại London Clojurians vào tháng 5 và Lambda Days ở Krakow vào tháng 6.
Các Tính Năng Chính của Autology
- Được viết bằng ngôn ngữ Clojure
- Hàm thông dịch có sẵn như một cấu trúc dữ liệu cho chương trình
- Được gắn với biến
**
trong môi trường thực thi - Cho phép sửa đổi hành vi của ngôn ngữ trong thời gian chạy
- Có thể thêm, sửa đổi hoặc xóa các tính năng ngôn ngữ một cách động
Các Dự Án và Khái Niệm Liên Quan
- Các triển khai Common Lisp (SBCL, CCL) với các gói truy cập trình thông dịch
- Reader Macros trong Common Lisp
- FEXPRs (tính năng lịch sử của Lisp)
- Ngôn ngữ lập trình Kernel của John Shutt
- Nghiên cứu "Towers of interpreters" của Amin & Rompf
- Ngôn ngữ Shen
So sánh với cách tiếp cận Lisp truyền thống
Cuộc thảo luận cộng đồng cho thấy những so sánh thú vị giữa Autology và các triển khai Lisp truyền thống. Một số người bình luận lưu ý rằng các triển khai Common Lisp như SBCL (Steel Bank Common Lisp) và CCL (Clozure Common Lisp) đã cung cấp các gói để tương tác với các thành phần nội bộ của trình thông dịch, mặc dù không theo cách trực tiếp như Autology.
Một người bình luận đã giải thích cách các macro đọc (reader macros) của Common Lisp có thể đạt được tính linh hoạt tương tự:
Bạn thực sự có thể làm những điều cực kỳ điên rồ trong Common Lisp bằng cách sử dụng cái gọi là Reader Macro, cho phép bạn tạm thời kiểm soát hoàn toàn trình thông dịch.
Cuộc thảo luận cũng đề cập đến các khái niệm lịch sử của Lisp như FEXPRs (Function Expressions), là những nỗ lực ban đầu nhằm cung cấp các khả năng tương tự nhưng cuối cùng đã bị từ bỏ để ủng hộ macro vì lý do hiệu suất. Một lời giải thích kỹ thuật chi tiết của người dùng kazinator đã nhấn mạnh cách tiếp cận của Autology khác với FEXPRs bằng cách truyền một đối tượng thông dịch có thể tùy chỉnh thay vì chỉ là một môi trường từ vựng.
Ứng dụng lý thuyết và hạn chế
Mặc dù chủ yếu được tạo ra như một dự án thử nghiệm, cuộc thảo luận cộng đồng đã khám phá các ứng dụng tiềm năng cho sự linh hoạt cực độ trong thời gian chạy như vậy. Một trường hợp sử dụng lý thuyết được đề cập là khả năng chuyển đổi giữa các cú pháp ngôn ngữ khác nhau trong các phạm vi từ vựng, cho phép các nhà phát triển biểu đạt các phần khác nhau của một vấn đề phức tạp bằng ngôn ngữ phù hợp nhất cho từng phần.
Dự án bao gồm các ví dụ về mã liên ngôn ngữ thể hiện việc chuyển đổi giữa các cú pháp ngôn ngữ khác nhau trong cùng một chương trình. Một số người dùng đề xuất rằng điều này có thể tiềm năng phục vụ như một cơ chế Giao diện Hàm Ngoại (FFI) được cải thiện, mặc dù những người khác đặt câu hỏi liệu lợi ích có vượt trội hơn chi phí phức tạp hay không.
Một số người bình luận đã đưa ra mối liên hệ với các công trình liên quan, bao gồm ngôn ngữ lập trình Kernel của John Shutt, nghiên cứu của Nada Amin và Tiark Rompf về tháp các trình thông dịch, và ngôn ngữ Shen. Những kết nối này làm nổi bật vị trí của Autology trong một cuộc khám phá rộng lớn hơn về khả năng mở rộng ngôn ngữ và phản ánh trong thiết kế ngôn ngữ lập trình.
Mặc dù có những hạn chế hiện tại như một công cụ thực tế, Autology thể hiện những khả năng sáng tạo xuất hiện khi các ngôn ngữ lập trình được thiết kế với tính linh hoạt cực cao. Như một người bình luận đã lưu ý, thật ấn tượng khi có thể khám phá bao nhiêu ý tưởng chỉ với 1.000 dòng mã Clojure.
Đối với những ai quan tâm đến việc khám phá Autology sâu hơn, dự án có sẵn trực tuyến, với các ví dụ minh họa cách thêm các hàm vào ngôn ngữ, chuyển đổi chiến lược đánh giá, hoặc thậm chí định nghĩa một Lisp metacircular bên trong chương trình.
Tham khảo: Autology