Java開発者向けの「各プラットフォーム用の特定のJREの作成」とC ++向けの「各プラットフォーム用のC ++コンパイラの作成」の違いは何ですか?
Java開発者向けの「各プラットフォーム用の特定のJREの作成」とC ++向けの「各プラットフォーム用のC ++コンパイラの作成」の違いは何ですか?
回答:
Javaは一度実行するとコンパイルされます。C ++は、一度コンパイルすればどこでもコンパイルできます。
「プラットフォームごとに特定のJREを作成する」ことは、毎回行うことではありません。JREを新しいプラットフォームに移植することは、一度だけ行う必要があることです。このタスクは通常、プログラムやプラットフォームのコアメンテナー/開発者によって実行されます。JREを誰とどのように移植するかを決定する際には、多くの要因が関与する可能性があります。とりわけ、公開されているライセンスに依存します(Javaはオープンソースだと聞いているので、誰でもできると思います)。おかしな逸話、Steve JobsはMacでのJavaの移植の面倒を見たくないということについて大いに議論しました 1年ほど前ました。
ポイントは、JREをどのように、または誰が移植するかではなく、一度移植すると、すべてのJavaアプリケーションが理論的には新しいマシンで簡単に実行できるようになるという事実です。その意味で、JREは抽象レイヤーを形成し、マシンを完全に隠して、移植を容易にします。
しかし、現実は常にこのようにきれいではありません。移植性を「神話」と呼ぶほどには行きませんが、完全ではないのは事実です。たとえば、JavaにはJNI
、JREをバイパスしてネイティブ呼び出しを送信できるようにするパッケージがあり、Javaファンが「どこでも一度実行して書き込み」と呼んでいる完璧なシームレスな移植性を妨げています。
コメントで述べたように、移植性に対するC ++のアプローチは異なります。一方で、それはコンパイルされた言語であり、それらのバイナリはほとんど常にプラットフォーム固有です。そのため、C ++実行可能ファイルは移植できません(Javaと異なります)。一方、コンパイラの移植で十分な場合もあります。コミュニティは、コンパイラと言語のいくつかのコアライブラリを移植することにより、ソースコード(バイナリではなく)を移植できることを発見しました。
ただし、C ++は、コンパイラ、カーネル、リアルタイムシステム、組み込みシステムなどの重要なシステムで広く使用されています。
それは単なる言語ではなく、ライブラリです。
JavaとC ++の両方がクロスプラットフォームライブラリを提供します。Javaはより豊富なセットを提供します。
「違いは...」で始まるすべての答え、または非常に似ているものはすべて基本的に間違っています(ごめんなさい、しかしそれは人生です)。実際には、2つの間に2つの異なる違いがあります。
1つ(多く言及されています)は、コンパイルされたJavaプログラムはJavaの準拠実装で実行できる(または最低限すべき)ため、コンパイルされた後でも、再コンパイルせずに1つのプラットフォームから別のプラットフォームにJavaプログラムを移動できます。C ++(少なくとも通常)では、ターゲットプラットフォームごとに再コンパイルが必要です。
もう1つは、正しく記述されたすべてのJavaが移植可能であることをJavaが保証する(少なくとも試行する)ということです。少なくとも理論的には、移植性のないコードを書くことはできません。
C ++では、移植性のない非常に多くのことができます。C ++標準には、移植性のない多くの事項(たとえば、実装定義の動作または未定義の動作が発生することを伝える)に関する「警告」が含まれていますが、必ずしもそれらを実行しようとするわけではありません。たとえば、PCIバスを使用するハードウェア用のオペレーティングシステムを作成する場合は、おそらくPCI構成メモリの読み取り/書き込みが必要になります。これは明らかに、PCIバスのないシステムには移植できませんが、PCIバスのあるハードウェア用のオペレーティングシステムを作成する場合は、ほとんど必要です。C ++は、明らかにポータブルではない場合でも許可します。
前提を誤解しています。JVMは、同じことが保証された標準の動作を提供するため、Java プログラムは非常に移植性があります。C ++プログラムは、実際のハードウェアにより近い標準化されていない環境を持っているため、プログラムは、intのサイズ、ワードアラインメントなど、さまざまなプラットフォーム固有の詳細を処理できる必要があります。
JVM自体はあまり移植性がありません。高性能のJVMを別のプラットフォームまたはCPUアーキテクチャに移植することは非常に困難な作業です。
違いは、Java(略語ではない)プログラムは、JVMがインストールされた任意のコンピューターで実行できる形式で配布できることですが、C ++は通常、ソースコードとして配布されます。異なるプラットフォーム用の異なるバイナリの。
Javaが移植性があると見なされる理由の1つは、算術式を評価する方法に関する特定のルールがあり、実装を他の方法で評価することを禁止していることです。ファッション。
たとえば、与えられた
long thing1(int x) {
return (x+1)-1L;
}
double thing2(int x, float y) {
return x/y;
}
thing1(2147483647)
およびの値はthing2(1123456700,11234567.0f)
、算術的に正しい値が2147483647Lおよび100.0であり、一部のプラットフォームでは数値的に不正確な結果を生成するコードが正しい生成コードよりも遅い場合でも、それぞれ-2147483649Lおよび99.9999923706054688である必要があります結果(一部の64ビットプラットフォームでは、(x + 1)の後にラッピング動作を強制するには追加の命令が必要になり、8x87プラットフォームでは1123456700の値を強制的に丸めるにはfloat
単純なロードと比較して追加の命令が必要になります)拡張精度レジスタに直接)。
(int)
、最初の例の最初の例の(x+1)
部分式float
、2番目の例のx
パラメータへのキャストを狭めることなく、どちらの例もJavaの値を返しませんでしたが、明らかに言語を設計しませんでした。
サポートツールの作業量は実際に似ていますが、違いは他の場所にあります。プラットフォーム用にC ++プログラムをコンパイルしたら、別のプラットフォームで使用する場合は、再度コンパイルする必要があります。ただし、Javaプログラムがコンパイルされたら、再コンパイルすることなく、ランタイム環境を備えた他のプラットフォームに移動できます。
「移植性は神話ですか?」というタイトルに答えると、「移植性、JavaまたはC ++のどちらが優れているか」ではなく、部分的な移植性は可能ですが、完全な移植性は神話になります。
私が書くことを主張し、この質問に当てはまることは、開発者はもはやプログラミング言語だけでなく、完全なプログラミングフレームワークで作業しているということです。
これらのフレームワークには、ライブラリ、データベース、グラフィカルインターフェイスが含まれます。
どのプログラミング言語、またはどのプログラミングフレームワークがより移植性がありますか?
まあ、それはあなたのアプリに依存します。達成しようとしています。
事は「あなたは」あなたが上で動作するJavaコードの書き込みJREを書かないで任意の JREを。「あなたは」C ++コードを書くのですか可能で、変更を必要とします、それは別のプラットフォーム上でコンパイルする前に。
多くの人々は、「100%ポータブル」またはそのようなフレーズを言うとき、Javaの現実を忘れるか、考慮しません。
ほぼすべての主要な企業/ソフトウェアハウスには、過去に少なくとも1つの自家製Javaの実装があり、最近JREが関連付けられており、一部はまだそれを維持しています。たとえば、Microsoft、IBM、Appleなどはすべて、業界やそのような言語がどこに行くべきかについての自分の考えや考え
「ポータブル」はどうですか?あなたが向けるどこでもJRE。
これは、Sun / Oracleが何をしていたかを考慮していません。
移植性の点でJavaコードがCとC ++からそれほど遠くない理由の例は、GUIとグラフィカルサーバーです。Appleは独自のJREのGUIフレームワークの非標準の実装を持っていました。その結果、 Appleマシン用のJavaを使用してGUIを作成/移植したい人には頭痛と二重の働きがあり、基本的にQuartzに対処せざるを得ませんでした(「レバレッジ」と高レベル言語の点ではどうですか)。
時々、最も一般的に使用される単語でさえ、人々が通常与える意味を実際に反映していないことがあります。Javaの世界での「移植性」という用語は、常識では「展望」に似ています。(少なくともJavaが生まれた時点で)他の言語ではなくJavaを採用する場合、商業的および財務的な面でより良い見通しがあります。 「コンピューター」と見なすことができます)、コードベースはそのまま移植できる可能性が高いため、プログラムを移植するために必要なリソースが少なくなります。つまり、リソースがお金、時間、または人的資源であっても、他のテクノロジーと比較したしきい値であり、それがJavaの目的であり、そのしきい値を下げています。
もちろん、Javaの前提を受け入れる場合、つまり、ガベージコレクションを備えた仮想マシン、つまりネイティブ言語と比較してより多くのリソースを消費すること、つまりCPUまたはサーバーファームから最大限の圧縮を行いたい場合、リソースが本当に不足しているか、会社が本当に小規模でない限り、Javaを採用できるとは思わないでください。
コードや機能の行ごとに1つのバージョンのみを含む単一の非自明なJavaアプリケーションを見つける必要があり(プラットフォーム固有のものもありません)、すべての主要なJRE間で100%移植可能です。