はじめに
こちらは SLP KBIT Advent Calendar 5日目の記事です。
ぜひご覧ください。
この記事では題名に書いてある通り、Rustを使ってwhitespace言語を動かしてみました。
ぜひみなさんのネタにしてください。
Whitespaceとは?
Whitespaceは、難解プログラミング言語の1つです。どのように難解なのか、実際にプログラムを見てみましょう。
以下のプログラムは、「Hello World」と出力されるものになっています。
hello.ws
とてもきれいなコードですね()
もちろん手抜きではありません。このWhitespace言語は「半角スペース」「タブ」「改行」の三つのみでプログラムが書けるんです。
環境構築
今回、Whitespaceのインタプリタをこちらからお借りしました。
https://tech.hellorusk.net/entry/2018/11/23/221127
(現在は利用できません)
また、私はRustを入れていなかったので、こちらのサイトにしたがって進めました。
https://acn.blue/install-rust-language-windows-10/
https://doc.rust-jp.rs/book-ja/ch01-01-installation.html
Rustのインストールはとても簡単です。ぜひ入れちゃってください。
実行
ファイルがあるディレクトリまで移動し、以下のように実行してください。
$ rustc src/whitespace_interpreter.rs
$ whitespace_interpreter.exe [実行したい.wsのファイル]
このようにすると実行できます。
書き方
以下のサイトを参考にしながら書いていきました。
https://magazine.rubyist.net/articles/0022/0022-Legwork.html#fn:1
何も見えなくて難しそうではありますが、割と単純です。多分。
かなりアセンブリに近いものになっています。
また、打ち込んでる途中に思考が途切れてしまうと、最初から見ないと書けない、みたいな問題が起きちゃいます。
なんとなく作ったプログラム
以下のプログラムは「1+1」の計算をしています。私自身できたときはとても感動したのですが、何も見えないため何もわかりません・・・
wa.ws
そこで以下のように、スペースを「S」、タブを「T」として書いてみました。
SSST
SSST
TSSST
ST
1行目は「SS」でスタックに数値をプッシュしますよ~、という意味になります。その後、Sを0、Tを1として2進数で数字を表しています。ただし、先頭の数字は正負を表します。そのため「ST」は「1」となります。その後の改行は終端記号を表しています。
2行目も同様です。
3行目は「TSSS」でスタックの上から二つを足し算しますよ~、という意味になります。その後、「T\nST」でスタックの先頭の数字を数値として出力しますよ~、という意味になります。
大雑把に説明するとこんな感じです。
おわりに
正直言って何の役にも立たないプログラミング言語の紹介をしました。とはいえ侮れないもので、WhitespaceでAtCoderを解いた方もおられます。
https://qiita.com/rsk0315_h4x/items/a0a81c3d636029288fa6
また、今回お借りしたインタプリタは未完成であるため、時間があるときに完成させたいなと思っています。