Giới thiệu Nibble: Ngôn ngữ lập trình hệ thống gọn nhẹ viết bằng C

Phần mềm14 tháng 5, 2026·2 phút đọc

Nibble là một ngôn ngữ lập trình hệ thống giống C, được xây dựng như một thử nghiệm tạo frontend LLVM trong một lượt duy nhất với khoảng 3000 dòng code C. Dự án này không phụ thuộc vào thư viện bên ngoài, không sử dụng malloc hay cây cú pháp trừu tượng (AST), đi kèm với các ví dụ đồ họa minh họa khả năng của nó.

Giới thiệu Nibble: Ngôn ngữ lập trình hệ thống gọn nhẹ viết bằng C

Nibble là một ngôn ngữ lập trình hệ thống mang phong cách của C, được thiết kế để chứng minh một cách tiếp cận tối giản trong việc xây dựng trình biên dịch. Điểm ấn tượng nhất của dự án này là toàn bộ mã nguồn chỉ dài khoảng 3000 dòng code C, nhằm tạo ra LLVM IR (Intermediate Representation) mà không cần phụ thuộc vào các thư viện bên ngoài, không sử dụng malloc hay cây cú pháp trừu tượng (AST).

Minh họa đồ họa của NibbleMinh họa đồ họa của Nibble

Mặc dù có kích thước cực kỳ nhỏ gọn, Nibble vẫn hỗ trợ nhiều tính năng quan trọng của một ngôn ngữ lập trình hiện đại. Các tính năng này bao gồm defer, đệ quy, các kiểu dữ liệu như số nguyên, số thực, boolean, cấu trúc (structs) với toán tử kiểu GLSL, con trỏ, con trỏ hàm, rẽ nhánh, vòng lặp và kiểm tra kiểu dữ liệu (type checking). Ngoài ra, ngôn ngữ này còn cho phép tương tác cơ bản với C thông qua con trỏ generic và cung cấp các thông báo lỗi khá thân thiện với người dùng.

Để minh họa sức mạnh của mình, Nibble đi kèm với 4 bản demo đồ họa. Người dùng cần cài đặt SDL2 và Clang, sau đó chạy lệnh make để biên dịch. Trong số các demo này, có hai bản là phần mềm kết xuất đa luồng (multithreaded) mô phỏng các shader-toy phổ biến, một bản minh họa thuật toán cây đỏ-đen (red-black tree), và bản cuối cùng là thiết lập cơ bản cho lập trình game.

Minh họa cây đỏ-đenMinh họa cây đỏ-đen

Về mặt kỹ thuật, Nibble biên dịch từ trên xuống dưới trong một lượt duy nhất (single pass) và thực hiện cấp phát bộ nhớ stack (allocas) tự do, ngay cả trong các vòng lặp. Thiết kế này giúp mã nguồn của trình biên dịch (main.c) dễ đọc hơn đáng kể, nhưng lại gây ra tràn bộ nhớ stack (stack overflow) khi sử dụng các mức tối ưu hóa backend thấp (đôi khi cả mức cao) của Clang.

Tác giả chia sẻ rằng ông từng nghĩ rằng bộ tối ưu hóa của Clang sẽ tự động di chuyển tất cả các allocas lên đầu hàm, nhưng thực tế không phải vậy. Mặc dù có ý định khám phá thêm về stacksave/stackrestore để khắc phục hạn chế này, nhưng sự tò mò về LLVM của tác giả đã được thỏa mãn và ông đánh dấu trình biên dịch này là hoàn tất trong thời điểm hiện tại.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗