背景紹介#
皆さんご存知のように、MoonBit は現在コンパイル言語であり、コードを実行するには完全なコード構造が必要です。私はずっと、MoonBit に Python や JavaScript のように迅速なテストとインタラクティブプログラミングのために設計された REPL(Read-Eval-Print Loop)のインタプリタがあればと思っていました。そのため、学習のためにインタプリタを実装しようと試みました。
準備作業#
このようなインタプリタを実現するために、まず JavaScript エコシステム内で自分の DSL(ドメイン特化言語)をカスタマイズできるツールチェーンを検索しました。
以下の人気のツールチェーンプロジェクトが見つかりました。
- Lexer と Parser ツール:カスタム構文を実行可能なコードまたは AST に変換します。
- ANTLR:強力なパーサ生成器で、構文を定義してパーサと字句解析器を生成でき、DSL を処理する JavaScript パーサを生成できます。
- 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