Lập trình viên tạo ra dự án "Based C++" khiến C++ trông giống như ngôn ngữ thông dịch

Nhóm Cộng đồng BigGo
Lập trình viên tạo ra dự án "Based C++" khiến C++ trông giống như ngôn ngữ thông dịch

Một lập trình viên sáng tạo đã phát hành Based C++, một dự án độc đáo biến đổi ngôn ngữ C++ truyền thống từ dạng biên dịch thành dạng có vẻ như được thông dịch. Dự án này đã khơi mào những cuộc thảo luận thú vị trong cộng đồng lập trình về ranh giới giữa các ngôn ngữ biên dịch và thông dịch.

Cách thức hoạt động kỳ diệu

Dự án sử dụng một thủ thuật thông minh liên quan đến các tính năng compile-time của C++. Thay vì chạy code tại runtime, toàn bộ chương trình được thực thi trong quá trình biên dịch bằng cách sử dụng constexpr evaluation và template metaprogramming. Nhà phát triển đã xây dựng các công cụ wrapper tùy chỉnh thay thế các thành phần nội bộ của GCC (cc1plus và ld) bằng các script Python để trích xuất và chạy output của chương trình trực tiếp từ quá trình biên dịch.

Cú pháp trông khá khác so với C++ tiêu chuẩn, sử dụng expression templates và các cấu trúc đặc biệt như main<{ ... }> để định nghĩa các chương trình chạy hoàn toàn tại compile time. Các thành viên cộng đồng nhận xét rằng cách tiếp cận này đẩy khả năng compile-time của C++ đến giới hạn.

Template metaprogramming: Một kỹ thuật sử dụng C++ templates để thực hiện các phép tính trong quá trình biên dịch thay vì tại runtime

Expression templates: Một kỹ thuật lập trình xây dựng các biểu thức phức tạp dưới dạng cấu trúc template có thể được đánh giá một cách hiệu quả

Ví dụ chương trình "Hello World" trong Based C++:

include "gil/std.hpp"
using namespace gil::std;

volatile auto run = main&lt;{
    str::puts(str::literal("Hello, world!\n"))
}&gt;;

Lệnh biên dịch:

g++ -std=c++23 -Based hello_world.cpp -o -

Phản hồi từ cộng đồng và những hiểu biết kỹ thuật

Cộng đồng lập trình đã có những phản ứng trái chiều với dự án này. Một số lập trình viên đánh giá cao sự sáng tạo kỹ thuật, trong khi những người khác coi đây chỉ là một thí nghiệm thú vị hơn là một công cụ thực tiễn. Một số thành viên cộng đồng chỉ ra rằng các trình thông dịch C++ truyền thống và các công cụ REPL (Read-Eval-Print Loop) như Clang-REPL và Cling đã tồn tại cho những ai muốn phát triển C++ tương tác.

Toàn bộ thứ này là một trò đùa nhưng được trình bày một cách nghiêm túc. Ý tưởng là nếu bạn biết input chương trình của mình tại compile time, bạn có thể biến mọi thứ thành constexpr được đánh giá tại compile time để chương trình của bạn được chạy bởi compiler thay vì tại run time.

Các cuộc thảo luận kỹ thuật tiết lộ rằng dự án triển khai một domain-specific language (DSL) hoàn chỉnh chạy trong quá trình biên dịch. Cách tiếp cận này chứng minh các tính năng compile-time của C++ đã phát triển đến mức nào, mặc dù nó cũng làm nổi bật sự phức tạp đi kèm với việc sử dụng template nâng cao như vậy.

Các Công Cụ Thông Dịch C++ Thay Thế:

  • Clang-REPL: REPL C++ chính thức dựa trên LLVM sử dụng biên dịch JIT
  • Cling: Trình thông dịch C++ tương tác từ dự án ROOT của CERN
  • Xeus Cling: Giao diện Jupyter notebook cho C++ tương tác
  • AngelScript: Ngôn ngữ scripting thực tế với cú pháp giống C++
  • Squirrel: Ngôn ngữ scripting nhẹ tương tự C++/Lua

Ý nghĩa rộng lớn hơn cho việc phát triển C++

Dự án đặt ra những câu hỏi thú vị về ranh giới truyền thống giữa các ngôn ngữ biên dịch và thông dịch. Trong khi C++ luôn được coi là ngôn ngữ biên dịch, các dự án như Based C++ cho thấy rằng sự phân biệt này không phải lúc nào cũng rõ ràng. Cuộc thảo luận cũng đề cập đến các công cụ hiện có để hot-reloading code C++ trong game engines và môi trường phát triển.

Một số lập trình viên đề xuất rằng đối với nhu cầu C++ thông dịch thực tế, các giải pháp đã được thiết lập như AngelScript hoặc Squirrel có thể phù hợp hơn. Những công cụ này cung cấp khả năng tương tác tốt hơn và được thiết kế đặc biệt để nhúng code giống C++ được script hóa vào các ứng dụng.

Dự án Based C++ cuối cùng phục vụ như một minh chứng kỹ thuật và một khám phá đầy thú vị về những gì có thể thực hiện được với các tính năng C++ hiện đại. Mặc dù nó có thể không thay thế các quy trình phát triển truyền thống, nhưng chắc chắn nó thể hiện tiềm năng sáng tạo trong hệ thống template nâng cao của ngôn ngữ.

Tham khảo: based-cpp