『Rustで作るプログラミング言語』を読んで、かねてから構想していた自作言語を形にした

Rustで作るプログラミング言語という書籍が先日発売されました。簡単なプログラミング言語を作ってバイトコードに変換して実行したりネイティブコードに変換して実行してみよう、という本で、大変面白く読みました。最終的にまあまあ本格的な言語になるので、これを元にするとわりとちゃんとした言語を作れそうです。

この書籍で最終的に作られる言語はこちら:

ちょうど私も、以前から構想していた言語があったので、ちょっと作ってみました。というのも、TypeScriptを設定記述言語としてさまざまなプログラミング言語から使えると便利ではないかとずっと思っていたのです。

この設定言語で複雑なことができる必要はなく、最終的にはJSONに準ずるデータ構造になればよいので、その程度だったらそれほど大掛かりではなくツールとしてメンテできるのではないかと思っています。似た思想のツールとしてはJsonnetがありますが、Jsonnetは構文が独自でまったく新しい言語を覚えなければならないのが不満なのです。かといってJSONは非力すぎますし。

TypeScriptで設定を書くのであれば、ほとんどのプログラマーの共通言語であるJavaScriptとほぼ同じように書けますし、TypeScriptの深い知識は不要です。さらに、Typescriptの厳格なサブセットであればTypeScriptの開発ツールキットをそのまま利用できるので、設定を書いている途中にTypeScriptの強力な静的型チェックや補完機能も使えるというわけです。

この設定言語のプロジェクトはこちら("titys" から "tiscript" にリネームしました):

GitHub - gfx/tiscript: Turing-Incomplete TypeScript Subset as a Configuration Language

こういう感じで設定ファイルを書けます:

// editor_config.ts

const LF = "\u{0A}"; // \xHH はまだサポートしていない

export const EditorConfig = {
    tabSize: 4,
    trimTrailingWhitespace: true,
    endOfLine: LF,
    encoding: "utf-8",
};

このファイルはJSONに変換するとこうなります:

{
  "EditorConfig": {
    "tabSize": 4,
    "trimTrailingWhitespace": true,
    "endOfLine": "\n",
    "encoding": "utf-8"
  }
}

Turing-incompleteなことが重要 なので、TiScript (Turing-Incomplete TypeScript) と名づけました。プロジェクトの進捗としては40%くらいですが(とくに型構文をほとんどサポートしていない!)、世の中にあるeslintなどのJavaScript設定ファイルくらいであればすでにTypeScriptに書き換えたものをJSONに変換可能です。

言語として何一つ新規に発明したところがないというのはポイントです。私が判断したのは、強いていえば「何を実装しないか」くらいです(このへんはREADMEに書いてあります)。

現在のところインターフェイスとしてはコマンドしか用意していないのですが、すでにJSONを受け付けるツールにのためのプリプロセッサとしてはすでにある程度使えるでしょう。とはいえ、さすがに今は機能的にも不足ですし、また、Rust用のAPIなどを整備しないと現実的には使い物にならないので、ある程度使い物になるくらいまではメンテするつもりでいます。

脱線しましたが、『Rustで作るプログラミング言語』はRust学習の 2冊目以降の本 としてはかなりよいのではないかと思います。

Rustで作るプログラミング言語
Rustで作るプログラミング言語