MPS Java との互換性
構成
環境設定ウィンドウの Java コンパイラー構成タブには、プロジェクトのバイトコードバージョンという 1 つの設定しかありません。
この設定は、MPS によってコンパイルされたすべての Java クラスのバイトコードバージョンを定義します。これらのクラスには、言語の側面から生成されたクラス、ランタイムソリューションのクラス、サンドボックスソリューションのクラスなどがあります。
デフォルトでは、バイトコードのバージョンは JDK Default に設定されています。これは、コンパイルされたクラスのバージョンが、MPS が実行されている Java のバージョンと同じになることを意味します。例: JDK 17 で MPS を実行し、JDK デフォルトが選択されている場合、バイトコードバージョンは 17 になります。
各モジュールは、Java タブのモジュールプロパティで Java レベルを指定できます。このようにして、選択した言語レベルの機能のみがそのモジュールの BaseLanguage コードで有効になります。
ビルドスクリプト
また、プロジェクトのビルドスクリプトで java 準拠レベルを設定することを忘れないでください。プロジェクトのバイトコードバージョンと同じでなければなりません。
JDK 1.8 でコンパイルされた java クラスを使用する
MPS モジュールプールには、実行中の Java のクラスを保持する JDK ソリューションがあります。そのため、JDK 1.8 で MPS を起動すると、JDK ソリューションで最新の Java プラットフォームクラスが利用可能になります。
JDK 1.8 でコンパイルされた外部 Java クラスを Java スタブとして追加して使用することもできます。
デフォルトのインターフェースメソッド
Java 8 ではデフォルトのメソッドも導入されました。これらはインターフェースに直接実装されたメソッドです。ここでデフォルトのメソッドについて読むことができます: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html(英語)
これらのメソッドは、通常のインスタンスメソッドとまったく同じように呼び出すことができます。ただし、クラスが実装しているインターフェースから直接デフォルトのメソッドを呼び出す必要がある場合があります。例: クラスが複数のインターフェースを実装していて、それぞれが同じシグネチャーを持つデフォルトのメソッドを含んでいるときに多重継承の場合。
その場合、foo() は、jetbrains.mps.baseLanguage.jdk8 言語に新しく配置された SuperInterfaceMethodCall 構造を介して、インターフェースの 1 つで明示的に呼び出すことができます。
jetbrains.mps.baseLanguage.jdk8 言語を使用すると、ユーザーは BaseLanguage インターフェースで 'default' メソッドを作成できます。
'default' キーワードは、BaseLanguage の修飾 子の概念を拡張する DefaultModifier の概念によって実装されます。
変換 / 代替メニュー + いくつかの居心地の良いインテンションも提供されています。
Java プラットフォーム API の使用
Java 8 はラムダ式を導入しました。詳細については、http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html(英語) を参照してください。
新しい JDK8 コレクション API との相互作用の例を次に示します。
forEach() 方法は java.lang.Iterable の新しいデフォルトの方法です。これは、パラメーターとしてコンシューマーインターフェースを取ります。 コンシューマーは、メソッドが 1 つしかないため、機能的なインターフェースです。Java 8 では、ラムダ式を forEach() に渡すことができます。MPS では、MPS クロージャーを渡すことができます。クロージャは、生成中に forEach() によって取得されるパラメーターの型を認識しており、コンシューマーの正しいインスタンスに対して正確に生成されます。
MPS クロージャはデフォルトで Java クラスに生成されますが、クロージャが 4 つの互換性ルールを満たしている場合、MPS はそれを Java ラムダ式に生成します。非互換性には、次の使用箇所が含まれます。
歩留まり操作
「機能的な」抽象クラス
アノテーション
親スコープと競合するローカル変数
この変更により、いくつかの問題が発生する可能性があります。
あいまいな呼び出し: MPS では検出されませんが、Java コンパイラーはラムダとして生成されたクロージャーに関するこのような問題を報告します。
Closure インスタンス: ラムダとして、クロージャは実行時に単一のインスタンスを作成します。これは、呼び出されるたびに新しいインスタンスを作成する匿名クラスとは対照的です(下のスクリーンショットを参照)。
関連ページ:
基本言語拡張スタイルガイド
基本言語は、MPS で群を抜いて最も広く拡張された言語です。典型的な MPS プロジェクトは、さまざまなソースまたは言語ベンダーからのさまざまな拡張機能を使用する可能性が非常に高いため、コミュニティは、すべての言語で統一されたスタイルを持つことで恩恵を受ける可能性があります。このドキュメントでは、作成者がすべての基本言語拡張機能に適用する必要がある規則について説明します。クイックリファレンス:. ドット [LeftBracket]RightBracket{LeftBrace}RightBrace=...
BaseLanguage の拡張機能用のジェネレーターを実装する
この記事では、LValue 式で動作する BaseLanguage 拡張機能のジェネレーターを記述する慣用的な方法を紹介します。BaseLanguage 式は、代入式の左側で使用できる場合、lvalue であると言います。このような式を導入する概念は、動作の側面でインスタンスメソッド Expression#isLValue() または静的メソッド Expression#lvalue() のいずれかをオーバーライドする必要があります。この調査は 2 つの独立した言語で構成されており、どちらも BaseLan...