はじめに
今回は、1年前にBrainfck言語にはまったときに、自作したBrainfck言語の亜種についてや、自作した経緯について書きます。
仕様については、HexBFのリポジトリのREADMEに記載しています。
(一部確定ではない部分があるため、気分が乗ればC言語で実装してみようと思っています。)
HexBFについて
まずは、とにかく自作した言語について書いておくのがいいと思ったので書きます。
まず、自作した言語名ですが、HexBFです!
Hexは16進数から、BFはBrainf*ck言語からとりました。
(某FPSゲーではないです笑)
仕様については、先ほども述べた通り、HexBFのリポジトリのREADMEに記載しています。
なので、ここでは軽く本家との違いを軸に書いていきたいと思います。
まず、本家Brainf*ck言語の仕様は、このサイトで解説されていますが、ざっくりまとめると以下の通りです。
入力 | 説明 |
---|---|
+ | ポインタが指す値を1byteインクリメント |
- | ポインタが指す値を1byteデクリメント |
< | ポインタのインクリメント |
> | ポインタのデクリメント |
. | ポインタが指す値をASCIIコードに従って出力 |
, | 入力した値をASCIIコードに従って変換しポインタが指す値に代入する |
[ | ポインタが指す値が1以上(true)であるうちは] で囲った範囲を繰り返す |
] |
[ に戻る |
そして、自作したHexBF言語の仕様は以下の通りです。
(GitHubのREADMEから引用)
入力 | 説明 |
---|---|
+ | 指定アドレス値をインクリメント |
- | 指定アドレス値をデクリメント |
< | 指定アドレスを一桁左にずらす |
> | 指定アドレスを一桁右にずらす |
. | 全体の値をASCIIコードで文字列に変換し、出力 |
[ | 指定アドレス値が0出ない場合、]まで実行 |
] | 指定アドレス値が0だった場合、]に戻る |
- <,>をしたとき、指定アドレスはループするようになっています。
例)<<+
の値は、0x01
>+
の値は、0x10となります。
はい、基本的にはいっしょですね笑
では、違う部分はどこかといいますと、例と書いてある部分ですね。
ここがHexBFの最大の特徴です!
Brainf*ck言語ではメモリは無制限(たしか本来は無制限なはず)なのに対し、HexBFでは2桁の16進数で行うといったものです。
正直に言います。
この言語、チューリング完全ではないかもしれません。
(ちゃんと確認してないので、断定できませんが)
HexBFができた経緯
というのも、この言語はチューリング完全を目的として作られてはいないからです。
これは、HexBFができた経緯に大きく関係します。
このHexBFですが、思い付きでBrainfck言語のインタープリタを作成しようとして失敗した際にできたものなのです。
具体的には、Brainfck言語のメモリの認識を16進数の桁ごとであると勘違いしてしまったまま、実装してしまったのです。
今思うと、まったく訳の分からない勘違いの仕方をしていますが、Brainf*ck言語を触り始めた当初はこんな感じのイメージがあったようです。
そして、実装途中なって「あれ?これ違くね?」ってなり、調べて気が付きました。
ですが、「これはこれで、面白いからいいか!」や「むしろ16進数で値を扱った方がASCIIコードで見たときわかりやすくね!」となり、この言語が完成しました。
おわりに
この言語は、個人的にはちょっと気に入っています。
なぜかというと、かなり実装が簡単だからです。(もちろん自分自身が実装をしたということもありますが)
この言語は、あまりコンパイラを作成するための知識がなくても実装できるので、「面白いかもしれない」と思ったひとは試しに実装してみるのもよいと思います。
また、実際に(偶然ではありますが)自作言語を作ってみたところ、このような簡単な言語であれば、気楽に言語の開発ができることを知れたので、色んな人にも自作言語を作ってもらいたいと思ったり、思わなかったり笑
そんなわけで、以上が自作言語のHexBFの紹介でした。