web-dev-qa-db-ja.com

Cがコンパイル/解釈/ JITされるのを妨げる原因は何ですか?

Javaは、その驚くべき移植性でしばしば賞賛されています。これは、JVMが原因だと思います。私の質問は、Cがコンパイル/解釈/ JITされるのを止める理由です。もしそうなら、Cは一度だけ書いて、どんなデバイスでも動作するようにすることができます。しかし、これはCプログラムを処理するための一般的なメカニズムではありません。

このようにCを処理することの短所は何ですか?もちろん、移植性以外にJavaこのように処理し、マシンコードにコンパイルしないこと)の利点は何ですか?

9
SphericalCow

Cは私が中級言語と呼ぶものです。その目的は、「非常に高度なアセンブラー」として機能することです。そのため、コンパイラーのターゲットとしてうまく機能し、移植性を非常にうまく取り入れています。

従来、インタプリタは通常、メソッド呼び出しのコンテキストで高級言語で使用されてきました。最も単純な形式では、インタプリタはソース言語の各キーワードとそれに関連するトークンを単に解析し、それをメソッド呼び出しとパラメータに変換します。実際には、ほとんどのインタープリターが行うことは、ソース言語を中間表現に変換することであり、解釈されるのはその表現です。

Cが解釈またはジッターされるのを止めるのは何ですか? Nothing。 しかし、それはCの存在理由ではありません。

18
Robert Harvey

まず第一に、SunのJVMがCで記述されていることは注目に値します。移植性が必要な場合、Cは非常に人気のある言語です。

多くのCプログラムは移植可能ではありませんが、Clanguageは移植可能です。これは、Cがプログラマにそれほど多くの制限を課したり、多くの仮定を行ったりしないためです。 Cプログラマーが自分のプログラムを移植可能にしたい場合、彼は自分にそれらの制限を課さなければなりません。

実際には、これは制限を課すことよりもはるかに難しいことではありませんJava force to you。それはほとんどの場合、エンディアンとプリミティブサイズに注意し、-のような移植可能なライブラリを使用することの問題です。 GTK + プラットフォーム固有のライブラリの代わりに。

仮想マシンをサポートするGTK +ターゲットとCコンパイラ、さらにはJVMを作成し、既存のコードをほとんど変更せずに機能させることができます。実際、ガベージコレクションがなければ、C仮想マシンはおそらくはるかに単純になります。なぜあなたがしたいのですか?

ネイティブコードにJava=をコンパイルすると、その逆も同様に実行できます。これは基本的にJITが行うことです。しかし、なぜそうしたいのでしょうか?それを行うためのペットプロジェクトがあるはずです。なぜなら、」彼らは真剣に使用されていません。

6
Karl Bielefeldt

あなたが言った:

Javaは、その驚くべき移植性でしばしば賞賛されています。これは、JVMが原因だと思います。

そして、最初の文では、あなたは間違っています。 Javaは、JVMのため移植性がありません。Javaは移植性があります。Java言語は、それは、プログラムがどのように動作するかについて、実装者に余裕を残さない。

例として、Javaには「int」(符号付き32ビット整数)と「long」(符号付き64ビット整数)の2つのタイプがあります。CおよびC++は「int」(少なくとも16ビット符号付き) )、 "long"(少なくとも32ビットの符号付き)および "long long"(少なくとも64ビットの符号付き)です。これは、Cが多くの異なるプロセッサ上で実行され、それらの動作が異なるためです。

Cは、これらの型の固定サイズを定義することができます。もしそうなら、36ビットプロセッサはC言語を実装できなかったでしょう。そして、Javaを実際に実装することはできません。したがって、Cはその言語をさまざまな異なるコンピューターで使用できるようにしました。これにより、移植できないコードの作成が可能になることは避けられません。それは言語の問題です。

5
gnasher729

言語がJava仮想マシンをターゲットにしているため、Javaは非常に移植性が高く、これは名前が示すように実際のマシンではないです。仮想マシンを実装できるため、多くの異なるタイプの実際のマシンのアーキテクチャーでは、JVMベースのプログラムは非常に移植可能です。

一方、Cは完全なハードウェアアクセスを必要とするオペレーティングシステムを実装する特定の目的のために作成されたため、実際のハードウェアに対して実行するように特別に設計されています。これは、Cコードは特に移植性がない設計によるであり、Cプログラムをあるプラットフォームから別のプラットフォームに移植する場合、ターゲットアーキテクチャに固有のさまざまな部分をある程度書き換える必要があります。 。

4
Mason Wheeler

実際には Cの解釈されたバージョン がありますが、それらは主に、運用システムではなく迅速な実験に使用することを目的としています。

結局のところ、小さくて高速で静的な実行可能ファイルを取得しないと、なぜCのすべての特異性に悩まされるのでしょうか。

3
fortran

理論的には、CとJavaの両方をネイティブコードにコンパイル、解釈、または仮想マシンにコンパイルできます。

Cが仮想マシンにコンパイルされていない技術的な理由は、標準仮想Cマシンが存在しないことです。

そして、誰も仮想Cマシンを定義したり、Java仮想マシン(完全に可能)にコンパイルしたりすることさえ)したくないようです。おそらく、Cを使用する誰もその比類のない速度を失いたくないためです。また、Cはコンパイル(ソースの配布と再コンパイルと実行)によって移植性を簡単に実現できるオープンソースコミュニティで最も強力であるため、クローズドソースとしての実行(バイナリの配布と実行)の移植性の必要性を感じません。開発者が行います。

これは実際に行われます。 LLVMへのコンパイルをサポートする主要なコンパイラーがあります(clangはそうですが、gccも同様です)。 Java=コードがJITされたバイトコードにコンパイルされるのと同じように、そのLLVMをJITすることができます。

ただし、Cと比較してJava "クロスプラットフォーム"となるのは、Javaに多くのプラットフォームに移植された大きなランタイムライブラリがあることです。Cは明示的にこのパラダイムに従わないでください。

1
Cort Ammon

JavaとCの間にはいくつかの大きな違いがあります。Javaは、Java仮想マシン(JVM )。JVMはオペレーティングシステムをプログラムから抽象化します。JavaアプリケーションはJVMにメモリのチャンクを要求し、JVMはOSにそのメモリを要求します。多くのJVMがあります。異なるプラットフォーム/オペレーティングシステムの場合、JVMを使用すると、同じJavaプログラムを異なるプラットフォームで実行できます。

Cでは、OSの分離はありません。 Cプログラムは(通常)OSの上で直接実行され、直接OS呼び出しを行います。これにより、Cプログラムが特定のオペレーティングシステム/プラットフォームに関連付けられます。重要なプログラムは、オペレーティングシステムを呼び出します。さらに、Cプログラムは、ハードウェア固有のマシンコードにコンパイルされます。 x86用にコンパイルされたCプログラムは、ARMプロセッサ上で直接実行することはできません。

0
CurtisHx