世の中にはクソ難解プログラミング言語(esolang)と呼ばれる、実用性皆無のジョークとしてのプログラミング言語が数多く存在する。
基本的にパっと見人間には理解できないのだが、言語仕様を理解すると発想が天才のそれであり非常におもしろい。
https://www.esolangs.org/wiki/Main_Page
にまとまっているので興味がある人は色々触ってみるといいだろう。日本語が喋れなくなること請け合いだ。
さて、これらの中でも最も有名なのが「Brainf*ck」という言語である。コンパイラがなるべく小さくなることを目指して作られた言語であり、たった8個の演算子しか存在しないものの、理論上はどのようなプログラムでも構築可能…らしい。
言語仕様は下記リンクを参照されたい。
https://en.wikipedia.org/wiki/Brainfuck
Hello World!のサンプルプログラムを抜粋したものがこちらだ。
1 |
++++++++[>++++[++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++. |
限りなく可読性は低いがやっていることは、バイトの配列内でポインタを移動させたり値を増減させたりして任意の値を任意のセルにセットし、それを出力させているだけ。やってみると意外と簡単。
前述の通り8個の演算子
1 2 3 4 5 6 7 8 |
> < + - , . [ ] |
のみがこの言語内では意味を持ち、その他の文字や記号は一切無視される。
ということは、これら8個の演算子を別の文字列に置き換えればBrainf*ckと同じ言語仕様を持ったオリジナル言語が作れるのでは?ということに思い至る。
事実先人たちが数多くの派生言語を作成しており、Brainf*ckを上回る可読性の低さを実現した言語が数多く存在する。「Ook!」などが有名だろう。下記がHello World!となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. |
もはや人間には解読不能だし作者の精神状態が心配になる。
自分もこのようなオリジナルネタ言語を作ってフヒヒって笑いたいと思うのが正常な人間の思考である。
オリジナルネタ言語を作ってみよう
さて、どうやって作ろうかというところで、とりあえずBFのインタプリタを作ってちょこっと改造すればよいだろうと考える。考えたのだが、これ絶対作った人いるだろってことにも思い至る。あと勘だがマルチバイト文字を使おうとするとハマりそうな気がした。あるものを上手に再利用するのが良いエンジニアだってお母さんが言ってたし探してみるとやはりあった。
https://github.com/masarakki/r-fxxk
こちらを利用させてもらうのが一番簡単に実装できそう。gemとして配布されているのでインストールしておく。
1 |
gem install r-fxxk |
どのようなネタ言語を作るか
こちらのライブラリの作者様はニャル子さんへの愛が過ぎたのかニャル子言語を作ってらした。調べてみると他にも漫画のセリフを用いた言語が多く存在した。
ここはミーハーにドラゴンボール言語でも作ってみよう。
とりあえずBFで「Dragon Ball」を出力するコードを書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
+++++ +++++ use cell #0 as loop counter start loop [ > +++ add 1 to cell #1 > +++++ ++ add 7 to cell #2 > +++++ +++++ add 10 to cell #3 > +++++ +++++ + add 11 to cell #4 <<<< - decrement counter (cell #0) ] end loop the result of this loop is (0 30 70 100 110) >> -- . print "D" >> ++++ . print "r" < --- . print "a" +++++ + . print "g" > --- . print "o" - . print "n" <<< ++ . print Space > -- . print "B" > ----- -. print "a" > -- .. print "ll" |
こんな感じ。最初にループを回して各セルに出力したい文字のアスキーコードに近い値をセットしておけばあとで拾いに行きやすい。
次に各演算子をどのような文字列に置き換えるかを決定する。地味に悩むがドラゴンボールを読んだことがある方であれば99%知っているであろう有名なセリフをセットすることにする。適当なディレクトリにDragonBallというファイルを作成し、BFの各コマンドに呼応する文字列を定義する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/usr/bin/env ruby # -*- coding: utf-8 -*- Encoding.default_external = 'utf-8' require 'r-fxxk' class DB < Brainfuck nxt 'クリリンのことかーーーっ!!!' inc 'かめはめ波!!' prv 'ナッパよけろーーーっ!!!' dec '魔貫光殺砲!!' opn 'ギャルのパンティおくれーーーっ!!!' cls '戦闘力…たったの5か…ゴミめ…' put "がんばれカカロット…お前がナンバー1だ!!" get 'へっ!きたねぇ花火だ' end puts DB.new.fuck(ARGF.read) |
1 |
Encoding.default_external = 'utf-8' |
は環境によっては不要かもしれない。
dragon.ballなど適当なファイルを作成し、そこで先程のBFのコードを置換してあげると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! ギャルのパンティおくれーーーっ!!! クリリンのことかーーーっ!!! かめはめ波!!かめはめ波!!かめはめ波!! クリリンのことかーーーっ!!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!!かめはめ波!! クリリンのことかーーーっ!!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! クリリンのことかーーーっ!!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!! ナッパよけろーーーっ!!!ナッパよけろーーーっ!!!ナッパよけろーーーっ!!!ナッパよけろーーーっ!!! 魔貫光殺砲!! 戦闘力…たったの5か…ゴミめ… クリリンのことかーーーっ!!!クリリンのことかーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!! クリリンのことかーーーっ!!!クリリンのことかーーーっ!!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! がんばれカカロット…お前がナンバー1だ!! ナッパよけろーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!!魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!! かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!!かめはめ波!! かめはめ波!! がんばれカカロット…お前がナンバー1だ!! クリリンのことかーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!!魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!! 魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!! ナッパよけろーーーっ!!!ナッパよけろーーーっ!!!ナッパよけろーーーっ!!! かめはめ波!!かめはめ波!! がんばれカカロット…お前がナンバー1だ!! クリリンのことかーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!! クリリンのことかーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!!魔貫光殺砲!!魔貫光殺砲!!魔貫光殺砲!! 魔貫光殺砲!!がんばれカカロット…お前がナンバー1だ!! クリリンのことかーーーっ!!! 魔貫光殺砲!!魔貫光殺砲!! がんばれカカロット…お前がナンバー1だ!!がんばれカカロット…お前がナンバー1だ!! |
こうなる、勢いが凄い。カカロットはキレすぎてかめはめ波撃ちすぎだしベジータはカカロットを応援しすぎである。ごめんなさい鳥山先生(GT)という感じで3秒笑ったあと凄まじい虚無感に襲われる。
作成したディレクトリ内で
1 |
./DragonBall dragon.ball |
と打ち動作を確認しよう。無事「Dragon Ball」と返ってくれば成功だ。
楽しいだけでなく学ぶ点もある
あくまで遊びとしてのクソ難解プログラミング言語の紹介となったが、クソ難解プログラミング言語を触ることによるメリットも感じた。
- 原始的な言語に触れることでプログラムの内部の動きを掴める。
- どんな簡単なプログラムであってもある程度アルゴリズムを考える必要があるため、アルゴリズム入門にいいかも知れない。任意の文字列を出力するだけのプログラムというお題でコードゴルフができたりする。
- 世界中のプログラマの遊び心に触れることでプログラミングの喜びを知ることができる。
- 触った後にいつもの言語に戻ると凄まじく便利なものに思え感謝の気持ちがとめどなくなる。
- 笑える。
- 人とコミュニケーションが取れなくなる。
などが期待される。
Brainf*ckは至ってシンプルな設計なので理解すれば意外と書けるが、より難解な言語もある。おすすめのクソ難解プログラミング言語があったらぜひ教えて欲しい。