0

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 を使用します...

では、このコンパイラスタイルのテクニック情報が欲しいのですが、どうすればこの混合コードを生成できますか?

つまり、基本的には、これに関するアイデアと、これに関する技術情報が必要です...

ありがとうアレクサンドル

4

0 に答える 0