光栅化软件渲染器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