C++/CLI コンパイラがどのように機能するかを知りたいのですが、C++/CLI で 1 つの単純なコードの 5 つのツリー ダンプを生成します。
この単純なコード (純粋で安全な CLR) で生成する 3 つのツリー ダンプ:
using namespace System;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
return 0;
}
しかし、' printf ' を使用してコードをコンパイルすると、CLR と PURE のコード生成では次の命令が使用されます。
|___[STM] printf : vararg int32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)(int8 modopt([mscorlib]System.Runtime.CompilerServices.IsSignUnspecifiedByte) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)*)
IL コードは次のとおりです。
//000008: printf("Ola mundo\n");
IL_000a: /* 7F | (04)000001 */ ldsflda valuetype '<CppImplementationDetails>'.$ArrayType$$$BY0L@$$CBD/*02000002*/ modopt([mscorlib/*23000001*/]System.Runtime.CompilerServices.IsConst/*01000002*/) '?A0x1af50272.unnamed-global-0' /* 04000001 */
IL_000f: /* 28 | (0A)000004 */ call vararg int32 modopt([mscorlib/*23000001*/]System.Runtime.CompilerServices.CallConvCdecl/*01000001*/) printf(int8 modopt([mscorlib/*23000001*/]System.Runtime.CompilerServices.IsSignUnspecifiedByte/*01000006*/) modopt([mscorlib/*23000001*/]System.Runtime.CompilerServices.IsConst/*01000002*/)*) /* 0A000004 */
IL_0014: /* 26 | */ pop
したがって、このスタイルで 1 つのコンパイラを開発しようとして、NetGnu の pnetC という 1 つのコンパイラを見つけました。このコンパイルでは、C ネイティブ コードと MSIL が混在していますが、コンパイラはすべての .h ファイルで 1 つの dll を使用します...
では、このコンパイラスタイルのテクニック情報が欲しいのですが、どうすればこの混合コードを生成できますか?
つまり、基本的には、これに関するアイデアと、これに関する技術情報が必要です...
ありがとうアレクサンドル