TiScript
Turing-Incomplete TypeScript
動機
JSONよりマシな設定記述言語
ただし汎用プログラミング言語であってはいけない
「設定記述言語の停止可能性」について考えたくない
外部リソースにアクセスできると危ない
信頼できないコードでも安全に実行したい
プログラミング言語としての汎用性よりも、安全性と読み書きのしやすさの方が重要
構文
JSONはシンプルすぎる。コメントくらいは書きたいし、変数も使いたい
YAMLは性能的には十分だが、1.1と1.2で違いすぎるし、方言も多い
Jsonnetは一部では人気があるが、独自構文がすぎる
誰にとっても書きやすくあるべき
独自性はいらない
構文の認知度が高ければ高いほど良い
mainを書きたくないのでスクリプト言語
よってJavaScriptの系譜がよい
TypeScriptだとTypeScript toolchainによる編集サポートが強い
削るもの
レガシーな資産は不要(var, commonjs, non-strict modeなど)
ループは最終的にはあってもいい
たとえばVMのopcodeの実行回数を制限すればループは安全に実装可能
eBPFの仕様は参考になりそう
実装方法
JS処理系とTypeScriptコンパイラをベースにした参照実装
実装の名前はtiscript2json (仮)
すべてのTiScriptコードを実行可能
ただし余計な機能がついてきてしまうのであくまでも参照実装
つまり、現在はただのTypeScript処理系&実行系で、当然ながらturing-completeだし外部リソースへのアクセスもできてしまう
最終的には、完全な参照実装を目指して、余計な機能を削たり実行時間に制限をかけたものに仕上げたい
TiScriptで禁止していることをリストしたeslint configを作れるとよさそう
ものすごく遅い
フルスクラッチで実装した仮想マシンベースのインタプリタ in Rust
実装の名前はtiscript
現時点では『Rustで作るプログラミング言語』のコードをforkしたもの
パーサライブラリとしてnomを使っている
パーサの品質がまだあまりよくないので、「本来はエラーになるべき(tiscript2jsonではエラーになる)が、tiscriptではパスする」というコードが大量にある
ただそれなりには動くので、JSONに毛が生えた程度の設定記述言語としてはすでに実用可能と思われる
(2024年7月現在)
実際に自分で使ってみるのがよさそう
というか本来そのために開発したのだし
機能的にも全然たりないが、ECMA-262もTypeScriptも仕様が巨大なので一人でどうこうできるレベルではない
既存のTypeScriptパーサーがあればそれを利用したい
swc - Rust nightlyが必要? Cargo.tomlに記述してもビルドが通らなかった stc - RustのTypeScript実装、ただし現在は開発は終了した。Type checkは完全な実装である必要もなく、これをforkするのも手か