aiscript-dev / aiscript

🔋 A lightweight scripting language runing on JavaScript
https://aiscript-dev.github.io/aiscript/
MIT License
186 stars 33 forks source link

意味解析時の型チェックと型推論 #138

Open marihachi opened 3 years ago

marihachi commented 3 years ago

お試しで実装してみる

syuilo commented 3 years ago

オッ

marihachi commented 3 years ago

主にWebAssemblyのコンパイル(#98 )で必要になりそう。 インタプリタで実行する場合でも、実行時ではなく事前の型チェック機能とかに応用できる。

marihachi commented 3 years ago

一部実装した。 https://github.com/syuilo/aiscript/tree/work/static-analysis-1

readlineの戻り値の型をどうするか考え中。 readlineはホスト側が標準入力に対応していなければnullを返すため、TypeScriptでいう戻り値の型はstring | nullになっている。今はUnion型に対応していないし、対応する方針にあるのかも決まってないと思う。 また、対応するにしてもユーザーに要求する型システムの知識は高度になる。

ちなみに、C#では操作が非対応の場合は例外を投げることで、非対応操作でnullなどを返さずに戻り値を1種類に保っている。

marihachi commented 3 years ago

配列の型を要素ごとに変えることができるかどうかも検討点だと思う。 スクリプト言語だと、要素ごとでも良い気がするけどWebAssemblyなど他の処理系コードにコンパイルするとなると話は変わってくる。(WebAssemblyでは配列の要素毎に別の型のデータを入れる方法があるのか?等。この辺の仕様も調べる必要があるかも)

syuilo commented 3 years ago

オブジェクトの型ってどうなる?

syuilo commented 3 years ago

複数の型の要素を持つ配列を作成したいケースまずない気がするし配列には1種類の型の値しか含められないようにするで良いんじゃないかな

marihachi commented 3 years ago

オブジェクトの型ってどうなる?

どうだろう、まだ考え中 (一旦はany型として扱って意味解析処理をスキップしてる)

marihachi commented 3 years ago

複数の型の要素を持つ配列を作成したいケースまずない気がするし配列には1種類の型の値しか含められないようにするで良いんじゃないかな

YOSASOU テストに、配列に別の型の値を入れているものがあったからそれは変更する必要があるかも(SKIってテスト)。

marihachi commented 3 years ago

インタプリタのScopeクラスみたいな、変数の一覧を保持するものを一般的にシンボルテーブルと呼ぶらしい

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB