- Trong bối cảnh WebAssembly ngày càng quan trọng trong điện toán đám mây và điện toán biên, Moonbit hướng tới trở thành một ngôn ngữ ưu tiên Wasm giúp khai thác dễ dàng hơn tính hiệu quả, bảo mật và kích thước nhỏ của Wasm
- Moonbit nhắm vào các hạn chế: Rust và C/C++ có độ khó học cao và thời gian biên dịch dài, còn Go tạo ra mã lớn và kém hiệu quả
- Trọng tâm thiết kế là build và chạy nhanh, đầu ra Wasm nhỏ, dễ sử dụng; bao gồm tối ưu hóa nhiều biểu diễn trung gian, phân tích ngữ nghĩa song song theo đơn vị hàm và phân tích lại tăng dần
- Trong ví dụ Fibonacci, Moonbit nhấn mạnh suy luận kiểu cho hàm cục bộ, đầu ra Wasm nhỏ nhất, hiệu năng nhanh hơn Go và tương đương Rust, hỗ trợ closure đệ quy và exhaustive pattern match
- Hiện cung cấp IDE trực tuyến, công cụ CLI, tài liệu và tiện ích mở rộng VSCode; mục tiêu đạt beta status vào cuối quý 2 năm 2024 và công khai mã nguồn sau khi đạt chất lượng beta
Mục tiêu ngôn ngữ ưu tiên WebAssembly
- WebAssembly là một kiến trúc tập lệnh đa nền tảng; nhờ các đặc tính hiệu quả, bảo mật, kích thước nhỏ và là tiêu chuẩn mở, tầm quan trọng của nó đang tăng lên trong điện toán đám mây và điện toán biên
- Nhóm cho rằng các lựa chọn hiện có chưa khai thác đầy đủ tiềm năng của Wasm
- Các ngôn ngữ Wasm cấp thấp như Rust và C/C++ khó học, và thời gian biên dịch dài có thể làm chậm tốc độ phát triển
- Các ngôn ngữ cấp cao như Go bị cho là tạo mã kém hiệu quả và lớn, khiến khó tận dụng lợi thế về tốc độ và kích thước nhỏ của Wasm
- Moonbit hướng tới một ngôn ngữ ưu tiên Wasm, build và chạy nhanh, tạo đầu ra Wasm nhỏ, đồng thời dễ học như Go
Thiết kế ngôn ngữ và đội ngũ
- Moonbit được dẫn dắt bởi Hongbo Zhang cùng một đội ngũ có hơn 10 năm kinh nghiệm thiết kế và phát triển ngôn ngữ
- Zhang từng đóng góp cho OCaml, ReScript, Flow, và từng là chief architect cho trình biên dịch nhanh, thư viện chuẩn và hệ thống build của toolchain ReScript
- Thiết kế ngôn ngữ chịu ảnh hưởng đồng thời từ Go và Rust
- Tiếp nhận sự đơn giản của Go, đặc biệt là hệ thống package
- Bao gồm tính biểu đạt của Rust, pattern matching, type inference, generics và ad-hoc polymorphism tương tự trait
- Hệ thống kiểu fault tolerant được thiết kế với tốc độ, khả năng song song hóa và kiểm tra tăng dần làm trọng tâm, đồng thời đặt hỗ trợ IDE là mục tiêu cốt lõi
Build và chạy nhanh
- Moonbit hướng tới trở thành ngôn ngữ nhanh trên toàn bộ stack, bao gồm cả hiệu năng phát triển lẫn hiệu năng runtime
- Sử dụng biểu diễn trung gian (IR) đa cấp để tối ưu hóa toàn chương trình
- Đi theo hướng cải thiện bố cục bộ nhớ để giảm cache miss
- Cung cấp ngữ cảnh tốt hơn cho phân tích luồng dữ liệu và luồng điều khiển
- Nhóm cho rằng cách này hiểu cấu trúc chương trình toàn diện hơn hầu hết các kiến trúc link-time optimization hiện có, từ đó cho phép tối ưu hóa hiệu quả
- Có thể tìm và loại bỏ các phần dư thừa ở mức cao mà không nhìn thấy ở mức thấp
- Cho phép phân tích ngữ nghĩa song song theo đơn vị hàm nhằm đạt hiệu năng build nhanh, vốn quan trọng với các tính năng IDE
- Khác với ReScript và Rust, Moonbit cho phép function-level parallel semantic analysis
- Có thể thực hiện phân tích lại tăng dần ở cùng độ chi tiết này để xử lý monorepo quy mô lớn và cung cấp thời gian phản hồi tính bằng mili giây
Đầu ra Wasm nhỏ
- Moonbit được thiết kế với mục tiêu hỗ trợ dead code elimination hiệu quả
- Loại bỏ các tính năng ngôn ngữ cản trở phân tích này, đồng thời tổ chức thư viện chuẩn theo cấu trúc dễ loại bỏ mã chết
- Thông qua tối ưu hóa toàn chương trình, Moonbit cố gắng giảm đáng kể kích thước mã cuối cùng
- Việc giảm kích thước mã được cho là dẫn tới cải thiện bảo mật và giảm lỗ hổng bị tấn công
- Nhóm cho rằng điều này bảo đảm khởi động nhanh trong môi trường điện toán serverless
Tính năng và công cụ để dễ sử dụng
- Moonbit cung cấp quản lý bộ nhớ tự động, tạo khác biệt so với Rust
- Khác với Go, Moonbit cho biết sẽ tránh các yếu tố nguy hiểm như con trỏ hoặc left value
- Cung cấp các tính năng an toàn cho lập trình hướng dữ liệu
- algebraic data types
- ad-hoc polymorphisms
- pattern match
- Ngoài ngôn ngữ, Moonbit cũng hướng tới vai trò như một nền tảng, và ngay từ giai đoạn đầu đã cung cấp bộ công cụ
- Công cụ build tốc độ cao
- Trình quản lý package
- Trình biên dịch
- IDE
- Cloud IDE không cần container, có thể truy cập ở mọi nơi chỉ bằng trình duyệt
- Cloud IDE này cũng cung cấp chức năng offline và được cho là khác biệt với các Cloud IDE hiện có
Khác biệt qua ví dụ Fibonacci
- Ví dụ Fibonacci so sánh việc triển khai hàm
fibbằng ba ngôn ngữ MoonBit, Go và Rust - Theo benchmark, MoonBit thể hiện khác biệt về suy luận kiểu, kích thước mã, hiệu năng và tính dễ dùng
- Suy luận kiểu cục bộ: MoonBit suy luận kiểu của hàm cục bộ
aux - Kích thước Wasm nhỏ: MoonBit tạo ra đầu ra Wasm nhỏ nhất
- Hiệu năng: nhanh hơn Go và tương đương Rust
- Tính dễ dùng: hỗ trợ closure đệ quy như Go, trong khi điều này được cho là rất khó triển khai trong Rust
- Hỗ trợ exhaustive pattern match như Rust, và được cho là mạnh hơn nhiều so với switch case của Go
- Suy luận kiểu cục bộ: MoonBit suy luận kiểu của hàm cục bộ
Trạng thái hiện tại và lộ trình
- Moonbit là một mục tiêu thay đổi nhanh, nhưng hiện đã cung cấp các điểm vào có thể sử dụng
- Việc phát triển toolchain ngôn ngữ trước đây từng mất từ vài năm đến 10 năm, nhưng nhóm cho biết họ đã đơn giản hóa quá trình phát triển nhờ kinh nghiệm tích lũy và đội ngũ chuyên trách được xây dựng từ đầu
- Dự kiến đạt beta status vào cuối quý 2 năm 2024
- beta status có nghĩa là mức độ ổn định tương đối, ít lỗi và FFI vững chắc để tương tác với Wasm host
- Mã nguồn dự kiến sẽ được công khai sau khi đạt chất lượng beta
- Kế hoạch chiến lược bao gồm tích hợp Wasm GC cho Wasm 2.0 và GC riêng cho Wasm 1.0, đồng thời bám theo các Wasm proposals
Kênh cộng đồng
- Có thể đặt câu hỏi trên forum
- Có thể tham gia Discord hoặc theo dõi Twitter account
1 bình luận
Ý kiến trên Hacker News
Tôi là trưởng dự án này. Hiện có thể dùng thử ngay trên IDE trực tuyến https://try.moonbitlang.com, và có thể chạy bằng phím F5
Tài liệu nằm tại https://github.com/moonbitlang/moonbit-docs, còn trình biên dịch dự kiến sẽ được công khai khi đạt trạng thái beta. Thời điểm dự kiến là cuối quý 2 năm 2024
Ví dụ, tôi muốn xem có ký hiệu phương sai tường minh cho tham số kiểu, ràng buộc cận dưới/cận trên, kiểu bậc cao (higher-kinded types), liệu trọng tâm là kiểu con cấu trúc hay danh nghĩa, và có kiểu dữ liệu đại số cùng kiểu dữ liệu đại số tổng quát hay không
Tham khảo: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
fnriêng hay không. Tôi không rõ khác biệt căn bản giữafuncvàfnlà gìfuncvàfnkhông, và mũi tên->biểu thị giá trị trả về trong chữ ký hàm có thật sự cần thiết khôngCú pháp kiểu mới là
struct User, nhưng trong trường hợp này tôi nghĩtype User structnhư Go sẽ tốt hơn. Khi đó cũng có thể tạo kiểu hàm cho biếnfn, chẳng hạntype AssignUser func(name: String, id: Int) -> IntTôi cũng thắc mắc liệu dấu
:có giúp gì cho lexer hay parser không. Tôi muốn hỏi liệu trong chữ ký hàm có thể viếtfunc(name String)thay vìfunc(name: String)hay không, và khai báo kiểu có thể làmut elems List[int]thay vìmut elems: List[Int]hay không. Chỉ là bắt bẻ nhỏ nhặt, nhưng nhìn chung tôi thíchTrang web so sánh với Rust và Go, nhưng với tôi, so sánh với AssemblyScript có vẻ phù hợp hơn. AssemblyScript cũng native với WASM, và hệ sinh thái còn nhỏ cũng tương tự
Tuy nhiên, khác với Moonbit, đây là ngôn ngữ quen thuộc với những người từng dùng TypeScript, nên tôi tò mò vì sao nên dùng Moonbit thay vì AssemblyScript
AssemblyScript không có pattern matching và chủ yếu được cấu thành từ câu lệnh (statement). Moonbit có kiểu dữ liệu đại số, còn AssemblyScript có thứ như vậy hay không thì tôi không rõ. Cũng có thể còn nhiều khác biệt về runtime, nhưng chỉ nhìn website thì khó phán đoán
Dùng từ khóa
funccho định nghĩa hàm cấp cao nhất vàfncho định nghĩa hàm lồng nhau là không hay. Nên thống nhất vào một trong hai, bất kể ngữ cảnh cụ thểViệc đó có thật sự cần thiết hay là thiết kế tốt hay không lại là chuyện khác, nhưng có nhiều tiền lệ
fncho phép bỏ qua tên và kiểu, và từ khóa ngắn cho thấy định nghĩa hàm cũng có thể ngắn hơnTôi kỳ vọng vì đã xuất hiện một ngôn ngữ hiện đại có garbage collection nhắm tới WASM. Đối tượng so sánh gần nhất có lẽ là Grain: https://grain-lang.org/
“Việc phát triển toàn bộ toolchain của một ngôn ngữ trước đây thường mất từ vài năm đến cả 10 năm, nhưng nhờ kinh nghiệm tích lũy và một đội ngũ chuyên trách xuất sắc được xây dựng ngay từ giai đoạn đầu của Moonbit, quá trình này đã được đơn giản hóa. Moonbit dự kiến sẽ đạt trạng thái beta vào cuối quý 2 năm 2024; điều này nghĩa là một giai đoạn tương đối ổn định, ít lỗi và có FFI vững chắc để tương tác với host Wasm. Khi đạt chất lượng beta, chúng tôi sẽ công khai mã nguồn. Về mặt chiến lược, theo các đề xuất Wasm, chúng tôi dự định tích hợp Wasm GC cho Wasm 2.0 và GC riêng cho Wasm 1.0”, nội dung viết như vậy
Vì thế hiện tại https://github.com/moonbitlang/ đang trống
Cũng có thể dùng thử IDE trực tuyến: https://try.moonbitlang.com
Nhìn các bình luận ở đây thì có vẻ Moonbit có garbage collection. Nhưng nếu binary kết quả Fibonacci chỉ 253 byte thì có lẽ GC không được đưa vào
Tôi tò mò không biết họ dùng WASM native GC đang được đề xuất, hay hệ thống build đủ thông minh để nhận ra ở đây không cần GC nên loại bỏ nó
Trong output của ví dụ Fibonacci chỉ thấy import
print_i32, định nghĩa memory và function, cùng export_start; không giống dạng có runtime GC được gắn kèmLàm tôi nhớ đến Grain. Đây cũng là một ngôn ngữ lập trình ưu tiên Wasm, nên có lẽ nên thêm Grain vào phần so sánh
https://grain-lang.org/
Liên kết About Team dẫn tới một trang edu.cn tiếng Trung. Trông giống dự án đại học, nhưng tôi không chắc. Trang Join Us cũng bằng tiếng Trung, còn ví dụ trên trang chủ có vẻ cần JavaScript từ baidu.com
Trong Go, người ta không triển khai Fibonacci như vậy
Có vẻ ném vào vài con số dễ hơn so với việc so sánh các cách triển khai idiomatic và bàn kỹ về trade-off. Dù chỉ là teaser đơn giản cho ngôn ngữ, để tránh gây hiểu nhầm thì nên thêm chú thích về TCO
switch, thứ có thể chậm trong GoDù vậy, với vai trò teaser giới thiệu Moonbit thì cũng ổn
Tôi tò mò liệu dự án này có liên quan đến Meta hay không. Người tạo ra nó, Hongbo Zhang, từng làm các dự án ngôn ngữ lập trình mã nguồn mở như ReasonML và Flow tại Meta, và theo LinkedIn thì hiện vẫn đang làm ở Meta