INTERCAL

INTERCALはプログラム言語。それ自身がプログラミング言語のパロディにもなっており、実用言語ではない。いわゆる難解プログラミング言語の典型例として知られている。

INTERCALは、FORTRANやCOBOLはもちろん、1960年代に提案された数々のプログラミング言語の構造や表記法も皮肉の対象としている。そのため、CやJavaに慣れ親しんだ今日の観点からすると、そのユーモアは少々時代遅れに感じられる部分もある。

1. 概要
-----

INTERCALは1972年、プリンストン大学の学生であったドン・ウッズとジェイムズ・リヨンによって作成された。現行バージョンであるC-INTERCALは、エリック・レイモンドによって保守されている。INTERCALという名前は、製作者らによれば "Compiler Language With No Pronounceable Acronym" からつけられたものだという。

INTERCALは意図的に、他のあらゆる主だったコンピュータ言語とは異なるように設計されている。他のプログラム言語におけるごく普通の処理も、INTERCALでは不可解で無駄の多い文法で表現される。例として、INTERCALのリファレンスマニュアルの一部を以下に示す。

INTERCALのマニュアルにはこの他にも、逆説的で馬鹿げた、あるいはユーモラスな説明が数多く書かれている。

INTERCALにはこの他にも、プログラマ的美的感覚とは決して相容れない数々の特徴がある。例えば、ステートメントに"READ OUT"、"IGNORE"、"FORGET"、"PLEASE"といったキーワードが用いられている。マニュアルでは、アルファベット以外のASCII文字が独特の名称で呼ばれている。例えば、シングルクォートとダブルクォートはそれぞれ「火花」「ウサギの耳」、等価記号は「半メッシュ」といった具合である。他のプログラム言語では代入に等価記号が使用されるが、INTERCALでは"<-"を用いる。この記号はそれぞれ「アングル」と「ワーム」と呼ばれている。

オリジナルのプリンストン大学版ではパンチカードとEBCDICの文字セットが使用されていた。そのため、ASCIIのコード体系を採用しているコンピュータ上でINTERCALを実行する場合、2種類の文字を別の文字に置き換える必要がある。ミングル演算子は"ハードウェアに対応して増加するソフトウェアのコストを表現する"「¢」の代わりに「$」を、単項排他的論理和演算子として"排他的論理和を初めて目にした人々の平均的反応を正確に表現した"「∀」の代わりに「?」を用いる。

Usenetのニューズグループ alt.lang.intercal は、INTERCALやその他の難解プログラム言語の研究と鑑賞のために作られたものである。

意図的に鈍重かつ冗漫な言語であるべく作成されたにもかかわらず、INTERCALはチューリング完全である。つまり、十分なメモリさえあれば、万能チューリングマシンが計算可能なあらゆる問題を処理することができる。ただし、実行速度はきわめて遅い。ベンチマークとしてSUN SPARCStation-1上でエラトステネスの篩を実行したところ、65536以下の素数を全て計算するのにかかった時間は、Cでは0.5秒以下であるが、INTERCALでは17時間以上であった。

International Obfuscated C Code Contestのようなコンテストを見てもわかるとおり、INTERCAL以外の言語であってもINTERCALと同等あるいはそれ以上の理解しづらいプログラムを書くことは可能である。しかし、これらの読みにくいコードは、通常なんらかの意図を持って記述されたものである。これに対して、INTERCALの読みにくさは言語仕様によるものである。

INTERCALのマニュアルには「INTERCALの設計上の目標は、前例のないものを作ることだ」と記載されている。これはおそらく制御構造とデータの操作演算子の両方を対象にしていると思われるが、確かに設計者は部分的にこの試みに成功している。唯一知られている例外は1967年にリリースされたソビエトのメインフレームBESM-6のある命令で、これは事実上INTERCALのセレクト演算子とほぼ同様である。

後発の言語には一部にINTERCALと同様の設計が見られるものもある。たとえば代入記号では、1988年に誕生したS言語でも <- を用いている。なお、代入に = を使うことには問題がある、という意見はFORTRANの昔からあり := などを使う言語も少なくない。一部の言語では ∈ の代用として <- を使う。

2. バリエーション
----------

ウッズとリヨンによる最初のINTERCALは、入出力の能力が極めて制限されていた。入力できるデータは桁が指定された数字のみ、出力は拡張されたローマ数字のみであった。

インターネット上で利用可能な再実装版のC-INTERCALは、より一般的な仕様となっている。これは難解プログラミング言語の愛好家達によるものである。C-INTERCALにはオリジナル版からの何点かの変更と、新しく導入されたいくつかの機能が存在する。COME FROMステートメントやチューリング・テキスト・モデルによるテキストの入出力機能がその例である。

C-INTERCALの作者はまた、TriINTERCALというバリアントも作成した。これは3進数によるシステムで、演算子が一般化されている。 更に新しいバリアントとしてThreaded Intercalがある。このバリアントではマルチスレッドをサポートするために、"COME FROM"ステートメントの機能が拡張されている。

3. Hello, world
---------------

伝統的なHello worldプログラムを使い、INTERCALが通常の言語とどれだけ異なっているかを示す。Cでは、以下のように記述される。

include int main { printf; return 0; }<WtXmlEndTag />

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

4. 脚注
-----

5. 外部リンク
--------

[1].
[2] - いくつかの実装も紹介されている。
[3]
[4]
[5]
[6]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

本記事の英語版の初期のバージョンには、[7]の文章が含まれている。