Java開発者向け)の「プラットフォームごとに特定のJREを作成する」と、C++向けの「プラットフォームごとにC++コンパイラを作成する」の違いは何ですか?
Javaはどこかで実行されるとコンパイルされます。 C++は、一度コンパイルするとどこにでも記述できます。
「プラットフォームごとに特定のJREを作成する」ことは、常に行うことではありません。 JREを新しいプラットフォームに移植することは、1回だけ実行する必要があります。このタスクは通常、プログラムのコアメンテナ/開発者やプラットフォームによって行われます。 JREを誰がどのように移植するかを決定する際には、多くの要因が関係する可能性があります。特に、それはそれが公開されているライセンスに依存します(Javaはオープンソースなので、誰でもそれを実行できると思います)。面白い逸話、 Steve Jobsは、 1年ほど前のJava のポーティングを処理したくないことについて対処します。
重要なのは、JREをどのようにまたは誰が移植するかではなく、移植すると、すべてのJavaアプリケーションが理論上、新しいマシンで簡単に実行できるはずです。その意味で、JREは抽象化レイヤー。マシンを完全に隠蔽し、移植を容易にします。
しかし、現実は必ずしもこのようにきれいであるとは限りません。ポータビリティを「神話」と呼ぶことはしませんが、完全ではないのは事実です。たとえば、JavaにはJNI
というパッケージがあり、JREをバイパスしてネイティブコールを送信できるため、完全なシームレスな移植性を妨げています。Java =ファンは「どこでも一度書いてください」と呼びたい。
コメントで述べたように、移植性に対するC++のアプローチは異なります。一方で、それはコンパイルされた言語であり、それらのバイナリはほとんど常にプラットフォーム固有です。したがって、c ++実行可能ファイルは(Javaとは異なり)移植性がありません。一方、コンパイラの移植で十分な場合もあります。コミュニティは、コンパイラと言語のいくつかのコアライブラリを移植することにより、ソースコード(バイナリではなく)を移植できることを発見しました。
ただし、C++は、コンパイラ、カーネル、リアルタイムシステム、組み込みシステムなどの重要なシステムで広く使用されています...移植性について話すとき、見落とすことができないC++の「低レベル」の側面があります。
言語だけでなく、ライブラリでもあります。
JavaとC++の両方がクロスプラットフォームライブラリを提供します。Javaはより豊富なセットを提供します。
違いは、Javaは任意のプラットフォームで実行されますなし再コンパイルです。各プラットフォームにC++コンパイラを使用することは、まったく同じではありません。
「違いは...」で始まるすべての答え、または非常に類似したものはすべて基本的に間違っています(申し訳ありませんが、それは人生です)。 2つの間に実際には2つの異なる違いがあります。
1つは(多く言及されています)、コンパイルされたJavaプログラムは、Javaの準拠実装で実行できる(または少なくとも実行する必要がある)ため、コンパイルした後でもJavaプログラムを再コンパイルせずにプラットフォームを別のプラットフォームに。 C++(少なくとも通常は)では、ターゲットプラットフォームごとに再コンパイルが必要です。
もう1つは、Java(少なくとも試行して)が正しく記述されたJavaがすべて移植可能であることを保証することです。少なくとも理論的には、移植性のないコードを書くことはできません。
C++では、移植性のない多くのことを実行できます。 C++標準には、移植できない多くのことに関する「警告」が含まれています(たとえば、実装で定義された動作または未定義の動作を取得することを通知します)が、必ずしもそれらを実行するのを止めようとするわけではありません。 。たとえば、PCIバスを使用するハードウェア用のオペレーティングシステムを作成する場合は、PCI構成メモリの読み取り/書き込みが必要になる可能性があります。これは明らかにPCIバスのないシステムには移植できませんが、PCIバスを備えたハードウェア用のオペレーティングシステムを作成している場合は、かなり必要です。 C++では、移植性がないことは明らかですが、それを許可しています。
敷地を誤解しています。 Java プログラムは、JVMが同じであることが保証された標準動作を提供するため、非常に移植性があります。C++プログラムは、実際のハードウェアに近い標準化された環境ではありません。プログラムは、さまざまなプラットフォーム固有の詳細(intのサイズ、Wordの配置など)を処理できる必要があります。
JVM自体はあまり移植性がありません。高性能のJVMを別のプラットフォームまたはCPUアーキテクチャに移植するのは非常に困難な作業です。
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
に丸めるには、単純に拡張精度レジスタに直接ロードする場合と比較して、追加の命令が必要になります。
違いは、Java(頭字語ではない)プログラムは、JVMがインストールされている任意のコンピューターで実行できる形式で配布できることですが、C++は通常、どちらかのソースコードとして配布されます。非常にユーザーフレンドリーではない、または異なるプラットフォームの異なるバイナリの束として。
「移植性は神話ですか?」というタイトルに答えると、「どちらが移植性に優れているかJavaまたはC++ "」ではなく、部分的な移植性は可能ですが、完全な移植性があります。神話。
私が書くことを主張し、それがこの質問に当てはまることは、開発者はもはやプログラミング言語だけでなく、完全なプログラミングフレームワークで作業しているということです。
そして、それらのフレームワークには、ライブラリ、データベース、グラフィカルインターフェースが含まれます。
どのプログラミング言語、またはどのプログラミングフレームワークの方が移植性が高いですか?
まあ、それはあなたのアプリが何であるかに依存します。達成しようとしています。
事は「あなた」が書くJREを書かないJava実行するコードany JRE。「あなた」はC++コードを書く- can別のプラットフォームでコンパイルする前に、yoによる変更が必要です。
支援ツールの作業量は確かに似ており、違いは他の場所にあります。 C++プログラムをプラットフォーム用にコンパイルしたら、別のプラットフォームで使用する場合は、再度コンパイルする必要があります。ただし、Javaプログラムがコンパイルされている場合、プログラムを再コンパイルすることなく、ランタイム環境を備えた他のプラットフォームに移動できます。
多くの人々は、「それは100%ポータブルである」と言ったり、そのようなフレーズを言ったりするときに、Javaの現実を忘れるか、または考慮に入れません。
ほぼすべての主要な企業/ソフトウェア会社が、少なくとも1つのJavaの自家製実装を最近の関連するJREと一緒に使用しており、Microsoft、IBM、およびAppleたとえば、すべてに独自のバージョンのJavaがあり、業界やそのような言語の方向性についての独自のアイデアや考えを反映しています。
「ポータブル」はどうですか?どこでもJRE。
そして、これはSun/Oracleが何をしていたかを考慮せずにです。
移植性の点でJavaコードがCおよびC++からそれほど遠くない理由の例は、GUIとグラフィカルサーバーです。Appleには、非標準のGUIフレームワークの実装がありました。独自のJRE。その結果、Javaを使用してAppleマシンを使用してGUIを作成/移植したいという人には、多くの頭痛と二重の作業があり、基本的に対処する必要がありました。クォーツ(「レバレッジ」と高級言語の観点からはどうですか?).
最も一般的に使用される単語でさえ、人々が通常それらに与える意味を実際に反映していないことがあります。私にとって、Javaの世界における「移植性」という用語は、常識的には「Outlook」に似ています。商業的および経済的条件では、他の言語よりもJavaを採用した方が(-Javaが生まれたときに)、より良いOutlookが得られます。片側ですでに多くの作業が行われており(「コンピューター」と見なすことができるあらゆるものでJREを取得します)、コードベースはそのまま移植できる可能性が高いため、プログラムを移植するために必要なリソースが少なくて済みます。つまり、リソースがお金、時間、人員のいずれであっても、他のテクノロジーと比較して低いしきい値であり、それがJavaの目的であり、そのしきい値を低くしています。
もちろん、これはガベージコレクションを備えた仮想マシンを意味するJavaの前提を受け入れた場合にも当てはまります。つまり、CPUまたはサーバーファームから最大限を絞り出したい場合は、ネイティブ言語と比較してより多くのリソースを消費します。リソースが非常に少ないか、会社が非常に小さい場合を除き、Javaを採用できるとは思わないでください。
それでも、コードまたは機能の行ごとに1つのバージョンしか含まない(つまり、プラットフォーム固有のものがない)1つの重要なJavaアプリケーションを見つける必要があり、すべての主要なJRE間で100%移植可能です。