HQ9+とは、どう見てもチューリング完全ではないプログラミング言語である。ネタ言語と解釈されている。
概要
HQ9+はその名に含まれている「H」,「Q」,「9」,「+」の4種類の命令のみからなる。Lazy KのIota記法のようにたった2種類の命令でチューリング完全を実現している言語がある中で、HQ9+は4種類の命令を持ちながらチューリング完全ではなく、プログラミング言語としては不完全であるといえる。
しかし、HQ9+はプログラミング言語で必ずと言っていいほど実装される課題についてはひと通りカバーしている。これは4種類しか命令を持たないチューリング不完全な言語としては偉業と言ってよいであろう。しかも非常に簡潔に書くことが出来るという長所まで持っているのである。
言語仕様
4つの命令は以下のように動作する。
- 「H」 … 文字列"Hello, world!"を出力する。
- 「Q」 … 自身のプログラムのソースコードを表示する。いわゆるクワイン(Quine)と呼ばれるもの。
- 「9」 … 99 Bottles of Beer(アメリカの数え歌で、歌詞に一定の法則がある)の歌詞を出力する。
- 「+」 … アキュムレータ(A)をインクリメントする。
言語の存在意義
言語考案者の言によると、多数の難解プログラミング言語(当然全てマイナー言語である)のサンプルプログラムを調べた結果、ほぼすべてがHello World, Quine, 99 Bottles of Beerの3類型に分類できた[1]とのこと[2]。このことから、その3つをハードコーディングすれば複雑な言語仕様なんかいらないんじゃないかと思いついたようである。
そういった観点から見ると、これら難解プログラミング言語(やマイナー言語)の大半が言語仕様の策定とサンプルコードの提示だけで満足して、それ以上のプログラミングレベルに話が進まないことに対する皮肉であると捉えることもできる。
「H」: Hello, world!
プログラムの基本といえば、やっぱり"Hello, world!"を出力するプログラム。"Hello, World!"や"Hello world"を出力するというような課題は存在しない、いいね?
H
通常のプログラミング言語では最低でも出力する"Hello, world!"の13文字分の情報はソースコードに含める必要があるし、言語によってはさらに複雑な過程を要する。HQ9+であれば上記のようにたった1文字[3]で書くことが出来るのである。
「Q」: Quine
Quineとは、プログラム自身のソースコードを出力するという課題で、通常のプログラミング言語ではよく例題にされる。QuineはHello Worldと違ってどの言語でも非常に高難度であることが多い。
多くのプログラミング言語が苦しめられるこの難題も、HQ9+にとってはたった一文字書くだけで実装できる非常に容易な課題である。
Q
「9」: 99 Bottles of Beer
99 Bottles of Beerで出力される歌詞は以下のようなものである。
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.(途中省略)
1 bottle of beer on the wall, 1 bottle of beer.
Take one down and pass it around, no more bottles of beer on the wall.No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
歌詞を見れば分かるように、通常のプログラミングでは数値を99から1ずつ減らし、各数値を文字列に変換して、数値以外の歌詞と連結させながら出力していくことになる。瓶の数が1と0の時は歌詞も変更しなければならない。
for文による繰り返しとif文による条件分岐が使える一般的なプログラミング言語であっても10行~30行程度は記述する必要があり、簡単とはいえそれなりに手間を要する[4]。繰り返しや条件分岐が実装されていない言語に至っては、繰り返しや条件分岐の実装から行うか、繰り返しの実装をあきらめて長い歌詞全文をソースコードに織り込むしかないという面倒極まりない課題である。
そのような面倒な課題も、HQ9+は繰り返しや条件分岐の仕組みを持たないにもかかわらず、1行どころか下記のたった1文字で解決する。
9
「+」: いらない子?
「H」,「Q」,「9」の意義は上記を読めば分かると思うが、「+」は一体何のためにあるのだろうか。Stack Overflow
でも一度話題にのぼったようだが、アキュムレータの値を観測することが出来ないので、「+」でアキュムレータを操作することには何の意味もない。公式ページですら「+」については使用例を示していないので真相は知りようがないと言える。[5]
従って推測するしかないのだが、おそらくは、HQ9+から「+」をなくしてしまうとHQ9の処理系はプログラミング言語インタープリターというよりはコマンドラインツールと呼ぶべきものになってしまうので、プログラミング言語であることを否定されないための免罪符的につけられた機能なのではないかと思う。[6]
言語考案者によると、HQ9+のチューリング不完全性を指摘することはユーモア不足らしいので、「+」についても考えたら負けということかもしれない。
関連リンク
下記リンクによると、この言語を2001年に発表したCliff L. Biffleは言語仕様を発表しただけで、実装を公開したことはないとのこと。
- HQ9+ - Cliffle
: 言語考案者による公式ページ
関連項目
- コードゴルフ
- ハードコーディング
- BrainCrash
- チューリング完全
- Hello World
- FizzBuzz
- 99 Bottles of Beer
- Quine
- プログラミング言語
- 難解プログラミング言語 / esolang
- プログラミング関連用語の一覧
脚注
- *同じ出力のプログラムでないと異なる言語間で比較できないから、ネタ被りするのは必然ではあるのだが。
- *なお、(実用的な言語であれば)HQ9+処理系の実装は(Quineよりも)容易なので、多数の言語で実装されている。HQ9+インタープリターがHello World的な課題になる日が来たらHQ9+には自身のインタープリターを起動する命令が追加されるのだろうか。
- *Hello, world!のソースコードとしてはこれが最短だと思うかもしれない。実際、2001年の発表当時は世界最短でHello, world!が書ける言語だったし、みんなもこれが最短だと思っていた。しかし、現在の世界最短は2008年に日本人が開発したBrainCrashというBrainfuck方言で、BrainCrashではHello, world!を0バイトで記述できる。
- *分岐と繰り返しを用いるサンプルプログラムとしては、FizzBuzzの方がメジャーのように思える。にもかかわらずFizzBuzzでなく99 Bottles of Beerが選ばれた背景は不明。だが、大胆に推測するならFizzBuzzは1から100までで書くのがお約束になっているが、明確に定義されているわけではないので「99までと指定されたらどうするんだ」といったツッコミを受けやすいからではなかろうか。一方、99 Bottles of Beer は99から始めて0で終了することが決まっているので、ハードコーディングに向いていたとも考えられる。と書いては見たものの、HQ9+が発表された2001年の状況はわからないし、難解プログラミング言語の業界に限れば99 Bottles of Beer
がFizzBuzz
よりメジャーであった可能性
も言語考案者の発言からすると十分に考えられる。 - *言語考案者は上記の議論を知りつつ何も述べていないので、公式な解答が得られる日は来ないだろう。
- *HQ9+にFizzBuzzを加えたHQ9F+という言語がある。この言語では、+でインクリメントされたアキュムレータは"F"でFizzBuzzをカウントする回数として使用され、+にも意味が与えられている。しかし、HQ9+が「どうせ使われないんだから使う部分だけのハードコーディングでもいいんじゃないか」という皮肉を表現しているという当記事の解釈に基づけば、HQ9F+はソフトコーディングできる要素を持ち込んで皮肉を台無しにしていると見ることもできる。
- 7
- 0pt

