C系语言中的命名修饰

光栅化软件渲染器SoftArt进行了一半,现在主要的工作都集中在了编译器一块(也就是SASL了)。最近由于毕业答辩比较紧张,所以只能有空闲研究和实现一些较小的问题,例如Name Mangling。

对于C++一系的语言,Name Mangling主要用于同名函数,同名类型和同名变量的重载。编译器可以在编译期将同名函数的不同签名形式区分开来。Name Mangling经常用于以下场合:函数同名称不同签名(函数重载);跨编译单元的变量、函数引用;动态链接库或其他形式的函数、变量导出。

尽管现阶段SASL不打算支持Member Function等比较复杂的行为,甚至暂时不考虑函数重载。但是作为现代语言编译的基本要素,SASL在语义分析阶段,仍然提供了较为完善的Name Mangling机制,为以后的编译器特性扩充打下基础。

通过参考网上现有的Mangling版本,本文以MSVC的Mangling方法为基础,设计并实现了SASL的Mangling语法:

具体的语法如下:
mangled_name = 'M' basic_name '@' return_value_type parameter_type_list '@' 'Z'
basic_name = string '@'
return_value_type = value_type
parameter_type_list = ( value_type )*
value_type = qualifier_code type_code
qualifier_code = "UN" | "CN" | "NN" | "UC"
type_code = buildin_typecode | struct_class_typecode | array_type_code
buildin_typecode = dimension_code basic_type
dimension_code = scalar | vector | matrix
scalar = 'B'
vector = 'V' (1|2|3|4)
matrix = 'M' (1|2|3|4){2}
basic_type =
  'S1' | 'U1' | 'S2' | 'U2' | 'S4' | 'U4' | 'S8' | 'U8' | 'F' | 'D' | 'V' | 'B'
struct_class_typecode = 'S' string '@@'
array_class_typecode = 'A' type_code size '@@'

和主流语言(C++)相比, 本Mangling暂时不支持Qualifier(Class Member,Namespace Qualifiers)。以后在需要Qualifier的时候再酌情添加。

以 下是一个mangling的例子:

double foo();  => Mfoo@@NNBD@Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值