D言語はIdentifierとしてUnicode Codepointを使うことができる。
- identifierの定義
- character setの定義 (直接的に定義されていないが、Letterはcharacter setで表現可能である文字と推測できる)
従って、以下のようなコードを書くことができる。
void ほげ() {} // これは合法
上記の関数が名前修飾されると、以下のように修飾された名前の中にUnicode識別子が登場する。
$ dmd -c hoge.d $ nm hoge.o 0000000000000000 t 0000000000000000 R _D4hoge12__ModuleInfoZ 0000000000000000 W _D4hoge6ほげFZv U __start_minfo U __stop_minfo U _d_dso_registry
これは名前修飾のABI仕様上合法である。
- 名前修飾
- NameおよびLNameの定義
A Name is a standard D identifier.
実際にUnicode識別子をIdentifierとして用いなければ問題とはならないが、例えばこういった文字集合を含んだシンボル名を解釈しないプラットフォームなどがある場合には問題が起きる。 (EDIt: 正確にいうと、D言語はソースコードはUTF-8で書かれていると仕様で規定されているので、UTF-8でエンコードされたシンボルが常に入っていることになると思われる。)
SwiftやRustの新しい名前修飾(v0)ではpunycode方式でUnicode識別子をエンコーディング(実際はRustの場合はさらに別のエンコーディング方式も用いている)することで対応する文字集合の範囲を狭めている。