2011-06-22 20 views
5

なぜActionscript、Java、C#などを中間コードにコンパイルするのですか? 私は、中間コードを使用することのクロスプラットフォームの利点を認識しています。なぜ中間コードにコンパイルするのですか?

質問:中間コードにコンパイルする利点は、解釈されるスクリプト(JS、Python、PHP、Perlなど)と比べて何ですか?

コードの難読化のためだけですか?または何?

さらに、ネイティブコードにコンパイルする利点と比べて何が利点ですか?

+6

難読化されていません。わずかですが – SLaks

答えて

6

最初に携帯電話を対象とし、非常に限られたCPU /メモリとデバイスに埋め込まれたような異なる言語間の相互運用性を解決し、そしてそのようにJVM現代のJITのように集中的な最適化を行うことはできません。そこで、Javaのエンジニアは最適化をフェーズのコンパイルに移すことにしました。

次に、「バイトコード」/ ILを使用すると、さまざまな言語のコンパイラをそのようなバイトコードに多く含めることができます.JVM/JITは1つだけです。言語ごとに別々のVM + JITを作成する方がはるかに効率的です。 JVMの世界ではJava、JRuby、JPython、Groovyなどがあり、.NETの世界ではC#、VB#、ASP.NET、F#などがあり、それぞれには1つのランタイム/ VMしかありません。

+1

ASP.NETはプログラミング言語ではなくプラットフォームです。 –

+0

OK、いくつかの名前を悪用した可能性があります - .NETは私の専門ではありません:) – BegemoT

12

Javaや特にC#(より多くの機能を備えている)のような高水準言語を解析するよりも、ILコードを解析してJITコンパイルする方がはるかに高速です。

また、開発者は、エンドユーザーのコンピュータで何も更新せずに、新しい言語機能を使用することができます。 (LINQBridgeなど)

1

中間コードは、制限された命令セットが含まれている点でアセンブリと非常によく似ています。ランタイムは、言語の解析などを心配することなく、この(多少の)小さな命令セットで確実かつ一貫して動作することができます。したがって、パフォーマンスの向上と最適化が可能です。 MSILへの.NETコンパイルで

1

は、C#、VB.NETなどすべての歴史のjavaの

1

バイナリコードの命令は非常に単純でアトミックなので、プログラミング文よりもはるかに優れています。

たとえば、z = a + b - (c * d)は、レジスタに4つの値をロードし、加算、乗算、減算して別のメモリ位置に書き込むことに変換する必要があります。だから私たちは、少なくともその行のために少なくとも8つの指示を持っています!

中間コードは、クロスプラットフォームの両方の世界の中で最高ですが、マシンコードが通常書かれている方法にも近いです。

1

SLaksの回答に加えて、ILにコンパイルすると、一般にインタープリター言語には存在しない言語間相互運用性が可能になります。

この利点は、新しい言語では大きな可能性があります。 Scalaは2003年以来唯一の存在であり、すでに大きな牽引力を得ています。一方、Rubyは1.5年前にRailsアプリケーションに使用されていることをはるかに超えていませんでした。これは少なくとも部分的にScalaはすべての既存のJavaコードとライブラリとのバイトコード互換性があるため、大きな利益をもたらします。そのコミュニティは言語そのものにほとんどの努力を集中でき、潜在的な採用者はScalaの使用を開始するために、特別な曲げを心配する必要があります(または、悪いことに、コードベース全体を置き換える)。 F#の話はほとんど同じですが、他の主要な管理環境についても同じです。

一方、Rubyは他の言語のコードとは非常に簡単には話せません。そのため、Ruby固有のライブラリやフレームワークを開発するには多くの努力を払わなければなりません。それを使用するために大規模なプラットフォームのシフトにコミットする。

+0

JRuby(Ruby on the JVM)はどうですか? – Jesper

関連する問題