Một ngôn ngữ được thiết kế quanh người đọc của nó
Hầu hết các ngôn ngữ lập trình được thiết kế cho con người. Ngữ pháp của chúng tối ưu cho những gì con người quan tâm: cú pháp ngắn gọn, thành ngữ giàu biểu cảm, các lối tắt "thanh lịch". Trình biên dịch in thông báo lỗi bằng văn xuôi vì người đọc là con người. Thư viện chuẩn được sắp xếp theo cách mà tác giả thư viện thấy dễ nhớ.
Zero bắt đầu từ một tiền đề khác. Người đọc chính của nó là agent AI: các mô hình ngôn ngữ viết, gỡ lỗi và sửa code thay cho ai đó. Con người vẫn tham gia vào quy trình, nhưng thiết kế ngôn ngữ coi agent là người dùng hạng nhất ngay từ ngày đầu. Chỉ một thay đổi đó đã lan tỏa đến gần như mọi tính năng dễ thấy của ngôn ngữ.
Zero được Vercel Labs xây dựng, có trang chủ tại zerolang.ai và mã nguồn mở tại github.com/vercel-labs/zero. Tệp mã nguồn có đuôi .0.
Năm thứ trong đoạn code trên, pub, World, raises, check và lời gọi tường minh world.out.write, đã cho bạn biết khá nhiều về cách Zero tư duy. Chúng ta sẽ lần lượt phân tích từng thứ bên dưới.
"Mọi thứ đều tường minh"
Khẩu hiệu không chính thức trong tài liệu của Zero là mọi thứ đều tường minh. Ngôn ngữ cố ý tránh loại cơ chế ẩn khiến các ngôn ngữ hệ thống khác tiện lợi cho con người nhưng lại nguy hiểm cho các công cụ sinh code:
- Không bắt buộc có bộ thu gom rác (garbage collector).
- Không có bộ cấp phát bộ nhớ ẩn.
- Không có runtime async ngầm.
- Không có biến toàn cục ma thuật: không có
stdoutcó sẵn ở khắp nơi, không cóprocess.env, không có hệ thống tệp ngầm.
Bất cứ việc gì một hàm làm mà chạm tới thế giới bên ngoài đều phải xuất hiện trong chữ ký của nó. Với con người, điều đó nghĩa là gõ nhiều hơn; với một agent đang suy luận xem một hàm thực sự làm gì, đó là một món quà.
Capability thay vì biến toàn cục
Cách Zero xử lý I/O là ví dụ rõ nhất cho triết lý này. Không có hàm print toàn cục nào. Việc xuất dữ liệu diễn ra qua một giá trị World mà runtime trao cho main:
pub fun main(world: World) -> Void raises {
check world.out.write("hello\n")
}
Nếu một hàm nằm sâu trong ngăn xếp lời gọi muốn ghi một dòng log, nó phải được truyền một World (hoặc một capability hẹp hơn) một cách tường minh. Bạn có thể đọc chữ ký của một hàm và biết, không cần đọc thân hàm, liệu nó có thể đụng tới mạng, hệ thống tệp hay stdout hay không. Đó là loại đặc tính mà một công cụ phân tích tĩnh (hoặc một agent đang review code) có thể dựa vào.
Bài Capability World đi sâu hơn vào ý tưởng này.
Thất bại tường minh với raises và check
Hàm có thể thất bại phải khai báo điều đó. Nơi gọi hàm có thể thất bại phải xác nhận điều đó. Không có lỗi nào bị ném ngầm:
raises { InvalidInput } trên validate nghĩa là "hàm này có thể thất bại với InvalidInput". check tại nơi gọi nghĩa là "nếu lời gọi này thất bại, hãy truyền lỗi lên trên". Bạn không thể vô tình bỏ qua một lỗi: lỗi đó phải xuất hiện trong chữ ký hàm, nếu không trình biên dịch sẽ chặn bạn lại. Xem Raises và check để biết đầy đủ.
Một trình biên dịch biết nói chuyện với agent
Điểm đặc biệt nhất của Zero không phải là một tính năng cú pháp mà là đầu ra của trình biên dịch. Chạy zero check --json trên một chương trình bị lỗi và bạn nhận về thứ gì đó như sau:
{
"ok": false,
"diagnostics": [
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
]
}
Ba điều khiến nó khác với một lỗi biên dịch thông thường:
- Mã lỗi ổn định.
NAM003hôm nay nghĩa là "unknown identifier" (định danh không xác định) và sẽ mang đúng nghĩa đó ở phiên bản trình biên dịch tiếp theo. Agent có thể so khớp theo mã lỗi mà không cần phân tích câu chữ tiếng Anh. - Siêu dữ liệu sửa lỗi có cấu trúc. Trường
repairnêu tên loại cách sửa mà trình biên dịch cho rằng sẽ khắc phục được lỗi. Agent có thể lấy kế hoạch sửa bằngzero fix --plan --jsonrồi áp dụng nó. - Không cần phân tích văn bản. Mục đích chính là agent không phải diễn giải một thông báo viết cho con người để quyết định bước tiếp theo.
Bài Chẩn đoán JSON trình bày chi tiết về định dạng này.
Bề mặt nhỏ gọn có chủ đích
Ngữ pháp của Zero nhỏ gọn và nhất quán, về tinh thần gần với C thời đầu hơn là một ngôn ngữ "có đủ mọi thứ" như Scala hay C++ hiện đại. Lý do rất thực tế: một agent nên nắm được toàn bộ ngôn ngữ trong một phiên làm việc mà không vấp phải các trường hợp biên.
Điều đó có nghĩa là bạn sẽ thấy:
- Một cách để khai báo hàm (
funhoặcpub fun). - Một cách để gắn giá trị cục bộ (
let). - Một cách để mô hình hóa kiểu tích (
shape), một cách cho kiểu tổng (choice), một cách cho kiểu liệt kê đơn giản (enum). - Một cấu trúc so khớp mẫu (
match). - Một cấu trúc vòng lặp trong phiên bản đầu của ngôn ngữ (
while).
Những gì bạn sẽ không thấy, ít nhất ở giai đoạn này, là nạp chồng toán tử, chuyển đổi kiểu ngầm, macro, decorator, hay ba cách cạnh tranh nhau để diễn đạt cùng một ý. Đó không phải là khổ hạnh; đó là lựa chọn có chủ ý để giữ bề mặt đủ nhỏ, giúp agent hiếm khi chọn nhầm biến thể.
Zero không phải là gì
Để bạn có kỳ vọng đúng:
- Không phải ngôn ngữ kịch bản (scripting). Zero biên dịch ra tệp thực thi native. Chương trình rất nhỏ (tài liệu nhắc đến tệp thực thi dưới 10 KB) và không kéo theo runtime.
- Không phải Rust, không phải Go, không phải Zig. Cú pháp có chung tổ tiên nhưng ưu tiên khác nhau: Rust tối ưu cho an toàn bộ nhớ với một hệ thống kiểu tinh vi, còn Zero tối ưu để agent dễ học với một hệ thống kiểu cố ý thật nhỏ.
- Chưa ổn định. Zero đang ở giai đoạn trước 1.0. Nhóm phát triển nói rõ sẽ có những thay đổi phá vỡ tương thích nếu chúng giúp tiến gần hơn tới mục tiêu ưu tiên agent. Đừng dựa vào nó cho việc gì nghiêm túc lúc này.
- Không phải tính năng của nền tảng triển khai Vercel. Dù đến từ Vercel Labs, Zero không gắn với Next.js hay hosting của Vercel. Đây là một ngôn ngữ hệ thống độc lập.
Khi nào nên thử Zero ngay hôm nay
Bạn nên thử Zero lúc này nếu bạn quan tâm đến:
- Một ngôn ngữ thay đổi thế nào khi các ràng buộc thiết kế đến từ agent thay vì con người.
- Thử nghiệm I/O dựa trên capability mà không phải dùng một ngôn ngữ nghiên cứu.
- Xem "đầu ra trình biên dịch có cấu trúc" trông ra sao khi là một tính năng hạng nhất thay vì thứ được thêm vào sau.
- Góp ý cho Vercel Labs về một dự án đang phát triển tích cực.
Bạn nên bỏ qua nó (tạm thời) nếu bạn cần một ngôn ngữ ổn định cho công việc thực tế, muốn một hệ sinh thái thư viện trưởng thành, hoặc cần công cụ đa nền tảng ở mức như Rust hay Go.
Tiếp theo: cài đặt Zero
Tài liệu tiếp theo hướng dẫn cài đặt bộ công cụ Zero và biên dịch chương trình đầu tiên của bạn. Toàn bộ chỉ mất khoảng một phút.
Câu hỏi thường gặp
Ngôn ngữ lập trình Zero là gì?
Zero là một ngôn ngữ lập trình hệ thống thử nghiệm của Vercel Labs, được thiết kế để agent AI là người dùng chính bên cạnh con người. Ngôn ngữ có cú pháp nhỏ gọn và nhất quán, hiệu ứng tường minh qua capability World, và một trình biên dịch xuất ra chẩn đoán JSON có cấu trúc cùng kế hoạch sửa lỗi máy đọc được mà agent có thể dùng trực tiếp.
Ai làm ra Zero và đây có phải sản phẩm chính thức của Vercel không?
Zero đến từ Vercel Labs, bộ phận nghiên cứu của Vercel. Đây là một dự án thử nghiệm mở tại github.com/vercel-labs/zero, không phải sản phẩm ổn định của Vercel. README ghi rõ đây là phiên bản trước 1.0 và khuyến cáo không chạy nó trong môi trường production hay với dữ liệu nhạy cảm.
Zero có phải là một 'ngôn ngữ cho agent' không?
Đúng vậy. Mục đích cốt lõi của Zero là thiết kế một ngôn ngữ mà agent AI, không chỉ con người, có thể đọc, sinh, gỡ lỗi và sửa code một cách đáng tin cậy. Điều đó định hình mọi thứ, từ ngữ pháp nhỏ gọn và nhất quán cho đến đầu ra JSON của trình biên dịch và các mã lỗi ổn định như NAM003.
Một tệp mã nguồn Zero trông như thế nào?
Tệp mã nguồn dùng phần mở rộng .0. Một chương trình tối giản trông như sau: pub fun main(world: World) -> Void raises { check world.out.write("hello\n") }. Tham số World là đối tượng capability bạn dùng để thực hiện I/O, còn raises cùng check làm cho các thao tác có thể thất bại trở nên tường minh.
Zero đã sẵn sàng cho production chưa?
Chưa. Zero đang ở giai đoạn trước 1.0 và được ghi rõ là thử nghiệm. Trình biên dịch, thư viện chuẩn và cú pháp vẫn đang thay đổi. Nhóm phát triển khuyên chỉ chạy nó trong môi trường tách biệt: hãy dùng để học, làm prototype và góp ý, không dùng để phát hành phần mềm cho khách hàng.