编程 cppfront 上手笔记:给现有 C++ 套一层 Cpp2 语法,编译回 C++20

2026-09-10 00:04:28

cppfront 上手笔记:给现有 C++ 套一层 Cpp2 语法,编译回 C++20

项目地址:https://github.com/hsutter/cppfront | 在线文档:https://hsutter.github.io/cppfront/
仓库状态:约 6k star,2026 年仍活跃。

它解决什么问题:用更小、更安全的语法写 C++,但不换生存环境

cppfront 是 Herb Sutter 维护的实验编译器:把 C++ 的 “Syntax 2”(Cpp2)翻译回今天的 “Syntax 1”(Cpp1)。它不是 C++ 的继任语言,而是一个实验场:

  • 给现有 C++ 套一层更简单、默认更安全的语法皮;
  • 用这层语法原型化将来可能提交给 ISO C++ 的特性。

Cpp2 不是独立语言,也没有自己的不兼容模块或概念体系。它不替换标准 C++ 编译器、标准库和工具链,而是与现有 C++20+ 编译器、库、工具直接互操作,目标是把共识的 C++ 最佳实践变成默认行为。例如:

  • 类型不安全转换在 Cpp2 里写不出来;
  • 想越界必须显式写 unchecked 关键字,出 bug 时可以先 grep 这些位置。

Stroustrup 在《C++ 的设计与演化》(1994)里提过一个观点:C++ 内部藏着一个小得多、干净得多的语言;2015 HOPL-III 论文的估计是,这个核心可以做到当前语言定义的 10%。这个动机也写进了 cppfront 的 README。

构建:单文件编译,一个 C++ 编译器就够了

克隆仓库后进入 cppfront/source 目录,直接编译 cppfront.cpp

  • MSVC(VS2019 16.11+):
    cl cppfront.cpp -std:c++20 -EHsc
    
  • GCC 10+:
    g++ cppfront.cpp -std=c++20 -o cppfront
    
  • Clang 12+:
    clang++ cppfront.cpp -std=c++20 -o cppfront
    

Windows/MinGW 下如果报 “too many sections”,分别加 /bigobj(MSVC)或 /Wa,-mbig-obj(GCC)。

验证用最小文件 hello.cpp2

main: () = { std::cout << "Hello, world!\n"; }

运行 ./cppfront hello.cpp2,会生成可交给 g++/clang 的 C++20 源码。

接入现有工程:改名 .cpp2,加一个编译步骤

cppfront 刻意效仿 cfront 的接入方式——Stroustrup 当年靠 cfront 把 C++ 翻译成纯 C,从而启动了一门新语言。换成 cppfront 也一样:

  1. 把源文件从 .cpp 改成 .cpp2
  2. 在现有构建流程里插入一步:先跑 cppfront 把它翻译回 C++20 源码;
  3. 后续编译、链接、调试还是交给原本的 C++ 工具链。

这样做的结果:

  • 调试器、build system、sanitizer 全部不用改;
  • 可以在现有 C++ 工程里逐步试用 Cpp2 语法,而不是「全有或全无」。

这些想法的去向:已经进标准或正在提案路上的部分

cppfront 不只是语法实验,README 里列了 Herb Sutter 围绕它提出、已经进入或即将进入 ISO C++ 的成果:

  • C++20 的 <=> 飞船比较(P0515)
  • 参数传递统一(708 仓库 / d0708、P2064 assumptions)
  • C++20 的 constexpr
  • 反射 / metaclasses 方向(P0707)
  • is/as 模式匹配(P2392)
  • lifetime safety 静态分析(P1179,已进 VS/CLion/部分 Clang)
  • 零开销确定性异常 throwing values(P0709,未在 cppfront 实现)

相关 CppCon/ACCU talk 列表见仓库 README。

另外,Herb Sutter 在 2024-03 的文章 C++ safety, in context 里讨论安全问题的立场是:C++ 的主要安全漏洞集中在 type、bounds、initialization、lifetime 四类,太容易默认写出;他主张把已知最佳实践变成默认,同时允许显式 opt-out,而不是只靠标准库或工具推荐。文章也明确反对把 memory-safe language 看作软件安全的万能药——语言安全之外还有更大范围的威胁。博客在 https://herbsutter.com/

它做不到什么:先搞清楚边界

cppfront 当前是「演进 C++ 的试验场/原型」而不是生产替代语法。以下能力尚未在 cppfront 中实现:

  • lifetime 分析
  • gc arena(gcpp)
  • throwing values 异常(C++ 提案里主张的东西,cppfront 里没有落地)
  • 允许自己写 metafunction,仍在路上

所以如果你想拿它来做严肃的新项目,或者指望它马上变成“标准 C++ 的平替”,现在还不是时候。比较务实的用法是:在已有 C++20 工程里找个模块试写 Cpp2,把 cppfront 当作一个编译步骤加入构建,借它验证这些语法方向是否值得跟进。所有命令以你本机实际版本的仓库说明为准。

复制全文 生成海报 Herb Sutter cppfront C++ Cpp2

推荐文章

程序员茄子在线接单