読者です 読者をやめる 読者になる 読者になる

プログラミング言語『Menhera(メンヘラ)』の制作

土日の予定が清々しいほどにスカスカなので、クソみたいなプログラミング言語を作りました。
言語処理系に対する理解度がヤドカリのそれと同等なことに危機感をおぼえ、なんとなくお勉強しようと思ってやってみました。

サンプルコード

$ menhera hoge.mh みたいなかんじで実行します。 なにはともあれまずは Hello world といきたいところですが、冗長になるので、「Hi」と表示するプログラムにしました。 

無理無理好き嫌い好き好き嫌い好き好き好き死にたい
つらい死にたい無理無理
無理無理好き嫌い嫌い好き嫌い好き好き嫌い死にたい
つらい死にたい無理無理
リスカしょ。。。
# => Hi

FizzBuzzも書きました。コードが長いので Gist。嫌な気分になりたくない方はみないほうがいいかもしれません。

以上です。出オチです。おつかれさまでした。

言語の説明

言語仕様

「無理」「死にたい」「つらい」などの単語を組み合わせ、記憶領域に対する操作、四則演算、入出力を、「好き」「嫌い」で数値を表現しています。 例えば、つらい死にたい無理無理 は文字出力を、 無理無理好き嫌い嫌い死にたい は「スタックに対する値2のプッシュ」を意味します。 ちゃんと命令に対応したメンヘラ用語を割り当てたかったのですが、そこまでやる気力が残っていませんでした。

実行モデル

記憶領域にスタックとヒープを使います。分岐処理に関しては、label命令/jump命令の組み合わせでgotoっぽいことができ、label命令/call命令/return命令の組み合わせでサブルーチンも定義しています。要するに、アセンブリと同等のことができます。レジスタの代わりにスタックです。

実装方針

前述の加算と文字出力は、以下のように擬似的な中間言語コンパイルし、 VMで実行する形式にします。

  • つらい死にたい無理無理 => [:char_out]
  • 無理無理好き嫌い嫌い死にたい => [:push, 2]

ちなみに言語処理系には主に「インタプリタ方式」「中間言語方式」「コンパイラ方式」があるらしく、Menheraは中間言語方式に当たるっぽいです。VM方式と言ったほうがいいのかもしれません。知らんけど。各自ググってください。

所感

参考にした本がRubyだったので、Rubyで書きました。ほぼ書いたことがなかったので、本を読みながらサンプルコードを書いたりしてRubyのお勉強し、それを改修していきました。

実装は本の内容をパクりにパクったので1日かかりませんでしたが、FizzBuzzのサンプルコードを書くのに丸1日かかりました。読みにくすぎてしんどいし、構文がアレなので書けば書くほど陰鬱な気分になっていきます。「なんでこんな無意味なことをしているんだろう」って6000回くらい思いました。しんどい。つらい。

スタック方式の言語のつらみを体感しました。先人たちはすごいです。
とりあえず手を動かしてみたものの、頭が悪すぎて全然消化できていません。つらい。VM方式にしたのでクソ言語が量産できますが、無意味なのでやりません。Algol文法でもうちょい高級な言語も作ってみたいです。

できれば、ポジティブな気分になれるやつがいいです。メンタルはとても大切だからです。健康第一。