kubo39's blog

ただの雑記です。

D言語の名前修飾はUnicode識別子をエンコードしない

D言語はIdentifierとしてUnicode Codepointを使うことができる。

従って、以下のようなコードを書くことができる。

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仕様上合法である。

実際にUnicode識別子をIdentifierとして用いなければ問題とはならないが、例えばこういった文字集合を含んだシンボル名を解釈しないプラットフォームなどがある場合には問題が起きる。 (EDIt: 正確にいうと、D言語ソースコードUTF-8で書かれていると仕様で規定されているので、UTF-8エンコードされたシンボルが常に入っていることになると思われる。)

SwiftやRustの新しい名前修飾(v0)ではpunycode方式でUnicode識別子をエンコーディング(実際はRustの場合はさらに別のエンコーディング方式も用いている)することで対応する文字集合の範囲を狭めている。