INTERCAL

INTERCALはプログラム言語。それ自身がプログラミング言語のパロディにもなっており、実用言語ではない。いわゆる難解プログラミング言語の典型例として知られている。 INTERCALは、FORTRANやCOBOLはもちろん、1960年代に提案された数々のプログラミング言語の構造や表記法も皮肉の対象としている。そのため、CやJavaに慣れ親しんだ今日の観点からすると、そのユーモアは少々時代遅れに感じられる部分もある。 INTERCALは1972年、プリンストン大学の学生であったドン・ウッズとジェイムズ・リヨンによって作成された。現行バージョンであるC-INTERCALは、エリック・レイモンドによって保守されている。INTERCALという名前は、製作者らによれば "Compiler Language With No Pronounceable Acronym" （発音できる頭字語のないコンパイラ言語）からつけられたものだという。 INTERCALは意図的に、他のあらゆる主だったコンピュータ言語とは異なるように設計されている。他のプログラム言語におけるごく普通の処理も、INTERCALでは不可解で無駄の多い文法で表現される。例として、INTERCALのリファレンスマニュアルの一部を以下に示す。 理解しがたい仕事をやっている人は高く評価される。この事実はよく知られており、現実においてもしばしば実証されている。例えば誰かが「INTERCALで32ビットの変数に65536を代入する最も簡単な方法は DO :1 <- #0¢#256 である」と言ったとしよう。常識的プログラマであれば、こんな書き方は馬鹿げている、と言うだろう。しかし実際にはこの方法が最も簡単な方法であるため、たまたまそこを通った上司には（上司というのはそういうものである）、そのプログラマが馬鹿のように見えることになる。実際にはなにも間違っていないプログラマには、極めて悲劇的なことである。 INTERCALのマニュアルにはこの他にも、逆説的で馬鹿げた、あるいはユーモラスな説明が数多く書かれている。 注意! メッシュ（INTERCALのマニュアルでの「#」の呼び方）とインターリーブ演算子を決して間違えないようにしてください! ただし、間違ってしまうような状況にある場合はその限りではありません。 INTERCALにはこの他にも、プログラマ的美的感覚とは決して相容れない数々の特徴がある。例えば、ステートメントに"READ OUT"、"IGNORE"、"FORGET"、"PLEASE"といったキーワードが用いられている。マニュアルでは、アルファベット以外のASCII文字が独特の名称で呼ばれている。例えば、シングルクォート(')とダブルクォート(")はそれぞれ「火花(sparks)」「ウサギの耳(rabbit ears)」、等価記号(=)は「半メッシュ(half mesh)」といった具合である。他のプログラム言語では代入に等価記号が使用されるが、INTERCALでは"<-"を用いる。この記号はそれぞれ「アングル(angle)」と「ワーム(worm)」と呼ばれている。 オリジナルのプリンストン大学版ではパンチカードとEBCDICの文字セットが使用されていた。そのため、ASCIIのコード体系を採用しているコンピュータ上でINTERCALを実行する場合、2種類の文字を別の文字に置き換える必要がある。ミングル演算子は"ハードウェアに対応して増加するソフトウェアのコストを表現する"「¢」の代わりに「$」を、単項排他的論理和演算子として"排他的論理和(XOR)を初めて目にした人々の平均的反応を正確に表現した"「∀」の代わりに「?」を用いる。 Usenetのニューズグループ alt.lang.intercal は、INTERCALやその他の難解プログラム言語の研究と鑑賞のために作られたものである。 意図的に鈍重かつ冗漫な言語であるべく作成されたにもかかわらず、INTERCALはチューリング完全である。つまり、十分なメモリさえあれば、万能チューリングマシンが計算可能なあらゆる問題を処理することができる。ただし、実行速度はきわめて遅い。ベンチマークとしてSUN SPARCStation-1上でエラトステネスの篩を実行したところ、65536以下の素数を全て計算するのにかかった時間は、Cでは0.5秒以下であるが、INTERCALでは17時間以上であった。 International Obfuscated C Code Contest（国際醜いCプログラムコンテストの意）のようなコンテストを見てもわかるとおり、INTERCAL以外の言語であってもINTERCALと同等あるいはそれ以上の理解しづらいプログラムを書くことは可能である。しかし、これらの読みにくいコードは、通常なんらかの意図を持って記述されたものである。これに対して、INTERCALの読みにくさは言語仕様によるものである。 INTERCALのマニュアルには「INTERCALの設計上の目標は、前例のないものを作ることだ」と記載されている。これはおそらく制御構造とデータの操作演算子の両方を対象にしていると思われるが、確かに設計者は部分的にこの試みに成功している。唯一知られている例外は1967年にリリースされたソビエトのメインフレームBESM-6のある命令で、これは事実上INTERCALのセレクト演算子とほぼ同様である。 後発の言語には一部にINTERCALと同様の設計が見られるものもある。たとえば代入記号では、1988年に誕生したS言語でも <- を用いている。（論理学で代入や定義を表す記号 ← を模したものであるので、代入に等号を用いるより自然と考える立場もある。）なお、代入に = を使うことには問題がある、という意見はFORTRANの昔からあり := などを使う言語も少なくない（C言語では、設計者らの簡単な調査によればコード中には代入のほうが比較より多く現れるので、代入のほうを短い = にしたという話がある）。一部の言語では ∈ の代用として <- を使う。 ウッズとリヨンによる最初のINTERCALは、入出力の能力が極めて制限されていた。入力できるデータは桁が指定された数字のみ、出力は拡張されたローマ数字のみであった。 インターネット上で利用可能な再実装版のC-INTERCALは、より一般的な仕様となっている。これは難解プログラミング言語の愛好家達によるものである。C-INTERCALにはオリジナル版からの何点かの変更と、新しく導入されたいくつかの機能が存在する。COME FROMステートメントやチューリング・テキスト・モデルによるテキストの入出力機能がその例である。 C-INTERCALの作者はまた、TriINTERCALというバリアントも作成した。これは3進数によるシステムで、演算子が一般化されている。 更に新しいバリアントとしてThreaded Intercalがある。このバリアントではマルチスレッドをサポートするために、"COME FROM"ステートメントの機能が拡張されている。 伝統的なHello worldプログラムを使い、INTERCALが通常の言語とどれだけ異なっているかを示す。Cでは、以下のように記述される。 #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } C-INTERCALでは以下のようになる。コードはより長く、かつ読みにくいものになっている。 DO ,1 <- #13 PLEASE DO ,1 SUB #1 <- #234 DO ,1 SUB #2 <- #112 DO ,1 SUB #3 <- #112 DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 PLEASE DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #214 PLEASE READ OUT ,1 PLEASE GIVE UP