MPS 2023.3 ヘルプ

型システムのデバッグ

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

自分で試してみる

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

tt11.png

サンプル言語

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

TT1.png

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

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

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

  2. 要素 -> ブール

型を調べる

シンプルなサンプルクラスを開くと、式の任意の部分にキャレットを配置したり、有効な式ブロックを選択したりできます。Ctrl+Shift+P を押すとすぐに、選択したノードの型がポップアップダイアログに表示されます。別の方法として、任意のノードを右クリックし、コンテキストメニューで言語デバッグ | 型の表示を選択することもできます。

TT2.png
TT3.png

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

tt4.png

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

タイプエラー

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

tt9.png

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

型システムトレース

Ctrl+Shift+X を押すか、ポップアップメニューを移動すると、右側に型システムトレースパネルが表示されます。

TT6.png

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

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

Simple サンプルクラスは、おそらく実験を開始するのに最も簡単なクラスです。型は、言語で指定された型システムの規則に従って、6 つのステップで解決されます。F3 (ソースノードに移動) は、現在のルールの影響を受けるノードに移動します。

tt7.png
  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 の方程式も解かれます。