Tập 20: Tuyên ngôn ngầm

Sau khi dành nhiều thời gian nghiên cứu sâu sắc lịch sử phát triển của C, lá thư khởi đầu của Linux, tài liệu thiết kế của Rust, triết lý tối giản của Go, kiến trúc máy ảo của JVM, hạ tầng LLVM, CompCert, seL4 và hàng loạt nghiên cứu học thuật về effects cùng regions, tôi không còn nhìn nhận DUY như một cuộc nổi loạn ngây thơ chống lại thế giới của các ngôn ngữ lập trình cũ kỹ nữa.

DUY giống như một cuộc đối thoại chân thành và sâu sắc với thế hệ tiền nhân.

Từ ngôn ngữ C, DUY nhận quyền kiểm soát tài nguyên tối đa và sự gần gũi sát phần cứng máy tính. Từ Rust, DUY tiếp nhận tham vọng an toàn bộ nhớ tuyệt đối từ thời điểm biên dịch mà không cần GC chạy ngầm. Từ Go, DUY học hỏi triết lý tối giản tính năng, tốc độ biên dịch cực nhanh và sức mạnh của hệ thống tooling đi kèm. Từ Java, DUY nhận ra bài học rằng tính tương thích lâu dài và hệ sinh thái thư viện phong phú có sức mạnh lớn hơn bất kỳ một tính năng cú pháp đơn lẻ nào. Từ LLVM, DUY học cách đứng trên vai người khổng lồ để tận dụng hạ tầng tối ưu hóa dùng chung của nhân loại. Từ CompCert, DUY khắc cốt ghi tâm rằng chính trình biên dịch cũng là một công cụ của con người và hoàn toàn có thể mắc sai lầm nghiêm trọng. Từ seL4, DUY học hỏi triết lý giữ cho lõi hệ thống cực kỳ nhỏ gọn để có thể bảo đảm an toàn một cách đáng tin cậy nhất.

Tuyên ngôn thiết kế của DUY vì thế không cần phải viết bằng những giọng điệu thách thức:

Con người viết ý định rõ ràng.
Trình biên dịch giữ luật nghiêm khắc.
Bộ nhớ có vòng đời hoàn toàn dự đoán được.
Chi phí vận hành quan trọng bắt buộc phải hiện hình.
Mã nguồn an toàn không sống dựa vào sự may mắn.
AI hỗ trợ đi nhanh, nhưng không thay thế cho bằng chứng xác thực.
Tệp nhị phân cuối cùng phải chạm được vào phần cứng thật.

Nghe như một danh sách các nguyên tắc vô cùng hợp lý và đơn giản. Bắt tay vào hiện thực hóa đồng thời toàn bộ chúng mới là phần thử thách thực sự của một kỹ sư.

Cú pháp đơn giản (simple syntax) hoàn toàn có thể xung đột trực diện với ngữ nghĩa tường minh (explicit semantics). Cơ chế suy luận tự động (inference) có thể làm các thông báo lỗi (diagnostics) trở nên mơ hồ khó đoán. Quyền sở hữu tĩnh (ownership) có thể đẩy độ phức tạp thiết kế lên vai các thư viện API. Hệ thống effects có thể khiến chữ ký hàm trở nên dài dòng và ồn ào. Phân vùng bộ nhớ (region) có thể vô tình làm tăng đỉnh bộ nhớ sử dụng. LLVM hỗ trợ sinh mã máy nhanh chóng nhưng mở ra một tầng dependency khổng lồ. Việc tự biên dịch chính mình (self-hosting) tạo ra uy tín công nghệ lớn cho ngôn ngữ nhưng rất dễ tiêu tốn hàng chục sprint lao động của đội ngũ mà không mang lại bất kỳ tính năng mới nào cho người dùng cuối. Hệ sinh thái cần tốc độ phát triển nhanh chóng; sự an toàn của ngôn ngữ lại đòi hỏi một sự kiên nhẫn vô cùng lớn.

Tôi kiên quyết viết toàn bộ những mâu thuẫn kiến trúc ấy xuống trang tài liệu này, bởi vì một bản tuyên ngôn chỉ liệt kê toàn những điều tốt đẹp và ưu điểm thì không phải là một tài liệu thiết kế hệ thống. Tài liệu thiết kế hệ thống thực sự phải chỉ ra sòng phẳng xem chúng ta sẵn sàng chấp nhận đánh đổi và trả giá bằng điều gì cho các mục tiêu của mình.

DUY chọn quy trình phát triển tập trung vào trình biên dịch (compiler-centered workflow). Nghĩa là ngữ nghĩa ngôn ngữ, checker, cấu trúc IR, bộ verifier, hệ thống tests và các phép đo benchmark bắt buộc phải được xây dựng song hành cùng sự tiến hóa của cú pháp. DUY chọn quản lý bộ nhớ dự đoán được (deterministic memory) thay vì thu gom rác chạy ngầm. DUY chọn cơ chế composition (kết hợp) thay vì thừa kế lớp (class inheritance) làm nền tảng mô hình hóa dữ liệu. DUY chọn thất bại là giá trị hiển thị rõ ràng thông qua kiểu Result, Option, pattern matching và toán tử ?. DUY chọn sức mạnh vật lý thô ráp của máy tính phải nằm gọn gàng đằng sau ranh giới từ khóa unsafe, tuyệt đối không được phép tràn lan tự do trong vùng mã nguồn an toàn (safe code).

Nhưng ở thời điểm sơ khai này, toàn bộ những nguyên tắc ấy chủ yếu vẫn nằm trên các bản vẽ thiết kế và tài liệu nghiên cứu. Câu nói “DUY muốn trở thành một modern systems language cho con người và AI” là lời tuyên bố về hướng đi của dự án, chưa phải là trạng thái thực tế của sản phẩm. Muốn biến cái “muốn” lãng mạn ấy thành chữ “là” kỹ thuật thật sự, trình biên dịch bắt đầu phải hiểu được mã nguồn thật, kiên quyết từ chối các chương trình viết sai luật và tạo ra được các tệp nhị phân gốc thực thi trơn tru trên phần cứng.

Tôi đóng các tài liệu nghiên cứu lý thuyết lại. Trên màn hình máy tính chỉ còn lại một thư mục repo gần như trống rỗng và một đường ống biên dịch ngắn gọn đến mức có thể ghi nhớ dễ dàng bằng mắt:

Mã nguồn DUY (.duy) -> Trình biên dịch (duyc) -> File thực thi gốc (native binary)

Phần học hỏi lý thuyết từ thế giới cũ đã tạm thời đầy đủ. Chương tiếp theo bắt buộc phải bẩn tay hơn nhiều: viết lệnh CLI đầu tiên, định nghĩa ngữ pháp đầu tiên, dựng cây AST đầu tiên, đối mặt với lỗi biên dịch đầu tiên, bắc cây cầu qua C và trải nghiệm khoảnh khắc kỳ diệu khi một tệp .duy thật sự biến đổi thành một chương trình chạy được trên máy tính.

Một ngôn ngữ lập trình bắt đầu bằng những tư tưởng thiết kế. Nó chỉ có thể tiếp tục tồn tại khi những tư tưởng ấy dũng cảm bước vào debugger.


Tập 20: Tuyên ngôn ngầm

Bình luận (0)

Đang tải bình luận...