難解プログラミング言語とは、ひとことで言うと、意図的に難読化されたプログラミング言語のことです。難読化だけではなく、特異な設計がされたプログラミング言語であることが多く、それが理解を難しくしているケースもあります。
通常のプログラミング言語が、人間にとって理解しやすい、効率的なソースコ―ドによって記述されることを目指すのに対し、難解プログラミング言語は、その全く逆の発想で作られた言語であるといえるでしょう。
基本的には実用性は考慮されておらず、プログラミング言語の概念を探求したり、制約の限界に挑戦したりする、高度なプログラミングの知見を用いた遊びの一種です。しかし、その発想の奇抜さは一見の価値ありですので、ぜひ難解プログラミング言語の世界に触れていきましょう!
では、早速難解プログラミング言語はどのようなものなのか、具体例をみていきましょう。
ここでは、難解プログラミング言語の代表格「Brainfxxk」、発想の奇抜さでは群を抜いている「Whitespace」、言語のコンセプトがユニークすぎる「Shakespeare」の3つを紹介していきます。
Brainfxxkは、1993年に開発された難解プログラミング言語です。この言語の最大の特徴は、わずか8つの記号のみでプログラムを記述できるという極端なミニマルさにあります。言語仕様とソースコード例を見てみましょう。
・言語仕様
以下の8つの記号を記述することによって、処理を実現します。
>:ポインタをインクリメントする
<:ポインタをデクリメントする
+:ポインタが指す値をインクリメントする
-:ポインタが指す値をデクリメントする
.:ポインタが指す値をASCII文字として出力する
,:1文字を読み込み、ポインタが指す値に格納する
[:ポインタが指す値が0ならば、対応する]の直後にジャンプする
・ソースコード例
Hello World!を出力するBrainfxxkコード
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>—.+++++++..+++.>>.<-.>>+++.—.——–.>>+.>++.
Brainfxxkは、コンパイラのサイズを極限まで小さくすることを目的として開発されました。実際に、初期のコンパイラのサイズは非常に小さく、コンパイラのサイズはわずか123バイト、インタプリタは98バイトでした。
言語仕様としては、メモリ操作とポインタ移動のみであらゆる処理を行う言語ですが、命令のバリエーションが少ないため、複雑な処理を行うソースコードは膨大で難解になります。
しかし、このようにミニマルな言語であるにも関わらず、チューリング完全(理論上どんな計算でもできる能力を持つ)であるのが面白いところです。
言語仕様が簡潔であるため、記号を異なる文字に置き換えたり、命令の数を増減させたりする派生言語が数多く生み出されているのも、特徴のひとつであるといえるでしょう。
Whitespaceは、2003年4月1日にリリースされた難解プログラミング言語です。その最大の特徴は、ソースコードがスペース、タブ、改行といった「空白文字」のみで構成されている点にあります。
想像いただけたでしょうか?つまり、通常のテキストエディタでは、ソースコードが「見えない」プログラミング言語なのです。具体的にどのような言語なのか、言語仕様とソースコード例について説明していきます。
・言語仕様
・使用する文字は[スペース] [タブ] [改行]の3つのみ
・上記の3つの文字を組み合わせて命令を表現する
例)
[スペース]:数値をスタックに組む
[改行][スペース]:スタックの一番上を複製する
[スペース][スペース]:足し算 など
・ソースコード例
Hello World!を出力するWhitespaceコードの一部
※実際のコードはスペース、タブ、改行のみで構成されるため、ここでは視覚的にわかりやすいように、スペースをS、タブをT、改行をLで表現しています。
S S S T S S T S S S L
T L S S S S S S S T L
T L S S S S T S T T L
T L S S S S T S S T L
T L S S S S T T T T L
…
上記の例では、1行目の「S S S T S S T S S S L」が1文字目の「H」をスタックする部分です。
嘘のような言語だと感じた方もいるでしょう。実は、Whitespaceは、エイプリルフールにジョークとして開発された言語なのです。しかし、Whitespaceは、ジョークのような仕様であるものの、Brainfxxk同様チューリング完全な言語であるということも驚くべきポイントです。
実用性を完全に無視した言語ですが、プログラミングの世界で、ひときわ異彩を放っている言語であるといえるでしょう。
3つ目に紹介する「Shakespeare」というプログラミング言語は、ここまでに紹介した2つのプログラミング言語とはまた趣向の異なる言語です。正式名称はShakespeare Programming Languageという名前で、略してSPLと呼ばれることもあります。
Shakespeareは、ソースコードがシェイクスピアの戯曲のような形式で記述される点が特徴です。言語仕様とソースコード例について説明していきます。
・言語仕様
以下のような内容について定義しながら、登場人物の台詞によって処理を実行していくのが基本的な記述スタイルとなっています。
言語仕様はすべて解説すると長くなるため、ポイントのみピックアップしています。
タイトル:プログラムのタイトル
登場人物の紹介:変数宣言に相当
幕(Act)、場面(Scene):ジャンプ、ループなどの制御構造
台詞:命令文に相当し、変数の操作や入出力を行う
・ソースコード例
Hello World!を出力するShakespeareコードの一部
The Infamous Hello World Program.
Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.
Act I: Hamlet’s insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward!
You are as stupid as the difference between a handsome rich brave
hero and thyself! Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer’s
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
…
上記の例では、Hamletの台詞が1文字目の「H」の文字を出力するプログラムになっています。台詞部分がどのような命令を実行しているかについて、簡単に触れておきましょう。
台詞の中のすべての名詞は1か-1に変換されるようになっており、名詞の前に形容詞がつくたびに、その数値がべき乗されます。また、特定の文法を用いると四則演算がされる仕様となっており、文章の内容によって数値が計算されていきます。最後に、「Speak your mind」という定型文を用いることで、変数の値に相当する文字コードの文字を出力する、という仕組みです。
例からもわかるように、Shakespeareは非常に冗長でわかりにくい言語です。しかし、まるで演劇の台本のような流れで、登場人物の会話を通して処理を実行していくという、文学とプログラミングの融合を図るかのような斬新な言語なのです。
ここまで紹介してきたプログラミング言語以外にも、難解プログラミング言語は数多く存在します。
例えば、画像をソースコードとする「Piet」、実行するたびにコードが変化する超難解言語「Malbolge」、ファイル名もコードとして解釈する「Pxem」など、その発想もバリエーションに富んでいます。
以前、当シリーズ「おつまみとしてのソースコード」で紹介した日本酒「ソースコード」のラベルに書かれていたソースコードも、実は難解プログラミング言語の「JSFxxk」で記述されたものです。こちらもぜひお読みください!
ラベルに隠された謎が最高のおつまみになる。日本酒「ソースコード」の解読にチャレンジしてみました! –おつまみとしてのソースコード第4皿 | 情報システム部門を刺激するメディア 情シスのじかん
難解プログラミング言語の世界はいかがでしたか?難解プログラミング言語は、実用性は皆無であるものの、知的好奇心や創造性を刺激する奥深い世界です。難解プログラミング言語に触れることによって、常識にとらわれない発想で、プログラミング言語の概念や仕組みを新たな角度から理解することが可能となります。
あなたも難解プログラミング言語の世界に足を踏み入れ、ソースコードの奥深さを体験してみませんか?
木曜日の夕方に仕事で疲れた脳みそをリフレッシュしたいとき、一人でゆっくりしたい夜、ちょっとした空き時間に、気軽に「つまめる」ソースコードの話題をお届けします。
まるで隠れ家バーでマスターが語るウンチクのように、普段は見過ごしがちなコードの奥深さや、思わず「へぇ〜!」と唸るようなユニークなアイデア、クスッと笑える小ネタを、ソースコードの世界を熟知した「情シスのじかん」がご紹介します。
コードを書くのが大好きなエンジニアさんも、ソースコードはちょっと苦手…という情シス部門の方も、この特集を読めば、きっとソースコードの新たな一面を発見できるはず。
業務効率化のヒントになるTipsや、セキュリティ対策に役立つ情報も盛りだくさん。
さあ、あなたも「おつまみとしてのソースコード」で、技術の世界をもっと身近に、もっと楽しく感じてみませんか?
本特集はこちら30秒で理解!フォローして『1日1記事』インプットしよう!