mangling)は、現代的なコンピュータプログラミング言語処理系で用いられている手法で、サブルーチン(関数)名などに対する内部名を、その表層的な名前だけではなく、関数であればその引数の型や返戻値の型などといった意味的な情報を含めて修飾した(manglingした)名前とするものである。いう文字が含まれることを許すようにする、など)で済む。多重定義を許す言語では、同一の表層名に対して許される多重定義や、その同定について上手に修飾を設計すれば、扱いが単純になる。そのままではエラーメッセージ等が読み辛いものとなるが、「解読」ルーチンを呼ぶように修正するだけで、型の情報などが付加された、むしろわかりやすいメッセージが出力されるようになる。Windowsの場合[編集]一般的なC・Pascalなどの言語は関数の多重定義をサポートせず、名前修飾を必要としないが、場合によっては名前修飾によって関数についての情報を付加することがある。上のコンパイラは複数の呼出規約(サブルーチンとデータをやりとりする方法)をサポートしている。呼出規約の間には互換性がないので、コンパイラは名前修飾によって呼出規約を詳細に記述する。MSによって確立された名前修飾のスキームがあり、非公式に他のコンパイラもこれに従っている。Mars・ボーランド・gccである。このスキームは他の言語、例えば、Pascal・D言語・Delphi・FORTRAN・C#にも適用される。ライブラリを呼んだり、そこから呼ばれたりすることができる。Cの標準の呼び出し規約を使うことを明示する修飾子である。コンパイラはそれぞれ、以下を出力する。@名前@Xのようにエンコードされる。Xにはコールスタック(以下単にスタック)に積まれる引数のバイト数が入る。下線付きで(__func__のように)あるいは標準的な大文字化を行ったりして加えるものである。C++の場合[編集]名前修飾を行う処理系のうち、C++コンパイラは最も広く用いられているが、最も標準化が進んでいないものである。最初のC++コンパイラはCソースコードへのトランスレータとして実装された。そのため、シンボルの名前はCの識別子の規則に従う必要があった。後にC++コンパイラ自身が機械語コードやアセンブラコードを出力するようになっても、計算機システムのリンカは総じてC++のシンボルをサポートせず、名前修飾が必要な状態が続いた。C++言語は、標準的な修飾規則を定めていない。そこで、コンパイラによって修飾規則が異なる。C++の修飾がかなり複雑になりうること(クラス、デフォルトの引数、変数のオーナー、演算子オーヴァーロードなどの情報を格納する)も加わり、異なるコンパイラのオブジェクトコードはリンクすることができないのが通常である。}この二つは異なった関数である。名前以外に全く関係がない。関数の名前の重複は許されないからである。そこで、C++コンパイラはシンボル名に型情報を加える。}ここで、g()は名前の重複問題がないのに修飾されていることに注意して欲しい。修飾は全てのシンボルに適用される。複雑な例[編集]もっと複雑な例を挙げる。実際に用いられている名前修飾を見てみよう。3.xは次のクラス例をどのように修飾するだろうか。修飾されたシンボルはそれぞれの識別子の下に表示されている。};}ここでの名前修飾スキームは比較的単純である。下線に大文字を続けたものはCおよびC++では予約語であることに注意されたい。従って、ユーザの識別子とぶつかることはない。ペアをつけて示す(「長さ」は次の識別子の長さ)。