C言語風スクリプト言語 MicomScript Windows 版を使ってみた

## MicomScript の概要
MicomScript とは、マイコンでも動作する C 言語風スクリプト言語 [^lang] です。  
大学の授業の一環で制作されたものらしく、ESP32 マイコンにも組み込めるようです。なお、この記事を書いている私はこの言語の開発者ではありません。

[^lang]:製品開発に利用されたなど、実用的なものはわかりませんが、他にも作ってみた方がいらっしゃるようです。（GitHub - EbiseLutica/PolaScript, nScript など）

こんな感じの対話式インタプリタで動かせます。` > ` は cmd.exe、 ` $ ` は MicomScript のコマンドプロンプトです。
```:コマンド実行
> mscript.exe
MicomScript 1.0.0-alpha

$ printf("Hello MicomScript World!\n")
Hello MicomScript World!
```

今回は MicomScript Windows 版をインストールして使ってみました。

本資料の対象者は次のとおりです。
* コマンドプロンプトで cd コマンドを実行できる

### 開発チームについて
このスクリプト言語は MicomScript 開発チーム（ポリテクカレッジ川内 [^team] ）によって開発されました。

なお、この記事を書いている私は、開発チームと関連はありません。

[^team]: ポリテクカレッジ川内（川内職業能力開発短期大学校）は、鹿児島県にある公共の理工系短期大学校です。高校を卒業後、2年間ものづくり（電気・電子情報・機械など）を学べます。厚生労働省所管 独立行政法人高齢・障害・求職者雇用支援機構が運営しています。

### 公式リンク
* 公式サイト http://micomscript.html.xdomain.jp/
* 公式 Windows 版マニュアル http://micomscript.html.xdomain.jp/MicomScript_Windows-ReferenceManual.pdf
* GitHub ページ https://github.com/micomscript

## 環境構築
### Visual Studio のインストール（省略可）
Microsoft Visual C++ で開発されているようなので、コンパイルに Visual Studio のインストールが必要です。  
開発者がコンパイルしたファイルもありますので、この作業は省略しても構いません。

Visual Studio にはエディションが複数ありますが、Community (個人・無料版) でもビルドできます。  
公式の使い方ページによると Visual Studio 2017 のインストールが説明されていますが、2017 以降であれば動くと思われます。  

確認はしていませんが、Visual Studio のインストール時、「C++ によるデスクトップ開発」にチェックを入れる必要があること思われます。（Visual C++ で開発されているため）
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125577/ff87b6f8-7941-c90a-514d-7594c56f46ab.png)


今回は Visual Studio Community 2022 で動作確認してみます。

### ソースコードのダウンロード
GitHub [micomscript/MicomScript-Win-1.0.0alpha](https://github.com/micomscript/MicomScript-Win-1.0.0alpha) からソースコードをダウンロードします。

サイトへアクセスしたら、右上の緑のボタン [Code] をクリックし、[Download ZIP] を選択します。  
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125577/657bb5f6-613a-9838-4c8d-352c69596dab.png)

お好きな作業場所で ZIP ファイルを展開しましょう。

### コンパイル（省略可）
今回は x64 でビルドしたいと思います。スタートメニューから [x64 Native Tools Command Prompt for VS 2022] を開くと、環境変数などが設定されたコマンドプロンプトが起動します。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125577/c04a0c9d-9518-00b2-beef-9e75fe6e2bbb.png)

まずは、ダウンロードしたソースコードの中にある src フォルダへ移動します。
```:コマンド実行
> cd "MicomScript-Win-1.0.0alpha ソースコードフォルダ"/src

> dir
2023/12/28  12:24    <DIR>          .
2023/12/28  12:24    <DIR>          ..
2023/12/28  12:24               311 cc.bat
2023/12/28  12:24             1,624 common.h
2023/12/28  12:24               373 cs.bat
（省略）
```

コンパイルを実行します。
```:コマンド実行
> cc
Microsoft(R) C/C++ Optimizing Compiler Version 19.35.32215 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
expression.cpp
parser.cpp
tokenizer.cpp
token.cpp
varmap.cpp
sentence.cpp
function.cpp
logic.cpp
format.cpp
コードを生成中...
Microsoft (R) Incremental Linker Version 14.35.32215.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:mscript.exe
main.obj
expression.obj
parser.obj
tokenizer.obj
token.obj
varmap.obj
sentence.obj
function.obj
logic.obj
format.obj
```

正常にコンパイルできれば、同じフォルダに ` mscript.exe ` が生成されます。

### 環境変数 Path への登録（省略可）
コンパイルで生成された ` mscript.exe ` を他の場所でも `mscript` コマンドで実行できると便利なので、環境変数 Path へ登録します。

次のサイトを参考にして、 ` mscript.exe ` が格納フォルダ（例: {省略}\MicomScript-Win-1.0.0alpha\bin）を Path へ追加してみましょう。

https://atmarkit.itmedia.co.jp/ait/articles/1805/11/news035.html

## Hello World の対話式実行
Visual Studio のインストールやコンパイルを省略した場合も、開発者が bin フォルダに用意した ` mscript.exe ` を実行することができます。

ここでは、コンパイルした MicomScript を実行します。実行すると、Python などで見られる対話式インタプリタが起動します。  
Hello World を実行してみましょう。` > ` は cmd.exe、 ` $ ` は MicomScript のコマンドプロンプトです。
```:コマンド実行
> mscript
MicomScript 1.0.0-alpha

$ help
[Command　List]
  vlist                 - print Variable  list
  clist                 - print Constants list
  flist                 - print Function  list
  undef                 - undefine Variable/Function
  exit                  - finish execution
$ println("Hello MicomScript World!")
Hello MicomScript World!
$ exit
```

## Fizz Buzz のスクリプト実行
対話式インタプリタだけではなく、ファイルに保存されたスクリプトも実行してみたいと思います。

まず、次のソースコードを ` fizzbuzz.txt ` などで保存します。
```text:fizzbuzz.txt
var i
repeat(i = 1, 30) {
  if ((i % 15) == 0) {
    println("Fizz Buzz")
  } else if ((i % 3) == 0) {
    println("Fizz")
  } else if ((i % 5) == 0) {
    println("Buzz")
  } else {
    println(i)
  }
}
```

```:コマンド実行
> mscript fizzbuzz.txt
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
Fizz Buzz
```

## 感想
このスクリプト言語を作っている方（開発チームを主導している先生）から紹介されたので、レビューも兼ねて使ってみました。

言語処理の知識がないため、ソースコードの中身を読むまではできていませんが、非常によい教材だと感じました。  
字句解析や構文解析の知識を学んでから再チャレンジしてみたいです。

また、ESP32 で動くのであれば、Microchip (Atmel) AVR マイコンに移植してみたい気もします。

あと、アカデミックなことはよくわからないのですが、この処理系はチューリング完全なんでしょうか……？