19 điểm bởi GN⁺ 2026-01-04 | 4 bình luận | Chia sẻ qua WhatsApp
  • Một ngôn ngữ tiến hóa kế thừa cú pháp và ngữ nghĩa của C đồng thời tăng cường độ an toàn và tính dễ dùng, duy trì môi trường quen thuộc với các lập trình viên C hiện có
  • Tương thích hoàn toàn với C ABI, có thể tích hợp ngay vào các dự án C/C++; đã có trường hợp một phần mã của vkQuake được chuyển sang C3 và build bằng trình biên dịch c3c
  • Hệ thống module, nạp chồng toán tử, macro thời gian biên dịch giúp cải thiện cấu trúc mã và khả năng biểu đạt
  • Bao gồm các tính năng hiện đại như lập trình theo hợp đồng (Gradual Contracts), xử lý lỗi zero-overhead, reflection thời gian chạy và thời gian biên dịch
  • Ở chế độ debug, tự động cung cấp kiểm tra an toàn và stack trace chi tiết, có lợi cho việc phát hiện lỗi và đảm bảo độ ổn định

Tổng quan về C3

  • C3 là một ngôn ngữ lập trình được phát triển dựa trên cú pháp (syntax)ngữ nghĩa (semantics) của ngôn ngữ C
    • Mục tiêu là tiến hóa ngôn ngữ trong khi vẫn giữ hình thức quen thuộc với các lập trình viên C hiện có
  • Hỗ trợ nạp chồng toán tử chính xác và định hướng mục đích
    • Không có cấu trúc nạp chồng phức tạp như C++, vẫn có thể biểu đạt tự nhiên vector, ma trận, phép toán số cố định
  • Hỗ trợ lập trình theo hợp đồng, cho phép khai báo các ràng buộc ở thời gian chạy và thời gian biên dịch
    • Tăng cường độ ổn định của mã và tính nhất quán của đặc tả
  • Kết hợp ưu điểm của xử lý lỗi dựa trên Resultngoại lệ (exception)
    • Cung cấp cấu trúc quản lý lỗi tích hợp tự nhiên với mã C
  • Hỗ trợ truy vấn thông tin kiểu (type introspection) cả ở thời gian biên dịch lẫn thời gian chạy
  • Assembly nội tuyến: có thể viết assembly như mã thông thường mà không cần chuỗi ký tự hay ràng buộc phức tạp
  • Trong chế độ debug, tự động chèn kiểm tra biên (bound checks)kiểm tra giá trị (value checks) ở thời gian chạy
  • Thư viện chuẩn C3 mặc định cung cấp stack trace chi tiết trong các bản build debug
    • Có thể xác định vị trí lỗi cụ thể thay vì chỉ thấy “segmentation fault”

Tính tiện dụng và an toàn

  • Thông qua Optionals, cung cấp độ an toàn trong xử lý lỗi và null
  • Cú pháp defer hỗ trợ tự động hóa việc dọn dẹp tài nguyên
  • slices và foreach cho phép xử lý lặp an toàn
  • contracts dựa trên chú thích cho phép khai báo các điều kiện ràng buộc của mã
  • Trong ngữ cảnh @pool, hỗ trợ giải phóng bộ nhớ tự động

Hiệu năng theo mặc định

  • Có thể viết trực tiếp vector SIMD để kiểm soát ở mức phần cứng
  • Hỗ trợ tinh chỉnh hiệu năng thông qua việc chọn nhiều kiểu bộ cấp phát bộ nhớ khác nhau
  • Áp dụng thiết kế không tạo overhead trong xử lý lỗi
  • Tận dụng thời gian biên dịch nhanh và tối ưu hóa backend LLVM
  • Cung cấp assembly nội tuyến dễ sử dụng

Thư viện chuẩn đầy đủ sẵn dùng

  • Cung cấp các cấu trúc dữ liệu chuẩn bao gồm container động và chuỗi
  • Đảm bảo tính di động đa nền tảng thông qua lớp trừu tượng cross-platform
  • Cho phép truy cập nền tảng native khi cần

Tận dụng các thư viện C hoặc C++ hiện có

  • C3 tương thích hoàn toàn với C ABI, không cần các “kiểu tương thích C” hay khai báo hàm riêng biệt
  • Có thể liên kết mã C trong C3, và từ C cũng có thể liên kết mã C3

Module đơn giản

  • Hệ thống module đơn giản và trực quan
    • Thiết lập mặc định được cấu hình hợp lý, không cản trở luồng phát triển
  • Cung cấp quản lý namespace thông qua module
  • Đơn giản hóa cấu trúc đóng gói bằng điều khiển tường minh
  • Có thể định nghĩa hành vi dùng chung bằng interface
  • Cung cấp tính năng generic modules để hiện thực việc tạo kiểu generic theo cách đơn giản và rõ ràng
  • Hỗ trợ tái sử dụng cấu trúc thông qua subtyping của struct

Macro không cần bằng tiến sĩ

  • Có thể viết macro thời gian biên dịch với hình thức tương tự hàm thông thường
  • Hỗ trợ macro nhận biết kiểu có thể hiểu thông tin kiểu của mã
  • Hỗ trợ sinh mã rõ ràng và mạnh mẽ hơn bộ tiền xử lý của C

4 bình luận

 
kayws426 2026-01-06

Đủ kiểu đang lần lượt xuất hiện nhỉ. LONG LIVE C-LANG !!!
Nhưng nếu sau này c4 ra mắt thì liệu nó có thật sự được yêu thích bùng nổ không...

 
bus710 2026-01-05

Vì Zig hằng năm đều mang tới các thay đổi phá vỡ tương thích, nên dù tôi thích ngôn ngữ này nhưng giờ cũng không còn mặn mà dùng nữa. Ngược lại, khi xem phần giới thiệu về C3, tôi thấy tổng thể nó mang cảm giác như sự kết hợp giữa C + Go, nên khá dễ đọc và dễ viết, đồng thời có vẻ sẽ bớt căng thẳng hơn nhiều trước các đợt nâng phiên bản.

 
mhcoma 2026-01-05

Vừa dùng vừa ủng hộ chút... Gần đây tôi đang dùng và thấy khá thú vị.
Tôi thích cảm giác nó chỉ cố cải thiện những điểm bất tiện của C.
Tài liệu chính thức thì vẫn chưa thực sự chín muồi
(muốn tìm hiểu mấy tính năng này kia thì nhiều khi lại được mô tả ở những chỗ rất bất ngờ...)

 
GN⁺ 2026-01-04
Ý kiến trên Hacker News
  • Tôi thích định hướng tiết chế trong triết lý thiết kế của C3
    Nó không ép buộc một mô hình bộ nhớ mới, cũng không cố trở thành C++
    Đặc biệt, nhờ tương thích ABI hoàn toàn, có thể trộn trực tiếp các tệp C3 vào hệ thống build C hiện có mà không cần viết binding
    Tôi hoan nghênh tầm nhìn của người duy trì là theo đuổi tiến hóa thay vì cách mạng
    Rất đáng để giới thiệu như một ngôn ngữ học thử vào cuối tuần. Hiện đại hơn C99 nhưng vẫn cho cảm giác quen thuộc
    • Tôi tự hỏi liệu có thể viết thư viện bằng C3 rồi export symbol để dùng từ binding hay không
      Lý do tôi vẫn chưa thể từ bỏ hoàn toàn C là vì cstring và các con trỏ không được giải phóng
    • Tôi nghi ngờ việc tương thích ABI hoàn toàn có thực sự quan trọng đến vậy không
      Bản thân C không hẳn là ngôn ngữ nguy hiểm, mà chính implementation và ABI mới nguy hiểm
      Nếu áp dụng fat pointer, cải thiện varargs, UBSan, MTE v.v. thì cũng khá ổn
  • Tôi nảy ra thắc mắc khi đọc phần Contracts trong tài liệu chính thức của C3
    Nếu compiler không bắt buộc phải kiểm tra contract, và khi vi phạm thì có thể dẫn tới hành vi không xác định, thì tôi không rõ phải tin tưởng và sử dụng nó thế nào
    Đây là một tính năng hay, nhưng có vẻ hơi rủi ro
    • Contract là bất biến (invariant) để biểu đạt “điều kiện phải luôn đúng”
      Có thể bỏ qua nó, kiểm tra ở runtime, hoặc giả định nó luôn đúng để tận dụng cho tối ưu hóa
      Ví dụ có thể chọn kiểm tra tính hợp lệ của con trỏ, còn điều kiện đầu vào là số lẻ thì để ở dạng giả định
    • Contract là phương tiện giúp diễn đạt ý định theo một cách tiêu chuẩn hóa
      Các nhóm lớn có thể bắt buộc dùng, còn các công cụ như Visual Studio có thể chỉ hiện cảnh báo để hỗ trợ học dần từng bước
    • Ba câu trong tài liệu lần lượt có nghĩa là
      1. compiler không nhất thiết phải sử dụng contract
      2. khi vi phạm có thể dẫn tới hành vi không xác định
      3. ở chế độ an toàn thì sẽ kiểm tra bằng runtime assert
        Tức là có thể bật khi phát triển, rồi tắt khi phát hành để không ảnh hưởng hiệu năng
    • Rốt cuộc đây là cách biểu đạt tường minh ngay trong code những tối ưu hóa dựa trên giả định mà compiler vốn đã làm
    • Tôi hiểu contract là một ràng buộc mềm để biểu đạt “điều kiện gần như không bao giờ xảy ra”
      Những điều kiện bắt buộc phải kiểm tra thì nên được xử lý trực tiếp bằng code bên trong hàm
  • Có thêm chi tiết trong repo GitHub của C3
    Những điểm khác với C gồm có không có file header, namespace dựa trên module, slice, operator overloading, generic module, xử lý lỗi dựa trên Result, và kiểm tra runtime trong chế độ an toàn
    • Tính năng thì tốt nhưng tôi thấy cấu thành của nó hơi mất cân bằng
      Cá nhân tôi thấy thiếu function overloading, tham số mặc định, và trả về tuple
  • Việc gọi Result hay ExpectedOptional trong C3 gây khó hiểu
    Đáng ra nó phải mang nghĩa “T hoặc E” chứ không phải “T hoặc rỗng”, nên có vẻ cái tên không đúng
    Liên kết tài liệu liên quan
    • Optional của C3 khác với Option<T> hay Result<T, E>
      Kiểu lỗi bị giới hạn chỉ còn một mã số nguyên, và điều đó rất hợp với triết lý “tiến hóa, không phải cách mạng”
      Cú pháp type? cũng trực quan
    • Trong code người ta không trực tiếp dùng từ “Optional”
      Đây là thiết kế giữ nguyên ngữ nghĩa của C đồng thời giảm bớt gánh nặng của out param
    • Tôi không thích việc tùy tiện đổi tên khái niệm, nhưng nếu chỉ hỗ trợ một trong hai thì Optional lại là cái tên rõ ràng hơn
      Result vốn đã mang nghĩa chung là giá trị trả về nên có thể gây nhầm lẫn
    • Dù vậy, “Option” hay “Maybe” lại mang nghĩa khác, nên tôi nghĩ “Result” hoặc “Either” sẽ phù hợp hơn
  • Có video Tsoding livestream hơn 30 tiếng bằng C3
    Danh sách phát trên YouTube
  • Tôi từng giao lưu với các nhà phát triển của C3, Odin và Zig
    Điều gây ấn tượng là ba ngôn ngữ này không cạnh tranh nhau mà là mối quan hệ cùng chia sẻ trade-off và học hỏi lẫn nhau
    • Tôi tò mò không biết trong môi trường embedded thì ngôn ngữ nào là lựa chọn hợp lý nhất
    • Nói là “không cạnh tranh mà là học hỏi”, nhưng tôi vẫn thấy rốt cuộc đây chỉ là cạnh tranh được diễn đạt một cách lịch sự
  • Khi lướt tài liệu, tôi đã giải đáp được hai thắc mắc
    1. dựa trên LLVM nên có tính khả chuyển cao
    2. Không hỗ trợ tagged enum
      Thay vào đó có thêm các tính năng như macro và reflection
    • Tôi cho rằng tagged union không hiệu quả trong ngôn ngữ hệ thống
      Nó chiếm bộ nhớ bằng kiểu lớn nhất, và luồng xử lý sẽ chuyển sang kiểm tra kiểu ở runtime nên làm mất lợi thế của ngôn ngữ định kiểu tĩnh
      Theo tôi khi cần thì tự triển khai sẽ tốt hơn
  • Tôi băn khoăn không biết đến khi nào thì việc tạo ra một ngôn ngữ mới mới đáng giá
    Tôi đã tự cài generic, slice và truyền lỗi trong C, nhưng việc làm compiler thì quá phức tạp
    Vì thế tôi dùng song song một biến thể của C và Go
    • Nhờ LLVM mà việc tạo ra một ngôn ngữ kiểu “C tốt hơn” dễ hơn tưởng tượng
      Rào cản gia nhập thấp đến mức có thể làm prototype chỉ trong một ngày
    • Tạo ra ngôn ngữ luôn có giá trị
      Đó là cách duy nhất để biến một paradigm mới thành hiện thực
      Ngôn ngữ khó vì phải điều phối cả cú pháp, thư viện chuẩn, tooling lẫn runtime, nhưng cũng vì thế mà ảnh hưởng của nó tới tương lai rất lớn
    • C3 vốn là dự án độc lập do Christoffer, người từng đóng góp cho C2, khởi động sau khi cảm thấy bức bối vì tốc độ phát triển
      Nhờ LLVM mà anh ấy có thể tự làm một compiler mới
    • Giá trị của ngôn ngữ nằm ở việc tạo ra sự thấu hiểu chung với người khác
      Một biến thể C dùng một mình thì ổn, nhưng nếu muốn cộng tác với người khác hoặc dùng thư viện bên ngoài thì cần một ngôn ngữ chung
  • Ban đầu tôi nghĩ đây sẽ là một ngôn ngữ đơn giản, nhưng lại bất ngờ vì danh sách tính năng phong phú
    Và việc gọi exception là “Excuses” khá dễ thương và hóm hỉnh
  • Tôi nghĩ chính những website như thế này mới là hình mẫu cho website của ngôn ngữ lập trình
    • Ngược lại, tôi lại thấy thiết kế của nó non nớt và mang cảm giác nghiệp dư
      Đặc biệt là việc có liên kết Discord trong thanh điều hướng càng làm ấn tượng đó mạnh hơn