HQ9+とは、どう見てもチューリング完全ではないプログラミング言語である。ネタ言語と解釈されている。
HQ9+はその名に含まれている「H」,「Q」,「9」,「+」の4種類の命令のみからなる。Lazy KのIota記法のようにたった2種類の命令でチューリング完全を実現している言語がある中で、HQ9+は4種類の命令を持ちながらチューリング完全ではなく、プログラミング言語としては不完全であるといえる。
しかし、HQ9+はプログラミング言語で必ずと言っていいほど実装される課題についてはひと通りカバーしている。これは4種類しか命令を持たないチューリング不完全な言語としては偉業と言ってよいであろう。しかも非常に簡潔に書くことが出来るという長所まで持っているのである。
4つの命令は以下のように動作する。
言語考案者の言によると、多数の難解プログラミング言語(当然全てマイナー言語である)のサンプルプログラムを調べた結果、ほぼすべてがHello World, Quine, 99 Bottles of Beerの3類型に分類できた[1]とのこと[2]。このことから、その3つをハードコーディングすれば複雑な言語仕様なんかいらないんじゃないかと思いついたようである。
そういった観点から見ると、これら難解プログラミング言語(やマイナー言語)の大半が言語仕様の策定とサンプルコードの提示だけで満足して、それ以上のプログラミングレベルに話が進まないことに対する皮肉であると捉えることもできる。
プログラムの基本といえば、やっぱり"Hello, world!"を出力するプログラム。"Hello, World!"や"Hello world"を出力するというような課題は存在しない、いいね?
H
通常のプログラミング言語では最低でも出力する"Hello, world!"の13文字分の情報はソースコードに含める必要があるし、言語によってはさらに複雑な過程を要する。HQ9+であれば上記のようにたった1文字[3]で書くことが出来るのである。
Quineとは、プログラム自身のソースコードを出力するという課題で、通常のプログラミング言語ではよく例題にされる。QuineはHello Worldと違ってどの言語でも非常に高難度であることが多い。
多くのプログラミング言語が苦しめられるこの難題も、HQ9+にとってはたった一文字書くだけで実装できる非常に容易な課題である。
Q
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は言語仕様を発表しただけで、実装を公開したことはないとのこと。
掲示板
4 ななしのよっしん
2012/07/14(土) 08:44:13 ID: XlMY2Cfl8n
FizzBazzも難なくこなせる「HQ9F+」という上位互換が存在する。
記述方法は言うまでもない。
5 ななしのよっしん
2013/09/04(水) 02:58:08 ID: NlA0HY4Npm
>>4
FizzBuzzでしょ
しかしこれよりも短くHelloworldを書けかつ、
チューリング完全な言語もあるんだよな・・・(BrainCrash)
6 ななしのよっしん
2024/11/10(日) 21:17:17 ID: frZ2o/gIQc
HQ9B+(Brainfuckを追加したもの)
"><.+-,[]" の8文字はBrainfuckとして使用可能、アキュムレータは "A" に退避させつつ免罪符として残存
急上昇ワード改
最終更新:2024/11/30(土) 00:00
最終更新:2024/11/29(金) 23:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。