C ++で“マネージド”に言語の変更が必要なのはなぜですか?

StackOverflow https://stackoverflow.com/questions/819425

質問

C ++コードで管理する必要があるものを管理する(つまり、「CLR互換」にする)コンパイラを作成できないのはなぜですか?

状況によっては void ポインターを禁止するなど、妥協点があるかもしれません。しかし、これらすべての追加キーワードなど。これらの追加によって解決しなければならない問題は何ですか?

いくつかの側面と解決が難しいものについては考えていますが、しっかりとした説明をいただければ幸いです!

役に立ちましたか?

解決

これまでの回答に同意する必要があります。

理解すべき主な問題は、C ++コンパイラが非常に馬鹿げた環境に適したコードを作成することです。現代のCPUでさえ、仮想関数については知らない、地獄、さらには関数はストレッチです。 CPUは、例えば、スタックを巻き戻すための例外処理コードが関数の外にあることを本当に気にしません。ジャンプとリターンを伴う命令シーケンスでのCPUの対処。 CPUに関する限り、関数には名前はありません。

したがって、関数の概念をサポートするために必要なものはすべて、コンパイラーによってそこに置かれます。例えば。 vtableは適切なサイズの配列であり、CPUの観点からは適切な値を持ちます。 __ func __ は、文字列テーブルのバイトシーケンスとして終了します。最後のバイトは00です。

今、ターゲット環境が愚かであると言うことは何もありません。間違いなくJVMをターゲットにすることができます。繰り返しますが、コンパイラはネイティブに提供されていないものを埋める必要があります。生メモリはありませんか?次に、大きなバイト配列を割り当てて、代わりに使用します。生のポインタはありませんか?そのビッグバイト配列に整数インデックスを使用するだけです。

主な問題は、C ++プログラムがホスティング環境からまったく認識できないように見えることです。 JVMは愚かではなく、関数については知っていますが、関数がクラスメンバーであることを期待しています。名前に< および> が含まれているとは想定していません。これを回避できますが、最終的には名前のマングリングになります。また、今日の名前のマングリングとは異なり、この種の名前のマングリングは、Cリンカー用ではなく、スマート環境用です。そのため、そのリフレクションエンジンは、メンバー関数 __ namespace_std__for_each__arguments_int_pointer_int_pointer_function_address を持つクラス c__plus__plus があると確信するかもしれませんが、それはまだ良い例です。イテレータを逆にする文字列の std :: map がある場合、どうなるか知りたくありません。

一般的に、他の方法は実際にははるかに簡単です。他の言語のほとんどすべての抽象化は、C ++でマッサージできます。ガベージコレクション?これは今日のC ++ですでに許可されているため、 void * でもサポートできます。

まだ対処していないことの1つは、パフォーマンスです。生メモリを大きなバイト配列でエミュレートしますか?特にダブルを入れた場合、それは速くなりません。あなたはそれを速くするためにたくさんのトリックをプレイすることができますが、どの価格で?あなたはおそらく商業的に実行可能な製品を手に入れるつもりはないでしょう。実際、C ++の最悪の部分(実装に依存する異常な動作の多く)とVMの最悪の部分(遅い)を組み合わせた言語になるかもしれません。

他のヒント

既存の正しいコード、つまりC ++標準に従って記述されたコードは、その動作を誤って変更してはなりません。

まあ、C ++ / CLIは、マネージドコードとアンマネージドコードの接着剤になることを主な目的としています。そのため、マンガのコンセプトと管理されていないコンセプトをミックスする能力が必要です。マネージドオブジェクトとアンマネージドオブジェクトを同じコードで割り当てることができる必要があるため、個別のキーワードを回避する方法はありません。

CLRをターゲットにしたネイティブC ++コードをコンパイルできないのはなぜですか?

はい、あなたはそれを正しく推測しました、あまりにも多くの妥協があり、それが役に立たないでしょう。 3つの例を挙げたいと思います...

1。)テンプレート:C ++はそれらをサポートしますが、CLRはサポートしません(ジェネリックは異なります)。 そのため、コードでSTLやブーストなどを使用できませんでした。

2。)多重継承:CLIではなくC ++でサポートされます。 istreamとostreamの両方を継承する標準のiostreamクラスと派生物(stringstream、fstreamなど)を使用することさえできませんでした。

そこにあるコードはほとんどコンパイルされず、標準ライブラリを実装することさえできませんでした。

3。)ガベージコレクション: ほとんどのC ++アプリは(スマートポインターなどを使用して)メモリを手動で管理し、CLRには自動メモリ管理があります。 したがって、C ++スタイルの「新規」は、および「削除」 " gcnew"との互換性がないため、既存のC ++コードはこの新しいコンパイラでは使用できません。

すべての重要な機能(標準ライブラリも含む)を根絶する必要があり、既存のコードがコンパイルされない場合は、何がポイントですか?

まず、「シンプルなC ++」との区別および「マネージC ++」 MC ++の目的の1つは、既存のC ++コードとCLRの間のブリッジを提供することであったため、意図的なものでした。

次に、CLRモデルに適合しないC ++機能が多すぎます。多重継承、テンプレート、ポインター演算...明確な線を引くことなく、プログラマーはコンパイル時と実行時の両方で不可解なエラーに直面する運命にあります。

これは、マネージコード機能をC ++に追加すると、C ++が遅くなり、コンパイラがより複雑になるためだと思います。 C ++がそもそも設計されたものを失うほどです。 C ++の優れた点の1つは、C ++が優れた言語であり、十分に低レベルでありながら移植性に優れていることです。そして、おそらくそれが、C ++標準委員会がその方法を維持するために計画していることです。とにかく、C ++を完全に「管理」できるとは思いません。C++で書かれたプログラムを実行するにはVMが必要だからです。その場合は、なぜC ++ / CLIを使用しないのですか?

Qtフレームワークはほとんどそれを行います。つまりスマートポインターがあり、それらが指すオブジェクトが破棄されると、自動的にnullに設定されます。 そして、moc(meta object compiler)によって解析された後も、ネイティブC ++です。

はい、C ++が管理対象になると思います。しかし、その場合、.NETはC ++向けに書き直される必要があり、BASICへの偏りはありません。同じ屋根の下に多くの言語があります。特定の機能を使用する必要があります。それはVB.NETまたはC ++。NETの間の選択であり、VB.NETが選択されました。おもしろいことは、C#はVB.NETよりも人気があるということです(私はどちらも使用していません!)。

.NET CLRでは、管理対象オブジェクトへの参照は、オブジェクトが固定されている間を除き、ランタイムが認識しない場所には存在できないことが必要です。良好なパフォーマンスを得るには、オブジェクトをできるだけ少なく固定する必要があります。 .NET CLRはC ++内で使用できるすべてのデータ構造を理解できないため、マネージオブジェクトへの参照がそのような構造に永続化されないことが不可欠です。 「通常」を使用することも可能です。 C ++コードは、C ++言語を変更せずに.NETコードと対話しますが、C ++コードがあらゆる種類の「参照」を保持できる唯一の方法は、 .NETオブジェクトに対しては、.NET側のコードで各オブジェクトに何らかのハンドルを割り当て、ハンドルに関連付けられたオブジェクトの静的テーブルを保持します。オブジェクトを操作したいC ++コードは、ハンドルで識別されたオブジェクトに対して何らかの操作を実行するように.NETラッパーに要求する必要があります。新しい構文を追加すると、.NETフレームワークが知る必要のあるオブジェクトの種類をコンパイラーが識別し、それらに必要な制限を適用できます。

最初に考慮することは c ++ を「高速」にするすべてのこと消えるだろう。 C ++の完全なガベージコレクションシステムはほとんど不可能です。 c ++ を使用すると、コード内のほぼどこにでもポインターを保持できるためです。 ランタイムタイプ情報は、直接組み込まれないとコストがかかります 言語システムそれ自身。 真のネイティブパフォーマンスを活用できます。 テンプレートが消えます。真のポインターは消えます。 メモリへの直接アクセスがなくなりました。

実施する必要のあるもののリスト

1. no direct pointers(pointers will get replace with complex refernces)
2. templates (generics pay for preformance)
3. simple c-style arrays (will get wrapped with array structures)
4. programmer no longer has control of whether data is on the stack or
the heap.
5. garbage collection will be enforced(this will cause the most changes to the syntax)
6. runtime type data will get added extensively to the code.
(larger code size)
7.  inlining will become more difficult for the compiler
(no more inline key word)
8. no more inline assembly.
9. the new langauge by now will become incompatible c code.(unless you go through hoops) 

5hammerに同意します! Javaやその他のマネージド言語を無意味なものにした場合、コンピューターを完全に制御し、メモリにアクセスして自分でメモリを管理し、コンピューターがコードを実行する方法を制御し、Cライブラリ(Luaなど)と統合します。 その柔軟性を失ったら、C ++をそのままにしてCにフォールバックし、Cも管理されるようになったら、アセンブラーに行きます。

マネージド言語は、ハードウェアへの直接アクセスのないサンドボックスのように束縛され、コンパイルされた言語よりもはるかに遅いため、すべてのゲームプラットフォーム/複雑なプログラムにとって最悪の言語です。

C ++の主な目的は常にパフォーマンスでした。大きなゲームに最適な言語の1つです。そして、この言語のパフォーマンスがなければ、多くのゲームは存在しません!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top