C/C++等底层编程语言的新特性是如何开发实现的?
C/C++ 语言特性的实现方式说明
首先要明确:C标准本质是一套公开的语法、行为规范文档,所有新特性的落地都是由编译器、标准库的开发团队完成的,不存在所谓“C官方开发组”直接写代码实现特性的情况。
新特性的两类实现路径
- 纯标准库层面实现,不需要修改编译器
大部分工具类、函数类的新特性都属于这一类,比如C11的std::unique_ptr、C17的std::optional、C20的std::format,完全可以用既有C语法通过模板、类封装的方式实现,不需要改动编译器的任何逻辑。很多这类特性在正式纳入标准前,就已经在Boost等第三方库中完成了可行性验证,成熟后才被收入官方标准库。 - 语法层面特性,必须修改编译器内核
涉及新增语法规则、底层语义的特性没有办法用现有C++语法模拟,必须修改编译器的核心逻辑:- 首先调整词法、语法分析模块,让编译器可以识别新的语法写法,不会抛出语法错误
- 其次修改语义分析模块,定义新特性的类型规则、作用域规则、生命周期规则,比如lambda的变量捕获逻辑、结构化绑定的类型推导逻辑都在这一层实现
- 最后调整中间代码/机器码生成逻辑,把新的语法结构转换成符合运行要求的二进制代码,比如lambda最终会被编译器转换成重载了
operator()的匿名类实例,这个转换逻辑是编译器内核硬编码实现的。
编译器实现新特性用的是什么语言?
主流C编译器(GCC、Clang、MSVC)基本都实现了自举,也就是编译器本身就是用C/C编写的,所以修改编译器内核新增特性的时候,确实是用C/C本身编码完成的。当然也有小众C编译器是用其他语言开发的,这种情况就用对应编译器的开发语言实现新特性。
还有少部分底层特性需要配套工具链的支持,比如C++11的thread_local线程局部存储,除了编译器支持外,还需要链接器、操作系统的线程调度模块配合才能正常工作,不是仅修改编译器就能落地的。
有没有其他修改语言特性的技术手段?
所有不需要修改编译器、标准库的“新特性”都属于非标准扩展,不算官方C++特性的范畴:
- 编译器自定义扩展:比如GCC的
__builtin_expect、MSVC的__declspec系列属性,都是编译器厂商自己加的非标准特性,不需要通过C++标准委员会审批 - 宏封装语法糖:很多框架会用宏封装出类似反射、序列化的专用语法,看起来像是新增了语言特性,本质只是预编译期的文本替换,没有改动C++本身的语法规则。
内容的提问来源于stack exchange,提问作者Urxtixt
相关产品推荐
相关产品推荐

