私が理解している限り、ScalaとClojureはどちらも新しい言語として設計されています。
Java 8以降(おそらく、Javaの後続バージョンではさらに強力になる)、Java言語のセマンティクスが変更されます。
これらの変更がJavaとScala/Clojure間の相互運用性にどのように影響するか、そしてその結果はどうなるかを尋ねたかった。たとえば、Java 8のラムダはオブジェクトではないため(例 here を参照)、ScalaとClojureはオブジェクトではないJava値を処理する必要がある場合があります。 。これは問題でしょうか?
次のシナリオが考えられます。
要約すると、Javaの今後の開発は、ScalaやClojureなどの言語に影響を与え、Javaとの相互運用性を維持できると期待できますか?このトピックに関する進行中のディスカッション(リンク)はすでにありますか?
注
Scala、Clojure、およびその他のJVMベースの言語では、実装を新しいバージョンのJVMに更新する際に大きな問題は発生しないと想像できます(新しいJVM機能により、この実装がさらに簡単になります)。私の質問は、言語としてのJavaの機能、および他のJVM言語がこれらの新機能を「参照」/使用できるかどうかに焦点を当てており、JVMベースの言語が最新のJVMで実行されるかどうかには関係ありません。
実際にJava 8は、Javaと相互運用する他のJVM言語にとって有害なものをあまり導入していません。Lambdasで行われた作業は、invokedynamic、MethodHandles、MethodReferencesなどに関する多くの小さな問題の修正に役立ちました-とはいえ、他のJVM言語が呼び出しを行う可能性のあるまったく新しいAPIがいくつかあります。デフォルトで使用するかどうかは、API次第です。
相互運用に影響を与える最大の変更は、実際にはJava 7-JVM内で動的/遅延バインディング呼び出しを可能にするinvokedynamicバイトコードを使用して行われたものです-最初はJVMの他の言語用に設計されたものです。それはJava 8以降、Javaは実際にこれらのバイトコードの出力を開始します。
一部の言語(JRubyなど)はすでにinvokedynamicを頻繁に使用していますが、他の言語(Scala、Groovyなど)はまだその使用を調査しているか、パッチの初期段階にあります。理論的には、動的呼び出しは既存のものとほぼ同じように機能しますJava invokestatic呼び出し。過去に無理やり使用せざるを得なかった無数の遅い回避策とは対照的です。
Java 9は、JVMの従来のクラスロードとクラスパスの終わりの始まりとなるプロジェクトジグソーがプラットフォームに登場することで、JVM言語の課題をさらに増やします。 JVM言語の人々はこれをかなり認識しており、私はいくつかの賢明なコラボレーションが行われることを期待しています。
Javaラムダには、使用されているコンテキストに従って型が割り当てられますが、Javaラムダには、そのアリティに基づいて型が割り当てられるため、ScalaはScalaがラムダを追加するときに取り残されます、パラメータの型と戻り値の型。たとえば、
executor.execute(() -> { System.out.println("hello world"); });
Java 8はScalaで次のように記述できます。
executor execute new Runnable {
override def run() { println("hello world") }
}
scalaの()=> UnitをRunnableに変換するラッパーを使用/記述しない限り。