MPS 2020.3 ヘルプ

型システムのデバッグ

型システムをデバッグするために、MPS は型システムトレースを提供します - それは型システムエンジンの中で起こる評価プロセスへのインサイトをあなたに与える統合された視覚的なツールです。

自分で試してみる

型システムを簡単に試すことができるように、専用のサンプル言語を用意しました。MPS にバンドルされているサンプルプロジェクトを開きます。これは、ユーザーホームフォルダー内のサンプルプロジェクトの中で使用可能になります。

Tt11

サンプル言語

実験する言語は、いくつかの型、4 つの算術演算(+、-、*、/)、割り当て(: =)、2 種類の変数宣言、変数参照を備えた簡易式言語です。エディターは非常に基本的なもので、ほとんどカスタマイズされていません。そのため、式の編集はおそらくかなり荒いものになります。それでも、新しいコードを書くよりも既存のサンプルをインスペクションし、それらの型をデバッグすることを期待しているため、スムーズな編集の欠如は問題になりません。

Tt1

SimpleMathWrapper の概念のおかげで言語を Java に埋め込むことができますが、言語と BaseLanguage の間の相互作用は不可能です。

式言語は、2 つのブランチにサブタイプ規則によって編成された 6 つのタイプをサポートします。

  1. 要素 -> 数値 -> フロート -> 長い -> Int

  2. 要素 -> ブール

型を調べる

Simple サンプルクラスを開くと、式の任意の部分にカーソルを置くか、有効な式ブロックを選択できます。Control + Shift + P を押すとすぐに、ポップアップダイアログに選択したノードのタイプが表示されます。

Tt2
Tt3

Main サンプルクラスは、型推論が適切な型を変数に正しく伝播する方法を示すより複雑な例を示します。

Tt4

計算された型を自分で確認してください。

タイプエラー

TypeError サンプルクラスは、タイプエラーの簡単な例を示しています。コード Ctrl+/ のコメントを外し、報告されたエラーを確認してください。

Tt9

この変数宣言はその型を明示的に Int として宣言しているのに対し、初期化子は Float 型であるため、型システムはエラーを報告します。下部のステータスバーを確認するか、間違ったコードの上にマウスを置くことができます。

型システムトレース

Control/Cmd + Shift + X を押すか、ポップアップメニューをナビゲートすると、右側に Typesystem Trace パネルが表示されます。

Tt6

トレースは、パネル 2 に、型システムエンジンが実行したすべてのステップ(つまり、型システムルール)を示しています。手順は、実行された順序で上から下に並べられます。ボタン 1 を選択するとパネル 2 は、エディターで選択されたノードのタイプに直接または間接的に影響を与えるステップをハイライトします(パネル 1)。パネル 3 は、パネル 2 で選択されたステップの詳細を示しています。ステップで型システムエンジンの状態にどのような変更が加えられたかを説明しています。エンジンの作業メモリの実際の状態がパネル 4 に表示されます。

ステップバイステップのデバッグ

Simple サンプルクラスは、おそらく実験を開始するのに最も簡単なクラスです。型は、言語で指定された型システム規則に従って、6 つのステップで解決されます。 F4 を押すか、Control/Cmd + N のルートノードに移動コマンドを使用して、これらのルールをすばやく参照することをお勧めします。F3 は、現在のルールの影響を受けているノードに移動します。

Tt7

  1. 変数宣言の型は、初期化子の型のスーパー型である必要があります。AValue は変数が初期化式(に B サブ型または同じ型)、B 型システム変数および > = B が割り当てられている作業メモリに追加され、型システム変数が割り当てられます。

  2. 算術式の型システム規則に従って、b は Number のサブ型である必要があり、値 10 にc 変数が割り当てられ、1.3F に は d 変数が割り当てられ、c を待機するための when-concrete ハンドラーが追加されます。計算されます。

  3. フロート定数 d のルールに続いてフロートとして解決されます。

  4. 整数定数 c の規則に従うと、Int として解かれます。これにより、手順 2 で登録された when-concrete ハンドラーがトリガーされ、別の when-concrete ハンドラーが d を待機するように登録されます。d はすでに Float に解決されているため、ハンドラーは b (算術式全体)をトリガーして Float として解決します。これにより、b <= Number という以前の方程式(ステップ 2)も解かれます。

  5. これで、a を Float として解くことができます。これにより、a> = b であるステップ 1 の方程式も解かれます。

  6. ツールバーのボタンを押して型拡張を有効にすると、最後のステップとして、すべてのノードの具体的な型への最終的な拡張が得られます。

Tt8