以下のようなJava以外の多くの言語ので、JVMがサポートGroovy,Clojure,Scala
するJavaとは異なり、関数型言語ですなど(私が言及していますバージョン8以前のJavaLambda's
それほど多彩な機能capabilities.OnにJVMを作るもの高いレベルをサポートしていませんサポートされていません)オブジェクト指向言語と関数型言語の両方をサポートできますか?
以下のようなJava以外の多くの言語ので、JVMがサポートGroovy,Clojure,Scala
するJavaとは異なり、関数型言語ですなど(私が言及していますバージョン8以前のJavaLambda's
それほど多彩な機能capabilities.OnにJVMを作るもの高いレベルをサポートしていませんサポートされていません)オブジェクト指向言語と関数型言語の両方をサポートできますか?
回答:
他のVMと比較して、JVMは実際には特に汎用性がありません。静的に型指定されたオブジェクト指向を直接サポートします。他のすべてについては、使用できる部分と、それらの部分の上に言語が必要とする他のすべてを構築する方法を確認する必要があります。
たとえば、Java 7がinvokedynamic
バイトコードを導入するまで、JVMに動的に型指定されたOO言語を実装することは非常に困難でした。パフォーマンスに悪影響を及ぼし、スタックトレースがひどく肥大化する複雑な回避策を使用する必要がありました。
それでも、それ以前のJVMには多数の動的言語(Groovy、Jython、JRubyなど)が実装されていました。
JVMが非常に用途が広いからではなく、非常に広く普及しているため、そして非常に成熟し、十分にサポートされ、高性能な実装を備えているためです。
そして、おそらくもっと重要なことは、そこには非常に多くのJavaコードがあり、ほとんど何でもしていることです。また、言語がJVMで実行される場合、そのコードと統合する機能を簡単に提供できます。基本的に、JVMで言語を実行することは、Cとの相互運用性を提供する21世紀のバージョンです。
JVMは基本的にCPUのように動作するように記述されており、VMが実行するバイトコードと呼ばれる一連の命令(アセンブリのようなもの)があります。有効なバイトコードのセットを生成するコンパイラを作成できる場合、JVMはそれらを実行できます。
ウィキペディアには、バイトコードのリストがあります。
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
JVMがどのようにバイトコードをロードするかの説明と同様に:
http://en.wikipedia.org/wiki/Java_virtual_machine
呼び出しスタイルのバイトコードを使用することにより、ソースがどのように見えるかに関係なく、関数型言語はコードを実行できます。また、invokevirtualの追加により、jrubyのような言語実装は、実行方法にある程度の柔軟性を与えています。
JVMは、明確に定義されたかなり適切なメモリモデル(JMM)をサポートすることを追加します。これは、一貫した(低レベルではあるが)スレッド化動作の良好なサポートを意味します。また、強力なJust In Timeコンパイラーもあります(MethodHandlesとinvokedynamicのおかげで、動的言語にはあまり役立ちません)。
最後になりましたが、JVMのGarbage Collectionサブシステムは(適切なチューニングを行って)上位の言語に関係なくメモリを管理します。
someField = new int[]{42};
が、新しい配列を見るスレッドが値を見るようにする唯一の方法のようなステートメントを与えられました42は、いずれかのフィールドを作るためにありますfinal
かvolatile
。フィールドを遅延生成したが、それは作り、頻繁にアクセスされている場合はfinal
動作しません、そして作りそれはvolatile
、それがアクセスされるたびに不要な同期ペナルティを課すことができます。最も緩い.NETモデルでも
これの重要な要素は、コンパイルを実行フェーズから分離することです。これにより、他の言語をコンパイルする他のコンパイラをバイトコードに書き込むことができます。
バイトコードはCPUのマシンコードと同様に機能します-プログラムを実行するために必要な小さな操作がすべてあります-変数の取得、計算、条件付き操作などができます。
Javaも特別ではありません。Javaでは、他のVMとは異なり、複数の言語の存在は設計目標でもありませんでした。以下のためにマイクロソフトの.NET CIL(C#、VB.Net、...)複数の言語を実行する能力も、重要な設計要素だったParrotVMは、一般的なVMであることを目的としたPerl6のプロジェクトから。
面白くするために、PHPのZend Engineでもそれが可能になるという証拠を作成しました。
そして率直に言って、これは新しいものではありません-実際のハードウェア上でも、複数の言語(CやFortranなど)を実行できます。
コンパイルと実行からのこの分離の違いは、Basic、シェルスクリプトなどの一部の形式のような古典的なインタープリターです。多くの場合、コードをすぐに実行せずに行ごとに実行するように動作します。間に。
JVMは、ガベージコレクション、パフォーマンス、および実行可能なサンドボックスモデルを組み合わせた最初の仮想マシンです。JVMをサポートするための多くの言語の出現は、おそらくその「汎用性」の結果ではなく、Java言語にはプログラミング言語に必要な重要な機能が欠けているためです。たとえば、ほとんどの機械語はデータ型が半ダースほどしかありませんが(バイト、ハーフワード、ワード、ダブルワード、単精度浮動小数点数、倍精度浮動小数点数など)、ほとんどのプログラミング言語ではコードを使用できます任意の数のユーザー定義データ型。JVMは、典型的なマシンのものと同様のいくつかのプリミティブ型に加えて、もう1つの型、無差別オブジェクト参照を認識します。Java言語も同様にこれらのプリミティブを認識しますが、無差別オブジェクト参照。変数は、特定のクラスではないものへの参照を保持しないように制限されている場合がありますが、言語では、次の種類のフィールドの種類を区別しません。List<String>
インスタンスMyThing
クラスによって保持される可能性がありますMyClass
。
コードへの参照は、不変の実装であることがわかっています List<String>
変化する可能性のあるものに決してさらされない、変更可能なリスト型のインスタンスへの参照。
MyThings
のメソッドの実行中を除き、ユニバースのどこにも他の参照が存在しない可能性がある可変リストへの参照。
他のオブジェクトが所有する可変リストへの参照。他のオブジェクトはMyThing
何らかの方法で使用したいものです。
MyThing
所有しているが、他のオブジェクトに公開されているため、彼らが何かを行うことができる可変リストへの参照。
これらのフィールドはすべてtypeを持つことができますがList<String>
、非常に異なるものを保持しています。表現力豊かな言語では、これらの意味を区別できますが、Javaではできません。言語はそのようなものに意味を付け(少なくとも一般的なコンテキストの外で)、JVMで実行できるため、JVMターゲット言語がJavaができない概念を表現する余地を残しています。