これまでに実装した「日本語プログラミング言語」を回顧しRust版を動かす

今年の冬の[なでしこカレンダー](https://qiita.com/advent-calendar/2024/nadesiko)は、開発が中断されたC#版のなでしこv2に注目してくださる方がいました。

C#版のなでしこv2も、泣く泣く開発が中断されたものとは言え、10年以上前？に、それなりに頑張って開発したので、発掘していただけて嬉しい限りです。メンテナンスが終了して何年も経ちますが、今でも、それなりに動いたようです。

## これまでに作った日本語プログラミング言語の実装

さて、筆者は、これまで、なでしこをいろいろなプログラミング言語で作り直しています。私が覚えているだけで、結構あります。

- [Delphi/Pascalで作った「なでしこv1」](https://github.com/kujirahand/nadesiko)
- [C# で作った「なでしこv2」](https://github.com/kujirahand/nadesiko2)
- [JavaScript/TypeScriptで作った「なでしこv3」 (現行バージョン)](https://github.com/kujirahand/nadesiko3)
- [Go言語で作った「なでしこv3(Go版)](https://github.com/kujirahand/nadesiko3go)
- [Rustで作った「なでしこv3(Rust版)」](https://github.com/kujirahand/nadesiko3rust)

また、皆さんすっかりお忘れかと思いますが、なでしこv1の後継言語として「葵」という言語を作りました。「葵」は現在のなでしこv3に似た文法を備えた言語でした。現在のなでしこ3があるのは、葵のおかげといっても過言ではありません！

葵2は、Java VM上で動作するプログラミング言語でした。

- [C言語/Flash/ActionScript/Javaで作った 葵](https://github.com/kujirahand/aoi2)

このように、何度も何度も、日本語プログラミング言語を作り直しているわけですが・・・理想のプログラミング言語の開発を開発するのは、とても難しいものです。

言語の設計というのは、ある意味、芸術作品を仕上げるのに似ています。「陶芸家がいくつも陶器を作っては、気に入らなくて割って土に戻す」という、そんな雰囲気です。

## 今年の冬は「なでしこ3(Rust実装版)」で温かくなる

現行メジャーバージョンの、なでしこv3よりも後に作成したのは、

- なでしこv3(Go言語)と、
- なでしこv3(Rust版)です。
 
Go言語版は、コンパイラコンパイラを利用したものですが、気に入らず、現在は放置しています。

Rustで実装した、なでしこv3 Rustは、比較的お気に入りです。Rustという言語がよくできており、書き心地がよく、ゼロからパーサーを記述したので、自由度が高く、拡張も容易になっています。

Rustをインストールした状態で、次のように試すことができます。

```sh
# リポジトリを取得
git clone git@github.com:kujirahand/nadesiko3rust.git
# コンパイル
cd cli
cargo build
```

すると、`cli/debug/rnako3` (Windowsなら`cli/debug/rnako3.exe`) に実行ファイルが作成されます。

コマンドラインから簡単な計算`10+10×2を表示`を実行してみましょう。

```
$ ./rnako3 -e "10+10×2を表示"
30
```

以下のようなFizzBuzzを実行してみましょう。プログラムを「fizzbuzz.nako3」という名前で保存します。

```
# fizzbuzz.nako3
Nを1から100まで繰り返す
　　もし、(N%3=0)かつ(N%5=0)ならば「FizzBuzz」と表示。
　　違えば、もし、N%3=0ならば「Fizz」と表示。
　　違えば、もし、N%5=0ならば「Buzz」と表示。
　　違えば、Nを表示。
ここまで。
```

これを実行します。

```sh
$ ./target/debug/rnako3 fizzbuzz.nako3
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
…
```

このように、実行されます。

### なでしこ3Rust版はブラウザ上でも実行できる

Rustで作ると良いことがあります。手軽にブラウザ上で実行できるのです。以下のようなコードで、Rust版なでしこv3をブラウザ上で実行できます。

```html
<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8">
    <title>なでしこ3Rustテスト</title>
    <script type="module">
        import init, { nako_eval_str, nako_eval_getlogs }
            from 'https://cdn.jsdelivr.net/npm/nadesiko3rust@0.2.0/nadesiko3rust.js';
        async function runWasm() {
            await init(); // WASM モジュールを初期化
            // Rustで定義された関数を呼び出す
            const greeting = nako_eval_getlogs("「こんにちは、なでしこ3です。」と表示。");
            console.log(greeting); // コンソールに出力
        }
        runWasm().catch(console.error);
        // Rustから送出される表示ログなどを処理するハンドラ(必須)
        window.nako3_handler = (name, arg) => {
            console.log(name, arg);
            return arg;
        }
    </script>
</head><body></body></html>
```

まとめると、Rust版の良い点は次の通りです。

- バイナリ(実行ファイル)としてリリースできる
- ブラウザ上でも動く
- 実行ファイルが小さい
- 省メモリである

とは言え、Rust版は、まだまだ開発途中です。

現在のなでしこ3には、日々いろいろな便利な機構が追加されているので、完全に追いつくのは、まだまだ先になりそうです。しかし、開発がうまく進めば、次世代の「なでしこ4」や現行のなでしこ3を置き換えるものになるかもしれません。

あるいは、夢破れて「葵」のように破棄される可能性もありますが、その場合も、現行のなでしこ3に、アイデアをフィードバックしようと思っています。人生に無駄はないのです！

### まとめ

今後も、時間を見つけて、いろいろな言語で「日本語プログラミング言語」を実装しようと思っています。また、なでしこで、なでしこを開発してみたいとも思っています。

これからも、理想の言語を目指して開発を進めていきます。応援よろしくお願いします！