- 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) và 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 Result và ngoạ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) và 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
Đủ 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...
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.
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ờ...)
Ý kiến trên Hacker News
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
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
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
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
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
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
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
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
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
Cá nhân tôi thấy thiếu function overloading, tham số mặc định, và trả về tuple
ResulthayExpectedlà Optional 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
Option<T>hayResult<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Đâ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
Resultvốn đã mang nghĩa chung là giá trị trả về nên có thể gây nhầm lẫnDanh sách phát trên YouTube
Đ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
Thay vào đó có thêm các tính năng như macro và reflection
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 đã 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
Rào cản gia nhập thấp đến mức có thể làm prototype chỉ trong một ngày
Đó 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
Nhờ LLVM mà anh ấy có thể tự làm một compiler mới
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
Và việc gọi exception là “Excuses” khá dễ thương và hóm hỉnh
Đặ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