2011-10-29 2 views
0

これまでにプログラミングしたのはC++です。なぜなら、C++が高速な理由はマシンコードと似ているからです。私はマシン/ C++コードのアーキテクチャが正確に何であるか、似ていることがより速くなること、そしてC#などの他のアーキテクチャと比較する方法に疑問を抱いています。C++アーキテクチャー:マシンアーキテクチャーとはどのように似ているのですか?

私はRAII、ヒープ、スタック、および構文を理解していますが、これはそれについてです。私は、コンピュータがCPU、RAM、およびハードドライブ以外のもので構成されていることを理解することさえできません。私はすぐにWP7のアプリケーション開発のためのC#をすぐに学ぶことを計画しているので、私はフードの下で何が起こっているの深い理解は、言語の違い/類似点を識別するのに役立ちますと仮定します。

ダイアグラムまたはトピックへの記事へのポインタが素晴らしいでしょう!

答えて

4

C++、C++を作成するものはではなく、は実際にどのマシンアーキテクチャにも似ています。それは似たCサブセットです。変数の代入、関数呼び出し、ループ、配列トラバーサル、および比較はすべて、高速のコア命令の小さなセットに対応する傾向があります。プリミティブや配列要素への代入は、現代のプロセッサでは一般的に単一の命令です:メモリからレジスタへ、またはその逆に値を移動する命令(たとえば、その逆)Cで長時間プログラミングしていた人々は、コンパイラが生成するマシンコード。重要なのは、 "あなたが見ているものはあなたが手に入れたもの"です。言語の指示は、多かれ少なかれ1対1の機械コードに直接変換されます。

一方、C#(またはJava、Ruby、Python、Perl、Haskell、Schemeなど)のような「上位レベル」の言語は、基本的なランタイムサポートシステムに多少の影響を与えます。いくつかの言語では、割り当てはテーブルで何かを最初に探すことを含むかもしれません。それは、データの種類に応じて、割り当てが単純なコピーであるか、それ以外の複雑なデータ操作であることを意味する場合があります。ステートメントがどのようにマシンコードに変換されるかを予測することはずっと難しいです。

C++は面白い中盤にあります:一部の割り当てはC assigmentsと同じです。他は実際にoperator=()へのオーバーロードされた呼び出しであり、あなたは何を得ようとしているのかは決して分かりません。(もちろん、勉強なしで)C++にはランタイムシステムがあります。 RubyやHaskellやSchemeよりもはるかに軽量です。

+0

私は同意しますが、私はもはやCはマシンに基づいており、マシンはCに基づいています。新しいプロセッサーはCベースの言語で最もうまく動作するように設計されています。これは、例えばGCCコンパイラでうまく動作するように設計された新しいマイクロコントローラで起こります。 –

1

「類似している」ということは決してありません。それはハードウェアの近くにあることです。 CとC++のどちらも、メモリ管理の細かい部分を隠すことはありません。アライメント、連続アクセス、スタックのような低レベルのことについて考える必要があるので、はるかに効率的なコードを書くことができます。より高いレベルの言語はこれらのことをあなたから隠します。これはより良いプログラミング体験をもたらしますが、しばしばコードがほぼ最適化されていないことがあります。

0

プログラミング言語の進化は、プログラミングの利便性が高いほど、パフォーマンスのトレードオフが大きくなることを示しています。ほとんどのプログラミングの初心者にとって、JavaはcやC++(メモリ管理、ヘッダーファイル、コンテナなど)よりもはるかにやさしいです。 CまたはC++は、マシンコードにコンパイルされているため直接的に実行して実行できるため、Javaよりも高速です。しかし、Javaの場合、Javaコードの実行時フレームワークであるJRE Java仮想マシン(これは小さなアセンブリでcによって書かれています)によってのみ理解されるいくつかのコードに変換されます.C#への.NetフレームワークはJREとJavaです。 このパフォーマンスの違いは、一部のパフォーマンス指向のビジネスでは大きな役割を果たしますが、ほとんどのアプリケーションではほとんど目に見えません。 うん、それは説明する!

関連する問題