C++ vs Java,C# 違い
なぜ、JavaやC#は、クロスプラットフォームで、移植性の高いプログラムが作成でき、C++は同じようにできないのか? 「なんとなく」から「じっくり」理解してみようと思います。
C++
コンパイラで生成されるオブジェクトコードのタイプに理由があります。C++の場合、コンパイラからのアウトプットは、CPUによって直接実行されるマシン語になり、特定のCPUやオペレーティングシステムに依存してしまいます。C++プログラムを異なるシステム上で動作させたい場合は、その環境に特化させるためにマシン語に再コンパイルする必要があり、様々な環境で動作するC++プログラムを作成するには、異なる実行バージョンのプログラムが必要になります。
java, C#
JavaやC#は、プログラムをpseudocode(擬似コード)・中間言語にコンパイルすることによって、移植性を実現します。Javaの場合、中間言語はバイトコード、C#では、MSIL(Microsoft Intermediate Language)と呼ばれます。このpseudocodeは、両者ともランタイムシステムよって実行されます。Javaでは、ランタイムシステムはJVM(Java Virtual Machine)、C#では、CLR(Common Language Runtime)。なので、Javaプログラムは、JVMが実行可能な環境であれば、C#プログラムは、CLRが実装された環境であれば動作します。
性能
JavaやC#のランタイムシステムは、プログラムとCPU間に位置するため、C++プログラムの実行内には存在しないオーバヘッドが存在してしまいます。そのため、一般的にC++プログラムがJavaやC#などの同じようなプログラムよりも高速に動作するのです。
それぞれの強み
JavaやC#は、オンライン環境に特化した開発に使用されています。C#は、同じくソフトウェアコンポーネントの作成を容易にするためにデザインされました。オンライン環境では様々なCPUやオペレーティングシステムに接続されるため、「クロスプラットフォームで移植性のあるプログラムを作成できる」、というのが広く使われている理由ではないでしょうか。
選び方
このことから、高性能なソフトウェアを作成したいのであればC++を、移植性の高いソフトウェアにはJavaやC#を、と言うことができます。どの言語がベストなのかというのは問題ではなく、どの言語が適したものであるかという考えが大事です。
ただ長く書いただけ。。。。のような
関連記事
-
C++の型には最小の範囲だけが明記されている理由
明確な範囲を指定しないことによって、C++は様々な環境のコンパイラに各々で最適化できるようにしています。これが、C++が高性能のソフトウェアを実現できる所以とも言われます。 「ANSI/ISO
-
ワイド文字 wchar_t
wchar_tリテラル(wchar_t literal)は、文字リテラル(char literal)と同じ方法で表現されるのか? 答えは、No。ワイド文字定数(wchar_t)は、文字Lが前に付
-
可変個数の引数リスト va_list (va_start/va_arg/va_end)
引数の数が固定ではなくいくつになるか分からない場合はvaマクロを使用すると便利です。 可変の数の引数をva_listに格納して、va_start、va_arg、va_endを使用して操作を行うという
-
C++ コードブロック
コードブロックを使用するとランタイムの非効率化を招くのか? 言い換えれば、{ and } プログラム実行時に、余計な時間がかかってしまうのか? 答えは、No。 コードブロックは、オーバヘッドを
-
OOP ⊂ C++
大規模なプログラムを管理するうえで、オブジェクト指向プログラミング(OOP)は、効果を発揮するというのが、一般的な考えですが、「オブジェクト指向は、他と比較して大きなオーバヘッドが存在しないのか??」
-
C++のいろんなデータ型
なぜ、C++には整数値や浮動小数点値に対して、様々な種類のデータ型が用意されているのでしょうか? 数値を表すのに全て同じ型にしないのでしょうか? 項目については、他の方のブログに譲るとして、
-
コンパイラ エラーと警告(メッセージ)
エラーメッセージに加えて、コンパイラは様々なタイプの警告メッセージを提供してくれます。エラーと警告の違いは何でしょうか? どのようなタイプの出力を参照すればいいのでしょうか? 致命的なシンタッス
- PREV
- ポップアップ・モーダル ウィンドウ プラグイン
- NEXT
- 画像ズーム プラグイン