背景紹介#
皆さんご存知のように、MoonBit は現在コンパイル言語であり、コードを実行するためには完全なコード構造が必要です。私はずっと、MoonBit に Python や JavaScript のように迅速なテストとインタラクティブプログラミングのために設計された REPL(Read-Eval-Print Loop)インタプリタがあればと願っていました。そのため、学習のためにインタプリタの実装を試みました。
準備作業#
このようなインタプリタを実現するために、まず JavaScript エコシステム内で自分の DSL(ドメイン特化言語)をカスタマイズできるツールチェーンを検索しました。
以下の人気のツールチェーンプロジェクトが見つかりました。
- Lexer と Parser ツール:カスタム構文を実行可能なコードまたは AST に変換します。
- ANTLR:強力なパーサ生成器で、構文を定義してパーサと字句解析器を生成でき、JavaScript パーサを生成して DSL を処理できます。
- PEG.js:解析表現文法に基づく JavaScript パーサ生成器で、文法を定義するだけで軽量パーサを生成できます。
- Chevrotain:これは高速で多機能な JavaScript パーサ構築ライブラリです。より細かい制御を提供し、複雑な構文ルールの構築を容易にします。PEG.js と比較して、Chevrotain はより柔軟で、カスタムエラーメッセージや最適化操作をサポートしています。
- AST 処理:DSL を構築し、コードをコンパイルまたは実行する際に、AST 処理は非常に重要です。
- Acorn:高速で軽量な JavaScript パーサで、JavaScript ソースコードを解析して AST を生成し、JavaScript 構文に似た DSL に適しています。
- ESTree:JavaScript AST の標準形式で、多くのパーサが生成する AST はこの標準に従い、必要に応じて生成できます。
- コード生成ツール: - DSL を解析して AST を生成した後、ターゲットコードを生成したり DSL を実行したりできます。
- Babel:人気のある JavaScript コンパイラで、プラグインメカニズムを使用して AST を異なるバージョンの JavaScript または他のターゲットコードに変換します。
- ESCodegen:AST を元のコードに戻す JavaScript ライブラリで、DSL の JavaScript または他のコードを生成できます。
- テンプレートエンジン:
- DSL がテンプレート化されたコードや設定ファイルを生成する際に便利です。
- EJS/Handlebars/Mustache:DSL の意味をテンプレートにマッピングして出力コードを生成できます。
- カスタムインタプリタ:インタプリタを実装して DSL の意味を直接実行します。
- Esprima:JavaScript 解析ライブラリで、カスタム JavaScript コードを解析して実行でき、DSL に JavaScript ロジックを埋め込むのに適しています。
- Nearley.js:PEG に基づくパーサ生成器で、パーサを生成し、インタプリタを作成できます。
いくつかの試行の結果、最終的に私はChevrotainという JavaScript と TypeScript に基づく構文解析器(parser)を構築するライブラリを選びました。これはカスタム構文パーサを作成するためのツールを提供し、単純な構文解析から複雑な文脈依存解析までサポートしています。Chevrotain の設計理念はパフォーマンス優先で、LL (k) パーサモデルに基づいて効率的な解析プロセスを実現しています。
フロントエンドインターフェースの準備#
以前、WebContainerというプロジェクトを見かけ、その公式サイトの jsh に深く魅了されました。
そのため、この公式サイトのソースコードを調べてみると、xterm.jsを使用していることがわかりました。
さらには VSCode でも使用されていることがわかり、私は簡単に設定を行い、素晴らしいフロントエンドターミナルを作成しました。
この記事では、プロジェクトの立ち上げ準備について重点的に説明し、次回から正式にインタプリタのコアを構築します。
プロジェクトアドレス: https://github.com/oboard/moonrepl