今年の冬のなでしこカレンダーは、開発が中断されたC#版のなでしこv2に注目してくださる方がいました。
C#版のなでしこv2も、泣く泣く開発が中断されたものとは言え、10年以上前?に、それなりに頑張って開発したので、発掘していただけて嬉しい限りです。メンテナンスが終了して何年も経ちますが、今でも、それなりに動いたようです。
これまでに作った日本語プログラミング言語の実装
さて、筆者は、これまで、なでしこをいろいろなプログラミング言語で作り直しています。私が覚えているだけで、結構あります。
- Delphi/Pascalで作った「なでしこv1」
- C# で作った「なでしこv2」
- JavaScript/TypeScriptで作った「なでしこv3」 (現行バージョン)
- Go言語で作った「なでしこv3(Go版)
- Rustで作った「なでしこv3(Rust版)」
また、皆さんすっかりお忘れかと思いますが、なでしこv1の後継言語として「葵」という言語を作りました。「葵」は現在のなでしこv3に似た文法を備えた言語でした。現在のなでしこ3があるのは、葵のおかげといっても過言ではありません!
葵2は、Java VM上で動作するプログラミング言語でした。
このように、何度も何度も、日本語プログラミング言語を作り直しているわけですが・・・理想のプログラミング言語の開発を開発するのは、とても難しいものです。
言語の設計というのは、ある意味、芸術作品を仕上げるのに似ています。「陶芸家がいくつも陶器を作っては、気に入らなくて割って土に戻す」という、そんな雰囲気です。
今年の冬は「なでしこ3(Rust実装版)」で温かくなる
現行メジャーバージョンの、なでしこv3よりも後に作成したのは、
- なでしこv3(Go言語)と、
- なでしこv3(Rust版)です。
Go言語版は、コンパイラコンパイラを利用したものですが、気に入らず、現在は放置しています。
Rustで実装した、なでしこv3 Rustは、比較的お気に入りです。Rustという言語がよくできており、書き心地がよく、ゼロからパーサーを記述したので、自由度が高く、拡張も容易になっています。
Rustをインストールした状態で、次のように試すことができます。
# リポジトリを取得
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を表示。
ここまで。
これを実行します。
$ ./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をブラウザ上で実行できます。
<!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に、アイデアをフィードバックしようと思っています。人生に無駄はないのです!
まとめ
今後も、時間を見つけて、いろいろな言語で「日本語プログラミング言語」を実装しようと思っています。また、なでしこで、なでしこを開発してみたいとも思っています。
これからも、理想の言語を目指して開発を進めていきます。応援よろしくお願いします!