Mojo 1.0 Beta
(mojolang.org)- Mojo là một ngôn ngữ theo đuổi khẩu hiệu “viết như Python, chạy như C++”, hiện cung cấp bản ổn định 1.0.0b1 (May 7)
- Mục tiêu là cho phép viết mã nhanh trên nhiều loại phần cứng, từ CPU đến GPU, mà không bị phụ thuộc vào một nhà cung cấp cụ thể, và được thiết kế như một ngôn ngữ kiểu tĩnh hiệu năng cao cho hệ thống AI hiện đại
- Hỗ trợ khả năng tương tác với Python ở mức native, nên có thể chỉ chuyển các điểm nghẽn hiệu năng sang Mojo mà không cần viết lại toàn bộ mã hiện có; hỗ trợ cả việc import mã Mojo từ Python và import thư viện Python trong mã Mojo
- Có thể viết GPU kernel bằng cùng một ngôn ngữ, đồng thời hướng tới cung cấp tối ưu hóa theo từng phần cứng và trừu tượng hóa không tốn chi phí thông qua metaprogramming ở thời điểm biên dịch dùng cùng ngôn ngữ với mã runtime
- Thư viện chuẩn của Mojo đã được công bố mã nguồn mở hoàn toàn trên GitHub và đang nhận đóng góp; trình biên dịch Mojo có kế hoạch mã nguồn mở vào năm 2026
Phiên bản và tài liệu bắt đầu
- Bản ổn định hiện tại là 1.0.0b1 (May 7), bản nightly mới nhất là May 9
- Mojo lấy cảm hứng từ cú pháp trực quan của Python, tính an toàn bộ nhớ của Rust và metaprogramming mạnh mẽ, trực quan ở thời điểm biên dịch của Zig
- Là một ngôn ngữ kiểu tĩnh được biên dịch, cũng phù hợp cho lập trình theo kiểu agent
- Thay vì buộc phải chọn giữa năng suất và hiệu năng, Mojo hướng tới cung cấp cả hai; có thể bắt đầu bằng các mẫu lập trình đơn giản, quen thuộc và chỉ thêm độ phức tạp khi cần
- Các lối vào để bắt đầu gồm Install Now, Quickstart, Releases, Roadmap, GitHub
- Để xem trang ở dạng Markdown, có thể thêm
.mdvào URL; toàn bộ chỉ mục tài liệu Mojo có thể xem tại llms.txt
GPU và khả năng tương tác với Python
-
Lập trình GPU
- Mojo hướng tới việc giúp tiếp cận lập trình GPU mà không cần thư viện riêng theo từng nhà cung cấp hay mã biên dịch tách biệt
- Có thể viết GPU kernel hiệu năng cao bằng chính ngôn ngữ đang dùng cho CPU
- Kernel ví dụ
vector_addnhậnTileTensorvà thực hiệnresult[i] = a[i] + b[i]dựa trênglobal_idx.xdef vector_add( a: TileTensor[float_dtype, type_of(layout), element_size=1, ...], b: TileTensor[float_dtype, type_of(layout), element_size=1, ...], result: TileTensor[ mut=True, float_dtype, type_of(layout), element_size=1, ... ], ): var i = global_idx.x if i < layout.size(): result[i] = a[i] + b[i]
-
Khả năng tương tác với Python
- Mojo có khả năng tương tác native với Python, nên có thể loại bỏ các điểm nghẽn hiệu năng mà không cần viết lại toàn bộ mã hiện có
- Có thể bắt đầu từ một hàm, rồi mở rộng dần theo cách chuyển các phần mã quan trọng về hiệu năng sang Mojo khi cần
- Mã Mojo có thể được import tự nhiên vào Python và được đóng gói cùng các package để triển khai
- Ngược lại, trong mã Mojo cũng có thể import các thư viện trong hệ sinh thái Python
- Hàm ví dụ
mojo_square_arraylấy con trỏ từctypes.datacủaPythonObject, tính độ rộng SIMD tại thời điểm biên dịch và bình phương các phần tử trong mảng# SIMD-vectorized kernel squaring array elements in place. def mojo_square_array(array_obj: PythonObject) raises: comptime simd_width = simd_width_of[DType.int64]() ptr = array_obj.ctypes.data.unsafe_get_as_pointer[DType.int64]() def pow[width: Int](i: Int) unified {mut ptr}: elem = ptr.load[width=width](i) ptr.store[width=width](i, elem * elem) vectorize[simd_width](len(array_obj), pow)
Metaprogramming ở thời điểm biên dịch
- Metaprogramming của Mojo cung cấp một hệ thống trực quan giúp tối đa hóa hiệu năng bằng cách dùng cùng một ngôn ngữ với mã runtime
- Có thể tạo tối ưu hóa riêng cho từng phần cứng bằng biên dịch có điều kiện, bảo đảm an toàn bộ nhớ bằng đánh giá ở thời điểm biên dịch và loại bỏ các nhánh runtime tốn kém
- Mục tiêu là cung cấp trừu tượng hóa không tốn chi phí trong khi vẫn thể hiện rõ ý đồ
- Ví dụ triển khai
__eq__sử dụng phản chiếu ở thời điểm biên dịch để lấy tên và kiểu của các trường trong struct, kiểm tra mọi trường có thỏa mãnEquatablehay không rồi thực hiện so sánh equality theo từng trường# Generic struct equality using compile-time reflection. @always_inline def __eq__(self, other: Self) -> Bool: comptime r = reflect[Self]() comptime names = r.field_names() comptime types = r.field_types() comptime for i in range(names.size): comptime T = types[i] comptime assert conforms_to(T, Equatable), "All fields must be Equatable" if trait_downcast[Equatable]( r.field_ref[i](self) ) != trait_downcast[Equatable](r.field_ref[i](other)): return False return True
Lộ trình và mã nguồn mở
- Mojo bắt đầu vào cuối năm 2022 và vẫn còn nhiều việc cần làm
-
Phase 0
- Giai đoạn xây dựng nền tảng ban đầu
- Đây là giai đoạn triển khai parser cốt lõi, kiểu bộ nhớ, hàm, struct, initializer, quy ước đối số và các nền tảng ngôn ngữ khác
-
Phase 1
- Giai đoạn hiện đang diễn ra
- Mục tiêu là biến Mojo thành một ngôn ngữ mạnh mẽ, giàu khả năng biểu đạt để viết kernel hiệu năng cao trên CPU, GPU và ASIC, đồng thời giúp lập trình viên mở rộng Python một cách liền mạch
-
Phase 2
- Giai đoạn lập trình ứng dụng hệ thống
- Đây là giai đoạn mở rộng để hỗ trợ mô hình an toàn bộ nhớ được đảm bảo và nhiều khả năng trừu tượng hơn mà các lập trình viên hệ thống mong đợi
-
Phase 3
- Giai đoạn lập trình hướng đối tượng động
- Đây là giai đoạn hỗ trợ thêm nhiều tính năng động của Python như class, kế thừa, biến không kiểu nhằm tối đa hóa khả năng tương thích với mã Python
- Có thể xem chi tiết tại Mojo roadmap
- Thư viện chuẩn của Mojo đã được công bố mã nguồn mở hoàn toàn trên GitHub và đang nhận đóng góp
- Trình biên dịch Mojo có kế hoạch được mã nguồn mở vào năm 2026
- Dù có chủ trương mã nguồn mở toàn bộ Mojo, nhưng do ngôn ngữ vẫn còn rất non trẻ, nhóm cho rằng một nhóm kỹ sư gắn kết, có chung tầm nhìn có thể tiến nhanh hơn mô hình do cộng đồng dẫn dắt
- Kênh tham gia được cung cấp qua developer community
Tài liệu học tập và cộng đồng
- Install và Quickstart guide: tài liệu bắt đầu với Mojo
- Beginner tutorial: học Mojo bằng cách tạo Game of Life
- GPU puzzles: học lập trình GPU với Mojo qua việc giải đố
- Intro to Mojo: giới thiệu tổng quan các tính năng ngôn ngữ của Mojo
- Developer forum: nơi đặt câu hỏi và cập nhật về Mojo
- Events: thông tin về sự kiện, meetup, bài trình bày và hackathon
- Contributions: hướng dẫn về issue mở, đóng góp tài liệu và chia sẻ dự án
1 bình luận
Ý kiến trên Hacker News
Trong 2 năm qua tôi đã dùng Mojo khá nhiều cho vui, và đây thực sự là một ngôn ngữ rất tuyệt
Nó có mô hình ownership gần với Rust, thực thi ở thời điểm biên dịch mạnh hơn Zig, hệ thống kiểu phong phú, và hỗ trợ SIMD hạng nhất
Về mặt hiệu năng, lâu lắm rồi mới thấy một ngôn ngữ trông không chỉ như một lớp bọc LLVM đơn thuần. Nó vẫn dùng LLVM, nhưng tận dụng theo cách khác với Rust hay Zig
Khi được mã nguồn mở vào cuối năm nay, Mojo sẽ rất đáng mong đợi
Chỉ nhìn tài liệu Mojo hiện tại thì khó đi đến kết luận đó
Với tư cách là người làm machine learning và quan tâm đến hiệu năng, tôi hy vọng Mojo sẽ thành công. Đặc biệt, tôi háo hức với khả năng trộn code GPU và code CPU trong cùng một ngôn ngữ
Tuy vậy, tôi lo những thay đổi hiện tại có thể khiến các nhà phát triển Python xa rời nó. Lần gần nhất tôi chạy thử, tôi muốn test thao tác chuỗi cơ bản bằng
var x = 'hello'; print(x[3])nhưng không chạy, vàlen(x)cũng không được nên tôi đã loay hoay cả tiếng đồng hồHóa ra họ quyết định tách rõ hơn giữa biểu diễn byte và code point, nhưng tài liệu lại mâu thuẫn với phần triển khai thực tế
Tôi hy vọng nó sẽ đạt đến mức đủ dùng cho machine learning nói chung, nhưng hiện tại vẫn còn khá hạn chế. Một số tính năng cơ bản ổn cho tensor cũng đã bị bỏ đi
Trước mắt tôi sẽ tiếp tục dùng JAX và thỉnh thoảng kiểm tra lại
Đây chẳng phải kiểu giấc mơ mà những người quan tâm đến compiler và thiết kế ngôn ngữ nên theo đuổi sao
Không cần phải đảm bảo hiệu quả trong mọi tình huống hay đạt hiệu năng tối tân, chỉ cần nó tồn tại là cũng tốt rồi
Tôi hiểu là có thể làm ra ngôn ngữ như vậy, nhưng có vẻ chưa đủ hấp dẫn với những người có khả năng làm nó
Gần như mọi nhược điểm tôi nghĩ tới ở Kotlin đều xuất phát từ tính tương thích với Java. Ở đây có lẽ vẫn có thể giải quyết tốt hơn bằng cách tường minh hơn, nhưng hướng hiện tại có vẻ như thất bại là điều khó tránh
Có ghi rằng “họ đã hứa sẽ mã nguồn mở Mojo vào mùa thu năm 2026”
https://docs.modular.com/mojo/faq/#will-mojo-be-open-sourced
Đáng tiếc là trong thời gian đó Nvidia cũng không đứng yên, và đã tạo ra thế hệ CUDA tiếp theo là CuTile cho Python, sắp tới là cho C++, thông qua một stack compiler tương tự dựa trên MLIR
Dù không có tính di động, chỉ riêng việc Nvidia hậu thuẫn mạnh, tích hợp vào công cụ phát triển, và chạy cùng code CUDA hiện có cũng khiến nó có khả năng được dùng nhiều hơn Mojo rất nhiều
Có lẽ Tile IR gần với phản ứng trước mối đe dọa từ Triton hơn là từ Mojo. Tôi đặc biệt nghĩ vậy nếu xét theo góc độ viết kernel LLM có hiệu năng khá tốt dễ đến mức nào
Cũng có những nỗ lực như GraalPy và PyPy
Tất cả các nỗ lực này đều đang chạy trên Windows, điều này khá quan trọng trong môi trường công ty nơi phần lớn nhân viên được cấp máy Windows còn chỉ server mới dùng các bản phân phối Linux
Điều đó cứ khiến tôi nghĩ liệu đây có lại là một cái kết kiểu Swift for Tensorflow nữa không
Ngoài phản hồi từ khách hàng, tôi không nghe ai nói đây là phản ứng trước điều gì khác
Nhưng liệu CuTile có chạy được trên GPU AMD hay Apple Silicon không? Nvidia làm gì đi nữa thì sự phụ thuộc vào nhà cung cấp vẫn còn nguyên
Khi mới nghe về Mojo, tôi nghĩ nó được làm để tương thích với code Python hiện có
Nhưng trong tương lai gần, mục tiêu đó có vẻ rất xa vời. Bạn có thể gọi qua lại giữa Python và Mojo, nhưng bản thân Mojo không thể chạy code Python hiện có
Nhưng có vẻ trong quá trình phát triển, hướng đi đã thay đổi
Nó giống một kế hoạch crypto kiểu pump-and-dump hơn là một nỗ lực chân thành nhằm cải thiện hệ sinh thái Python
Nó lấy bài học từ Swift và Rust, nhắm đến các mục tiêu CPU/GPU/dị thể, và lấy MLIR làm trung tâm
Đồng thời, cấu trúc cũng được định hình để sau này có thể nhúng hoặc mở rộng Python tương đối dễ, và cách đóng khung theo Python gần như chắc chắn đã giúp ích cho việc gọi vốn
Chris Lattner đã nói về mối quan hệ giữa MLIR và Mojo nhiều hơn là giữa Python và Mojo
Điều đó cộng với mô hình phát triển chưa hoàn toàn mã nguồn mở khiến nó lúc nào cũng mang cảm giác như vaporware
Tính tương tác với Python: “Mojo tương tác gốc với Python, nên bạn có thể loại bỏ các nút thắt hiệu năng trong code hiện có mà không cần viết lại mọi thứ. Bạn có thể bắt đầu từ một hàm và mở rộng dần bằng cách chuyển phần code quan trọng về hiệu năng sang Mojo khi cần. Code Mojo có thể được import tự nhiên vào Python và đóng gói cùng nhau để triển khai. Tương tự, thư viện trong hệ sinh thái Python cũng có thể được import vào code Mojo”
Mojo có vẻ ổn, nhưng với tính toán số hiệu năng cao trên cả CPU lẫn GPU thì hiện tại tôi khá hài lòng với Julia
Ngoài việc dùng cú pháp giống Python, có cảm giác ngách này phần lớn đã được giải quyết. Ngay cả Python cũng có những công cụ như Numba và Triton, hiệu quả cho các loại bài toán ít phức tạp hơn và độc lập hơn
Nếu cùng mục tiêu thì Julia đã trưởng thành hơn, và từ năm ngoái Nvidia cũng đang đưa công cụ Python và công cụ C++ trên CUDA về mức ngang nhau về tính năng
Với trình biên dịch JIT cuTile cho Python, bạn có thể viết kernel CUDA gần như bằng Python thuần
AMD và Intel cũng đang theo đuổi cách tiếp cận tương tự
Còn việc Mojo có đến kịp để giành được mức chấp nhận rộng hơn hay không thì vẫn phải chờ xem
Những phương ngữ Python “thân thiện với hiệu năng” này, tức Triton, Pythran, CuTile, Numba, Pycell, cuPy v.v., bề ngoài trông như Python nhưng chỉ cần cào nhẹ lớp vỏ là thấy hoàn toàn không phải Python
Chúng là các DSL kiểu Python được thiết kế để tối ưu hóa và suy luận kiểu hoạt động tốt
Khi dùng thực tế sẽ cảm nhận rất rõ điều đó. Trong từng cái, nhiều, có lẽ là phần lớn tính năng Python, không thể dùng được, nhưng vẫn phải gánh các vấn đề cố hữu của Python
Thành thật mà nói, Python vốn dĩ không phù hợp với hiệu quả và hiệu năng
Đây là vấn đề vượt xa GIL. Kiểu động, ngữ nghĩa tham chiếu, monkey patching, mô hình đối tượng cực kỳ động, CPython ABI, BigInt mặc định, hệ thống module thời gian chạy... đều hợp lý cho một ngôn ngữ scripting nhỏ, nhưng rất tệ cho tính toán hiệu năng cao và hiệu suất
Bản thân hệ sinh thái NumPy/SciPy cũng gần như là một tập hợp các cách lách để né tránh giới hạn của Python cho bài toán số tensor CPU-bound đơn giản
Hiệu năng Python gốc quá tệ đến mức chỉ một vòng lặp for đơn giản cũng đủ khiến Excel trông như ngựa đua
Mojo thì khác
Thay vì chắp vá trên một nền tảng cũ đầy vấn đề, Mojo cố gắng bắt đầu từ một điểm xuất phát sạch sẽ
Và thay vì dựa trên Python hơn 30 năm tuổi, nó muốn mang lại “trải nghiệm giống Python” bằng một ngôn ngữ được thiết kế bài bản trên nền kinh nghiệm thiết kế ngôn ngữ hiện đại
Chỉ riêng vì lý do đó thôi tôi cũng hy vọng nó thành công
Dạo này có vẻ ít nhất với một bộ phận người dùng, quảng cáo nhấn mạnh AI native là điều cần thiết
Nhưng với tôi thì nó hơi gây phản cảm. Vì trông như một cụm từ thực ra chẳng nói lên điều gì
Liệu những người hào hứng với AI có thể giải thích vì sao câu “vì là ngôn ngữ được biên dịch và có kiểu tĩnh nên cũng lý tưởng cho lập trình tác tử” lại như vậy, và thực sự nó có nghĩa gì không
Cá nhân tôi thấy buồn cười nhất là lúc mở trang sản phẩm IBM DB2 lên và thấy dòng AI database
Có lẽ ý là nếu bắt được nhiều lỗi hơn ở thời điểm biên dịch, tác tử có thể nhanh chóng tự kiểm tra công việc của mình theo cách tĩnh mà không cần unit test hay các bài test khác
Đặc biệt các ngôn ngữ như Python có rất nhiều mã nguồn mở sẵn dùng sẽ có lợi thế. Đây là vấn đề lớn với người mới khi không có code hiện có để học theo
Vì thế để trông có vẻ liên quan trong thế giới “tác tử”, có thể họ cần kiểu marketing AI native đầy tuyệt vọng này. Có đủ hay không thì thời gian sẽ trả lời
Tác tử có xu hướng làm tốt hơn khi nhận được nhiều phản hồi hơn. Kiểm tra kiểu rất hữu ích để tự động bắt khá nhiều lỗi ngớ ngẩn
Ý chính là, tác tử có càng nhiều gợi ý thì nhìn chung càng tốt
Còn về biên dịch và kiểu tĩnh, khi lập trình theo kiểu tác tử thì việc phát hiện vấn đề ở thời điểm biên dịch rất có ích
Nhờ đó sẽ ít gặp vấn đề hơn ở runtime, và cũng giảm các tình huống mà tác tử khó giải quyết. Unit test có thể lấp một phần khoảng trống, nhưng không hoàn toàn
Điều website không nói là Mojo thậm chí có thể là lựa chọn tệ cho lập trình tác tử. Vì hiện tại chưa có nhiều dữ liệu huấn luyện cho Mojo
Python+ruff+pycheck và TypeScript được biên dịch thành bytecode chứ không phải mã máy. Chúng cũng không phải kiểu tĩnh theo nghĩa của Rust
Thế mà tôi vẫn thấy mô hình tạo ra code hợp lệ khá tốt cho cả hai. Không nhất thiết phải “biên dịch” nghiêm ngặt hay “kiểu tĩnh”
Cuối cùng, AI không quá quan tâm đến các thuộc tính đó miễn là có công cụ tốt để kiểm tra code nhanh và lặp lại
Modular dự kiến sẽ mã nguồn mở toàn bộ Mojo SDK, bao gồm cả compiler, vào cuối năm nay
Có ghi rằng “Mojo 1.0 sẽ được chốt vào cuối năm nay, cùng với việc công bố compiler và đảm bảo tính ổn định của ngôn ngữ”
https://www.modular.com/blog/modular-26-3-mojo-1-0-beta-max-...
Tôi vẫn đang theo dõi Mojo. Thành thật mà nói, thứ tôi không thích nhất ở Python là cú pháp
Có người ở đây nhắc đến Julia, và tôi nghĩ đó là một ngôn ngữ tốt. Nhưng thông báo lỗi từ compiler và tài liệu thư viện vẫn chưa đạt mức tôi kỳ vọng ở một ngôn ngữ trưởng thành đến vậy
Tôi cũng lo về vấn đề độ chính xác trong các bài blog từng đọc. Ngoài ra, vì kích thước binary và thời gian chạy lần đầu, tôi không nghĩ có thể làm module Python theo kiểu mình muốn bằng Julia
Dù vậy, tôi vẫn hy vọng Mojo trở thành một lựa chọn. Nhưng tôi thích REPL và cũng thích tính động của Python, nên có thể cuối cùng tôi vẫn sẽ không rời khỏi NumPy chỉ vì hiệu năng
Vì vậy tôi thực sự rất thích Nim. Có được tốc độ cấp C, thực thi thời điểm biên dịch, metaprogramming, hệ thống kiểu mạnh, an toàn bộ nhớ, mà code vẫn thường ngắn gọn và thanh lịch
Mojo cũng thú vị, nhưng đến nay có vẻ tập trung chủ yếu vào machine learning hơn là lập trình mục đích chung. Và theo tôi biết compiler vẫn chưa mã nguồn mở
Có vẻ Mojo cũng tập trung hơn vào việc trở thành một ngôn ngữ đủ vững cho môi trường công nghiệp. Tôi từng bị sốc khi thấy bản triển khai precompile đầu tiên của Julia không cung cấp I/O file