TRAC ( Text Reckoning And Compiling) Languageは、 1959 年から 1964 年にかけてCalvin Mooersによって開発され、1964 年にL. Peter DeutschによってPDP-1に初めて実装されたプログラミング言語です。[ 4 ]これは、Ted NelsonがComputer Libで推奨した 3 つの「最初の言語」の 1 つです。TRAC T64 は、Mooers が TRAC T84 に更新した 1984 年まで少なくとも使用されていました。[ 4 ]
TRACは、完全にテキストベースの言語、つまりマクロ言語の一種です。アセンブラなどで見られるような、当時の一般的なアドホックなマクロ言語とは異なり、TRACは綿密に計画され、一貫性があり、多くの点で完成されています。マクロの最上位レベルでの一般的な暗黙的な入出力(I/O)とは異なり、明示的な入出力演算子を備えているため、従来のマクロ言語よりもシンプルでありながら汎用性も高くなっています。
TRACはテキスト処理言語[ 5 ]であり、 文字列処理言語[ 6 ]とも呼ばれます。 そのため、使用できるデータ型は文字の文字列のみです。数値は数字の文字列であり、整数演算(最大値に特定の制限なし)は、文字列表現に対して動作する組み込み(「プリミティブ」)関数によって提供されます。おそらく、その完全性の一面は、エラーの概念がファイル領域の不足や、インタプリタの作業用ストレージよりも長い文字列の拡張要求などのイベントに限定されていることです。多くの言語で不正な操作と表現されるような操作は、TRACでは関数の引数文字列のあらゆる組み合わせに対して結果(多くの場合、空文字列)を定義することによって処理されます。
TRACは、APLやLISPと同様に、式指向言語(より一般的な手続き型言語とは対照的)ですが、APLとは異なり、演算子を一切持ちません。多くの点で、純粋な関数型プログラミングと言えます。LISPと共通する特徴として、構文には多くの階層の括弧の入れ子構造が用いられます。
TRACはホモイコニックです。つまり、TRACプログラムはTRAC言語自体の中で表現および操作できます。[ 7 ] [ 8 ] [ 9 ] 文字列を唯一のデータ型として重視しているため、TRACは言語独自の構文文字を構文上の役割で、または他の文字と同様に扱うためのメカニズムを提供しており、自己修正コードは特別な機能というよりは、典型的なTRACプログラミング手法の自然な結果のように感じられます。
TRACの主な着想は、Douglas McIlroyによる3つの論文から得られた。[ 7 ] [ 10 ] [ 11 ] [ 12 ]
ムーアーズは、言語の定義に対する支配権を維持するためにTRACという名前を商標登録したが、これは当時としては異例かつ先駆的な行動だった。ある時、彼はデジタル・イクイップメント・コーポレーション(DEC)に対して知的財産権侵害訴訟を起こし、TRACインタープリタを搭載したミニコンピュータを納入する契約が彼の権利を侵害していると主張した。「パーソナルコンピュータ分野の初期の出版物の1つである『ドクター・ドブズ・ジャーナル』の創刊号には、ムーアーズと、彼のコンピュータ言語を人々に売りつけようとする彼の貪欲さに対する辛辣な社説が掲載されている。」[ 13 ] [ 14 ]その後、この名前は、現在オープンソースのプロジェクト管理システムであるTracなど、無関係の情報技術プロジェクト に何度か使用されている。
TRACは後にPDP-8、PDP-10、およびPDP-11に実装された。
TRACに影響を受けた様々な言語が開発されてきた。Mooerとのトラブルを避けるため、プリミティブ名を変更したり、異なるメタ文字を使用したりした。SAM76の場合、クロード・ケーガンによれば、「TRACは幼児語だから」という理由でプリミティブが追加された。MINTの場合は、高度なテキストエディタ機能にアクセスできるようにするためにプリミティブが追加された。
TRACは、FTP Software社がPC/TCP製品においてモデムダイヤラーのスクリプト言語として使用していた。
TRACは、映画『ラスト・スターファイター』を含む作品において、デジタルプロダクションのCrayレンダラーのフロントエンドとしても使用されました。
これは、TRAC T64で書かれた、ユーザーの名前を尋ねて終了する単純なプログラムの例です。[ 17 ]
#(DS,PROG.A,( #(PS、(あなたの名前は何ですか? )) #(DS,NAME,##(RS)) #(PS,( さようなら)) ))'
TRAC T84 は、構文が若干異なり、プリミティブの名前も異なります。以下は、TRAC T84 で記述されたフィボナッチ数を計算するスクリプトです。[ 18 ]
:(s,fibo,( :(ei,<1>, 1, 0,( :(ei,<1>, 2, 1,( :(aa, :(ri,fibo,:(as, <1>,1)),:(ri,fibo,:(as, <1>,2))) )) )) ))` :(mw,fibo)'