對于C++一系的語言,Name Mangling主要用于同名函數,同名類型和同名變量的重載。編譯器可以在編譯期將同名函數的不同簽名形式區分開來。Name Mangling經常用于以下場合:函數同名稱不同簽名(函數重載);跨編譯單元的變量、函數引用;動態鏈接庫或其他形式的函數、變量導出。
盡管現階段SASL不打算支持Member Function等比較復雜的行為,甚至暫時不考慮函數重載。但是作為現代語言編譯的基本要素,SASL在語義分析階段,仍然提供了較為完善的Name 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 '@@'
和主流語言相比,本Mangling暫時不支持Qualifier(Class Member,Namespace Qualifiers)。以后在需要Qualifier的時候再酌情添加。也就是說暫時不會考慮現有版本和以后版本在二進制上的兼容性。
以下是一個mangling的例子:
double foo(); => Mfoo@@NNBD@Z