みお言語インタープリタを作りました

このブログは本田未央Advent Calendarの14日目です。

本田未央Advent Calendar

まだまだ参加者募集中なのでよければぜひ。(主催なのにあんまり企画の話ができていなくて申し訳ないです…)

せっかくなのでAdvent Calendarらしいこと1をしようかと思って、みお言語インタープリターを作りました。 「み」「お」「っ」の三文字だけであらゆるプログラムを実装できるすごいやつだよ。

これにより、未央は移動するときの音2にあらゆるプログラムをコードできるようになりました。やったね。

まあ例にもれずぶっちゃけwhitespaceのパクリです…。 正直大石泉とかでもうありそう。

https://github.com/lunashade/miolang

遊び方

  1. GithubのリリースページからOSとCPUアーキテクチャがあったものをダウンロードして解凍。 CPUアーキテクチャについてはx86_64が64bit用、i386が32bit用です。

  2. 解凍して出てきたmiolang(.exe)に第一引数にソースコードのパスを渡すと実行。

たとえばGithubに上げたサンプルコードをダウンロードしてきて、 コマンドプロンプトで

> ./miolang.exe miomio.mio

のようにして起動すると、 「みおみおみおっ」という文字列を印字して終了します。

中身について

中身はWhitespaceで、 スペースを「み」、タブ文字を「お」、改行を「っ」にしただけです。

Whitespaceは見た目の割には結構多機能なので、詳しい解説はWhitespace超入門なんかを参考にしてみてください。こちらのPDFには大変お世話になりました。

インタープリタ自体はGo製です。

独自仕様っぽいところ

  • intの精度について。本来の仕様は無限の精度を許容するらしいんですが、今の所Goのintと同じ精度。ラベルとかも同様です。
  • IOについて、ASCIIだけでなくUTF-8の対応するコードポイントを入力・出力する。まぁ「みおみおみお」を印字したいプログラムなので…
  • 入力に整数を期待するところでいきなり終端記号「っ」(LF)が来た場合は0が入力されたものとみなす。これはラベルについても同様。 すなわち、整数「みみっ」と「っ」が同じく0。
  • プログラムの終端が「っっっ」で終わっていなくても入力の終端に来たら終了する。

やってみた感想

Brainf**kは作ったことあったんですが、それの気分でWhitespaceに向き合うと機能が多すぎてびっくりするんですよね。 ラベル貼ってジャンプできるしサブルーチンもあれば、スタックもヒープもあるので、そのへんの仕組みを結構実装してあげないといけないという。

Goをあまり使う機会がなかったので割と色々試せてよかったなあという気持ちがあります。

  • go generate使ったことがなかったので、とかどう使うのがいいのか(tools.goを用意してバージョン固定する・go run経由ならダウンロードしてビルドしてくれる)とかをしれたり
  • パーサをRob PikeのLexical Scanning in Goにインスパイアされた感じで書いてみたり

結構色々と学びが多くて楽しかったです。

まだエラー処理とかが雑で結構完成度低いので、気が向いたらもう少し色々と仕上げたいですね…。

参考文献

  • Whitespace超入門: Whitespace公式サイトがどうもリンク切れ状態なので、主にこちらのPDFを参照しました。

  1. なんか技術系の記事という程度の意味合いです。 ↩︎

  2. 参考: アニメ・シンデレラガールズ劇場の8話。リンクはアイマスチャンネルのやつ ↩︎