Ra mắt phiên bản alpha của Jank Lang
(github.com/jank-lang)- Là ngôn ngữ lập trình kết hợp cú pháp Clojure và hiệu năng native dựa trên LLVM, đồng thời cung cấp khả năng tương tác liền mạch với C++
- Giữ nguyên đặc tính hàm và hướng giá trị của Clojure, nhưng dùng LLVM làm môi trường host thay vì JVM
- Mọi cấu trúc dữ liệu đều là bất biến (persistent & immutable) và có thể liên kết trực tiếp với thư viện chuẩn C++
- Hiện đang ở giai đoạn alpha, tài liệu chính thức và ví dụ có tại jank book
- Đây là nỗ lực kết hợp hệ sinh thái Clojure với hiệu năng native của C++, mang ý nghĩa thu hẹp ranh giới giữa ngôn ngữ hàm và ngôn ngữ hệ thống
Tổng quan về jank
- jank là một ngôn ngữ được host trên LLVM dựa trên cú pháp và triết lý của Clojure
- Dựa trên LLVM thay vì JVM và hỗ trợ khả năng tương tác (interoperability) với C++
- Giữ nguyên các đặc tính hàm, tương tác và lấy giá trị làm trung tâm của Clojure
- Hướng tới mức độ tương thích cao với Clojure; tương tự cách Clojure tương tác với Java, jank tích hợp với C++
- Hiện đang được phát triển dưới dạng phiên bản alpha; có thể xem chi tiết tại tài liệu chính thức
Đặc điểm ngôn ngữ
- Mọi cấu trúc dữ liệu tích hợp sẵn đều ở dạng bất biến (persistent & immutable)
- Ví dụ:
(def george {:name "George Clooney"})
- Ví dụ:
- Có thể thực hiện side effect một cách tường minh khi cần
- Ví dụ:
(defn say-hi [who] (println (str "Hi " (:name who) "!")) (assoc who :greeted? true))
- Ví dụ:
- Có thể liên kết trực tiếp với thư viện chuẩn C++
- Ví dụ:
(cpp/std.this_thread.sleep_for (cpp/std.chrono.milliseconds ms))
- Ví dụ:
- Cung cấp nhiều hàm core cho xử lý dữ liệu theo phong cách hàm
- Ví dụ:
(apply + (distinct [12 8 12 16 8 6])) ; => 42
- Ví dụ:
Phát triển và tài liệu
- Tài liệu chính thức: jank book
- Dự án dựa trên LLVM 22 và tương thích với chuẩn C++ mới nhất
- Hỗ trợ biên dịch AOT, GC profiling, tùy chọn build CMake
- Bao gồm cấu hình môi trường Nix và build tự động CI
Cộng đồng và tài trợ
- Có thể tài trợ cho dự án qua GitHub Sponsors
- Các doanh nghiệp và cá nhân tài trợ gồm: Clojure Together, nubank, multiply.co, modulr-software...
- Kênh cộng đồng: Slack (Clojurians), Twitter
Bài nói và giới thiệu liên quan
- Video trình bày tại Clojure Conj 2023
- Giới thiệu ngôn ngữ trên The REPL Interview và Compiler Spotlight
- Có video YouTube: Language Introduction
Tóm tắt:
jank là ngôn ngữ mang triết lý hàm của Clojure sang môi trường LLVM và C++ native, nhằm kết hợp năng suất của Clojure với hiệu năng của C++. Dù hiện vẫn ở giai đoạn alpha, dự án mang đến một trải nghiệm phát triển hợp nhất mới cho cả lập trình viên Clojure lẫn lập trình viên hệ thống.
1 bình luận
Ý kiến trên Hacker News
Về bản alpha của jank, mong mọi người tham khảo cuốn sách chính thức
Dù vẫn chưa hoàn toàn sẵn sàng để công bố đầy đủ, tôi rất vui khi thấy mọi người quan tâm
Chỉ cần gộp thêm vài tính năng của compiler nữa là sẽ đủ sẵn sàng để mọi người có thể theo sách và tự dùng thử jank
Tôi thấy có vài lỗi ngữ pháp, nên muốn hỏi liệu tôi có thể gửi PR vào phần
bookhay không, hay là nên góp ý theo cách khác để giữ nguyên văn phong của tác giảjank là một phương ngữ của Clojure, mà bản thân Clojure cũng là một phương ngữ của Lisp
Nó thiên về lập trình hàm nhưng cũng hỗ trợ trạng thái có thể thay đổi và side effect
Mọi cấu trúc dữ liệu đều mặc định là bất biến, và giống Clojure, nó cung cấp cơ chế thay đổi an toàn để xử lý đồng thời dễ dàng hơn
Ngoài ra còn có khả năng tích hợp sâu với C++, cho phép định nghĩa kiểu, hàm và template C++ mới ngay trong runtime
Nhờ biên dịch JIT bằng Clang và LLVM, có thể truy cập thư viện C/C++ một cách dễ dàng
Xem thêm trong sách chính thức
Tôi thích Clojure, nhưng việc có native target là một điểm rất hấp dẫn
Tôi tò mò không biết tốc độ compile/recompile của jank hiện ra sao
Tôi tò mò không biết quá trình phát triển của jank sẽ bám sát Clojure đến mức nào
Có định giữ giống tối đa như cljs không, hay rồi sẽ phân nhánh vào một lúc nào đó
Trước đây tôi từng làm một ngôn ngữ giống Clojure khoảng 90%, nhưng khó đảm bảo tương thích hoàn toàn nên không dám đặt tên như vậy
jank trông như một drop-in replacement, khá ấn tượng
Chúng tôi đang hợp tác với đội ngũ Clojure và các nhà phát triển phương ngữ khác, và đang dẫn dắt cross-dialect clojure-test-suite để phục vụ mục tiêu đó
Hiện đã hỗ trợ hoặc đang làm việc với Clojure JVM, ClojureScript, Clojure CLR, babashka, Basilisp và jank
Tuy vậy, sau này cũng sẽ bổ sung chế độ tùy chọn lấy cảm hứng từ Carp, nhưng vẫn giữ tương thích mặc định
Thoáng qua tôi còn tưởng đây không phải jank mà là nói về Jack Lang (chính trị gia Pháp)
Cuốn sách nên xem cùng: https://book.jank-lang.org/
Tôi đã theo dõi blog của jank suốt một năm, xin chúc mừng bản phát hành alpha
Là người dùng Emacs, tôi muốn hỏi hiện trạng hỗ trợ công cụ phát triển như CIDER ra sao
Ngoài ra tôi thấy có lỗi chính tả ở liên kết trong phần Welcome — cần sửa “foreward” thành “foreword”
Có thể xem tại try-jank
Tiến độ đang bị chậm do lỗi của Clang, nhưng đây là hạng mục ưu tiên cao
Lỗi chính tả ở liên kết đã được sửa rồi
Tôi tò mò liệu jank có thể tích hợp với codebase Rust hay không
Có thể kết nối qua C ABI hoặc cơ chế tương tác C++/Rust
Tôi muốn biết liệu có bao gồm hệ thống kiểu tĩnh hay không
Tuy nhiên, tác giả có nhắc đến kế hoạch bổ sung gradual type system¹
Tầm nhìn là để một phần hoạt động hoàn toàn động và dựa trên GC, còn một phần khác sẽ được kiểm soát và tối ưu tốt hơn
¹ Bài blog liên quan
Phần interop với C++ thì được định kiểu tĩnh, nhưng khi quay lại vùng Clojure thì hoàn toàn động và đa hình
Sau này sẽ khám phá chế độ kiểu tĩnh tùy chọn như Carp, nhưng không phải trong năm nay
Ban đầu tôi còn tưởng đây là chuyện một người tên “Jank Lang” tìm ra alpha đầu tư