| パラダイム | 命令的 |
|---|---|
| 家族 | ジョス |
| デザイン: | リチャード・メリル |
| 開発者 | 12月 |
| 初登場 | 1968年 |
| 影響を受けた | |
| ジョス | |
| 影響を受けた | |
| ベーシックプラス | |
FOCAL ( Formulating On-line Calculations in Algebraic Languageの略称、[1]またはFOrmula CALculator [2])は、JOSSをベースにした対話型インタープリタ型 プログラミング言語であり、主にDigital Equipment Corporation(DEC)のPDPシリーズマシンで使用されています。
JOSS は、プログラマー以外の人でも簡単にプログラムが書けるように、シンプルな言語として設計されました。FOCAL は、サポートするコマンドや言語の一般的な構文において JOSS と非常によく似ています。違いは、範囲やユーザー定義関数などの JOSS の高度な機能の多くが削除され、パーサーが簡素化されていることです。予約語(キーワード)の一部は、すべて一意の最初の文字で始まるように名前が変更されました。これにより、ユーザーは 1 文字のステートメントを使用してプログラムを入力できるようになり、必要なメモリがさらに削減されます。これは、数キロバイト(KB) に制限されることが多かったPDP-8では重要な考慮事項でした。
JOSS や後のBASICと同様に、 PDP-8 上の FOCAL は、ライン エディタ、インタプリタ、および入出力ルーチンを含む完全な環境でした。パッケージ全体はFOCAL-8と名付けられ、 PDP-5およびPDP-12でも実行されました。PDP-11に移植されたとき、結果として得られたFOCAL-11 は、ファイル サポートと編集を提供するために、基礎となるオペレーティング システムRT -11に依存していました。言語定義は、 FOCAL-69と、わずかに変更されたFOCAL-71の 2 回更新されました。Intel 8080への移植も利用可能でした。
FOCALは、初期のビデオゲームである HamurabiとLunar Landerのオリジナルバージョンが書かれた言語として有名です。どちらも後にBASICに移植され、よりよく知られるようになりました。 [3] FOCALはPDPプラットフォーム以外では人気がなく、 VAX-11への移行中にほとんど姿を消しました。ソビエト連邦ではPDP-11のクローンが教育用および家庭用コンピュータ(BKシリーズ) として使用されたため、 FOCALは強力に復活しました。
歴史
ジョス
JOSS は1963 年 5 月にRAND 社のJOHNNIACコンピュータでリリースされました。RAND では使用が急速に増加し、1953 年に最初に製造されたマシンはすぐに機能不足になりました。JOHNNIAC は 1966 年に廃止され、JOSS は新たに購入したDigital Equipment Corporation (DEC) の最初の「大型」マシンであるPDP-6に再実装されました。使用は増加し続け、1970 年までにシステムは全国で 500 ~ 600 人のユーザーによって使用されるようになり、部屋から部屋へと移動してすぐにアクセスできるモバイルコンピュータ ターミナルなどのいくつかの革新が生まれました。 [4]
JOSS は大きな影響力を持っていました。タイムシェアリングが導入されたちょうどその頃に登場しました。人間とマシンの相互作用に大きな関心が寄せられ、コンピュータの使用が広まりつつありました。当時のタイムシェアリング オペレーティング システムのほとんどはユーザー アカウントとファイル管理に重点を置き、ユーザーがプログラミングを自分で行うようにしていましたが、JOSS はファイル編集とプログラミング言語を 1 つのパッケージで提供していました。RAND は業界の大勢の人々にこのシステムを紹介しました。[4]
フォーカル
PDP-6 は DEC の最初のメインフレームであり、JOSS はそのパワーとメモリ容量を最大限に活用しました。DEC のプログラマーは JOSS に興味を持っていましたが、ほとんどのマシンはそれを実行するために必要なパワーに遠く及びませんでした。Richard Merrillによって書かれた FOCAL は、 PDP-8や DEC ラインナップの他の12 ビットマシンのはるかに限られたメモリ空間で実行できるようにするために、必要に応じてJOSS から機能を削除しました。これを実現するために、ステートメントを解析するために必要な一時データ、つまり状態の量を減らすために大きな変更が行われました。この決定による顕著な効果の 1 つは、条件文をどのステートメントにも適用できる JOSS とは対照的に、条件文を 分岐にしか使用できないことでした。
もう一つの注目すべき変更は、キーワードがそれぞれ一意の文字で始まるように並べ替えられたことです。これによりパーサーが簡素化され、コード行のコマンドの最初の文字のみを読み取り、次の空白文字にスキップできるようになりました。次に、それをエントリごとに 1 文字の可能なキーワードの内部リストと比較します。対照的に、JOSS はコマンド ワード全体を読み取るまで読み取りを続け、それを完全なワードを含むリストと比較する必要がありました。この変更により、パーサーのメモリが節約されるだけでなく、ユーザーもその文字のみを入力することでメモリを節約でき、ソース コードのサイズが縮小されました。

FOCAL の最初のバージョンは 1968 年にPDP-8用にリリースされました。翌年には更新バージョンがリリースされ、後に FOCAL-69 として知られるようになりました。バージョンに関係なく、システム全体はPDP-5やPDP-12などの 12 ビット シリーズの他のマシンに移植されたときに FOCAL-8 と呼ばれていました。これらのマシンではメモリが数キロバイト(KB)に厳しく制限されることが多かったため、メモリの使用効率が非常に高かったため人気がありました。同様の FOCAL-11 はRT-11の下のPDP-11で動作しました。
プロセッサテクノロジー社は、Intel 8080ベースのAltair 8800システム向けに、月着陸船を備えた8k FOCALバージョンも提供した。これはテープのコピー料金で提供され、ソースコードは他の購入時に無料で提供された。[5]
ベーシック
DECマシン上でFOCALが普及する一方で、他のプラットフォームではBASICが人気の代替手段となっていた。1960年代後半には、いくつかの企業がDECのミニコンピュータの牙城に進出し、タイムシェアリングバージョンのBASICを搭載した同様のマシンを販売していた。その中でも注目に値するのは、 HPタイムシェアードBASICを搭載したHP 2100シリーズである。[6]
デビッド・H・アールはDECのPDP-8グループに加わったばかりで、ちょうど同社が教育現場へのマシンの販売に興味を持ち始めた頃だった。教育市場でのBASICの人気、特にミネソタ教育コンピューティングコンソーシアムのBASICプログラムのライブラリの増加により、アールはFOCALの利点にもかかわらず、マシンの販売は困難であると感じた。[6]彼は後にこう述べている。
DEC の FOCAL 言語は、ほとんどの点で BASIC と同等で、いくつかの点では BASIC よりも優れていたが、大きな欠点が 1 つあった。DEC は、他のコンピュータ メーカーにライセンス供与したがらなかったのだ。FOCAL は、GE、Honeywell、HP などのコンピュータで使用できる BASIC と苦戦していた。最終
的には、Sony と Betamax のような状況になったと思う。Sony は「Betamax は当社のもので、VHS よりも優れたフォーマットです」と言ったが、実際その通りだった。しかし、JVC は「VHS と東芝があります。使いたいですか? いいですよ、ほとんど無料でライセンス供与します」と言った。[6]
アールは、このプラットフォーム用のBASICシステムの開発を自ら引き受け、後にブルックリンのプログラマー1人だけだった会社を雇って、4kWordのPDP-8用のバージョンを開発した。DECは、端末とBASICを搭載したPDP-8のパッケージ版を「EduSystem」ラインナップとして販売し始めた。シリーズの大型システムにはBASICの拡張版が搭載され、場合によってはFOCALやFORTRANも搭載された。PDP-11ベースのEduSystemもいくつか作られた。[7]
その後、アールはFOCALからBASICへのプログラムの移植を開始し、特にThe Sumer Game(彼はHamurabiと改名)、 Lunar Landerのバージョン、および多くの小規模なFOCALデモが有名です。彼は自分の移植と外部のプログラマーからの投稿を組み合わせて、1973年にDECから101 BASIC Computer Gamesを出版するのに十分な資料を集めることができました。この本はすぐにヒットし、最終的には1975年までに3版が出版されました。[8] [6]
1970年代半ばまでに、BASICはすべてのDECマシンの標準機能となり、FOCALの使用は消滅した。[8]
ソ連の復活
PDP-11は1970年代にソ連で軍事目的でクローン化された。1980年代には、 LSI-11に似たシングルチップのバリエーションが生産され、PDP-11互換の家庭用コンピュータのシリーズが誕生した。いくつかのモデルの中で最も注目されたのは、1985年に発売されたElectronika BKシリーズである。これらは当初、 ROMカートリッジにFOCALが付属していたが[9]、BASICカートリッジはオプションのアドオンであった。後のモデルでは、BASICがデフォルトで付属するようになった。[10]
言語
以下の説明はFOCAL-8言語リファレンスマニュアルに記載されているFOCAL-69に基づいています。[11]
直接モードと間接モード
FOCALは、コマンドラインインターフェースを介した対話のためにJOSSモデルに従っていました。これにより、ユーザーは「直接モード」でコマンドを入力して即座に実行したり、コマンドの前に行番号を付けて、それが一意であればプログラムに追加したり、同じ番号が以前に使用されていた場合は既存のコードを上書きしたりできました。[12]
操作方法は、BASICの「即時モード」と「プログラムモード」に似ています。これは、プログラムコマンドと直接コマンドの両方がユーザーのワークスペースの一部として保存およびロードされるJOSSとは対照的です。これにより、JOSSは行番号のないコマンドを使用してForm定義やその他のタスクに使用できました。FOCALにはこの機能がないため、ロードおよび保存する必要のある命令は、などの他のプログラムモードコマンドのオプションになりましたType。[12]
プログラムステートメント
FOCAL プログラムの各行は行番号で始まる必要があります。JOSS と同様に、行番号は 2 つの 2 桁の整数をピリオドで区切った固定小数点数です。FOCAL-8 では、有効な行番号の範囲は 1.01 から 31.99 です。BASICWRITEの に相当する FOCAL を使用して印刷するとLIST、先頭にゼロが追加されます。1.10 は と印刷されます01.10。これにより、出力されるすべての行番号が 5 文字になり、すべての行番号が揃います。これらの行を参照するステートメントでは、たとえば のように先頭にゼロは必要ありません。GOTO 1.10[ 13]
ピリオドの左側の数字は「グループ番号」と呼ばれます。グループは、Fortran や BASIC などの言語にはない、ある程度のコード編成を提供します。これらの主な用途は、グループをで呼び出すことができるサブルーチンDOとして使用することです。たとえば、 はDO 5グループ 5 で記述されたサブルーチンにジャンプします。エディターは編集時にもこれらを使用し、たとえば、WRITE 2グループ 2 のコード一覧を作成したり、ERASE 4グループ 4 のすべての行を削除したりできます。 [13]
各行は、行番号に続くコマンドキーワードで始まる必要があります。[13] BASIC のオプションステートメントの場合のような「デフォルトコマンド」の概念はありませんLET。複数のステートメントをセミコロンで区切って 1 行に配置できます。通常、FOR ループの場合を除き、ステートメントが別々の行にある場合と動作に違いはありません。[14]
コマンド
聞く
コマンドASK(略語A)は文字列と変数のリストを受け取り、文字列をエコーし、ユーザー入力を変数に格納します。[15] BASICのに相当しますINPUT。
01.01 「名前」を尋ねる、名前 01.02 「座標」、X、Y を尋ねる 01.03 尋ねる "A1",A1,"オメガ",W,"T0",T0,"ダンピング係数",ダンピング係数
ユーザーが数字を入力せずにテキストを入力した場合、システムは最初の文字を「A」=1、「B」=2 などの数字に変換します。
コメント
コマンドCOMMENT(略語C)はコメントを作成します。[16] BASICのに相当しますREM。オリジナルのマニュアルでは、CONTINUECOMMENTの同義語として記載されており、空行をマークするために使用されますが、これには内部的な違いはありません。[17]
01.01 コメント: サマーゲーム、リチャード・メリル著
する
コマンドDO(省略形D)はサブルーチンに実行を分岐します。これはBASICの に相当しますGOSUB。サブルーチンはグループ番号または行番号で参照されます。行番号が指定されている場合は、その行が実行され、その後自動的に の後のステートメントに戻って実行が続行されますDO。行番号が指定されていない場合は、ブロックの最初の行から実行が開始され、ブロックの終わりに達するまで続きます。 はRETURNサポートされていますが、グループから早く戻る場合にのみ必要であり、グループの最後では必要ありません。[18]
01.15 7.24まで 01.16 8時
のために
コマンドFOR(省略形 F) はfor ループを実装します。3 つの引数が指定されている場合、最初の引数はループ変数の初期値、2 番目の引数は増分、3 番目の引数はループの終了値です。2 つの値のみが指定されている場合、最初の引数は初期値、2 番目の引数は終了値で、増分は 1 に設定されます。これは、増分が最後の値 (存在する場合) であるBASIC のループとは対照的に、FORTRANのループのパターンです。
DOFOR
1行に複数の文が独立している言語の他の部分とは対照的に、 はFOR常にその行の終了に達する前にそれに続く文を実行し、その後次の行に進みます。したがって、ループは1行に収めるか、または でサブルーチンを呼び出す必要がありますDO。BASIC の に相当するものはありませんNEXT。[14]
01.01 X=1,10の場合; タイプX、! 01.02 X=0,10,100の場合、2を実行する
FORループの例:
01.10 「いくら借りたいですか?」と尋ねる、プリンシパル 01.20 「何年間ですか?」と尋ねる、期間 01.30 RATE=4.0,.5,10;DO 2.0の場合 01.40 終了 02.10 利息=元金*(利率/100)*期間を設定 02.20 TYPE "RATE",RATE," ","INTEREST",INTEREST,!
後藤
コマンドGOTO(略語G)は、プログラムの実行を指定された行番号にジャンプします。[18]これは、BASICの同名の文と同一です。FOCALでは、GOTOBASICの と同様に、実行を開始するためにも使用されますRUNが、この用法では、基礎となるコマンドが同じであるにもかかわらず、ドキュメントでは ではなく と参照されていGOますGOTO。
01.05 1.01へ戻る 02.90 TYPE !!,"TRY AGAIN.",!!!!!;GOTO 1.1
もし
コマンドIF(略語I)は、式の符号に基づいて条件分岐を提供します。数値式の後、IFコマンドは1〜3行の行番号を取ることができます。式が0より小さい場合、実行は最初の行番号に分岐します。0に等しい場合は2番目の行番号に、0より大きい場合は3番目の行番号に分岐します。この言語には、より大きい、等しい、より小さいなどの相対演算子がありませんでした。X > 5の場合に分岐するには、X - 5を比較する必要があります。[19]
02.20 IF (25-25) 2.4,2.3,2.4 03.01 IF (X) 3.1、3.02、3.1
IF は、最初の行番号の後にセミコロン (または行末) を置くことで短縮形にすることができます。例:
02.20 IF (X)1.8; タイプ「Q」 02.30 IF (X)1.8,2.50 02.40 タイプ「P」
この場合、2.20のテストでは、テストが否定的であればプログラムは1.8行目にジャンプし、そうでない場合は続行してコンソールに「Q」と入力します。2.30行目では、値が負またはゼロであれば1.8または2.5にジャンプし、そうでない場合はコンソールに「P」と入力して続行します。[19]
やめる
コマンドQUIT(略語Q)はプログラムの実行を終了し、編集環境に制御を戻します。[16] BASICのSTOPまたはに相当しますEND。
01.10 X=-10,1,10の場合;タイプX 01.20 終了
戻る
コマンドRETURN(略語R)はサブルーチンの実行を分岐して呼び出し元の位置に戻します。[16]サブルーチンの最後の行での の使用はRETURNオプションですが、サブルーチンはいずれにしてもグループの最後の行に戻ります。以下は、はい/いいえプロンプトを値に変換するサンプルサブルーチンです。[1]
22.78 コメント: 「はいまたはいいえ」サブルーチン 22.80 「はい、それともいいえで答えますか?」と尋ねる 22.82 IF (AN-0YES)22.84,22.86 22.84 IF (AN-0NO)22.8,22.88,22.8 22.86 X=2 に設定;戻る 22.88 X=1 に設定;戻る
セット
コマンドSET(略語S)は、式の結果を指定された変数に代入します。[20] BASICのに相当しますLET。
01.30 PI=3.14156 に設定 01.60 利息=元金*(利率/100)*期間を設定
タイプ
コマンドTYPE(略語T)は、コンマで区切られた1つ以上の項目を出力する。[21] BASICのに相当しますPRINT。
項目は変数、二重引用符で囲まれたリテラル文字列、またはさまざまな制御文字にすることができます。制御文字には、!復帰と改行を出力する 、#復帰のみを出力する 、および:タブ文字を出力する があります。制御文字は連続して使用することができ、たとえば は!!!3 つの CR/LF を出力しますが、カンマで区切る必要はありません。[15]
TYPE [NUMBERS、E1、"TEXT"、!、#、:、$、%] ...出力 01.10 「こんにちは、素敵な方ですね。いくら借りたいですか?」と入力してください。 01.50 「INTEREST」と入力してください。INTEREST、! 01.80 「期間の利息は、年数で、利息はドルです。」と入力してください。 01.90 「NEW YORK」、「!」、「WASHINGTON」、「!」、「ATLANTA」、「!」、「DALLAS」と入力してください。 02.10 タイプ "X",X," ","X^2",X^2," ","SQRT",FSQT(X) 03.20 タイプ ".",# 02.20 タイプ!!!!!
TYPEまた、オプションの書式指定子も含まれており、これは という形式で示されます%x.yz。ここで、x は小数点の左側の桁数、yz はピリオドの右側の桁数です。デフォルトの形式は で%8.4、これは最大 8 桁で、ピリオドの右側に 4 桁あることを意味します。[22]たとえば、
セットA=67823 タイプ %6.01,A = 67823.0 タイプ %5,A = 67823 タイプ %8.03,A = 67823.000 タイプ %,A = 6.7823E4
いくつかの例では、先頭に余分なスペースがあり、定義された幅全体を埋めていることに注意してください。% のみを使用すると、出力は E を使用して「浮動小数点形式」で印刷されます。[23]
特別な制御文字は、$定義されたすべての変数とその値の表を印刷します。名前の最初の2文字のみが印刷され、必要に応じてゼロが埋め込まれます。配列要素は別の行に印刷され、要素が1つだけの変数にはインデックス(00)が付けられます。例:[24]
タイプ$ A0(00)=67823
変数
変数名はF以外の任意の文字で始めることができ(Fは関数用に予約されています)、任意の文字と数字のシーケンスを含めることができます。ただし、意味を持つのは最初の2文字だけです。たとえば、FOCAL:新しい会話言語[25]の次のコードサンプルは、同じ変数をDESTINATIONとして参照し、次にDESを参照しています。内部的には、両方の参照はDEで指定された変数を参照しています。
01.80 目的地を尋ねる 02.30 IF (DES-14) 2.4,3.1,2.4
任意の変数は配列として扱うことができ、-2048から2047までの添え字が許可されます。[2]
数学
FOCALには5つの数学演算子が含まれていました。[26]
^指数の場合 – 指数は12ビットの整数に変換されます*掛け算/分割用+追加用-減算用
1968 年版 FOCAL の奇妙な点の 1 つは、上記の順序のように、演算子に独立した優先順位があったことです。これは確かに累乗、乗算、除算には当てはまりますが、1968 年版 FOCAL マニュアルでは加算と減算に関しては曖昧な点があります。具体的には、乗算と除算の演算子の優先順位を示す例は提供されていますが、加算と減算の演算子の優先順位を示す例は欠けています。それでも、1968 年版 FOCAL マニュアルの文字通りの解釈では、式はSET T=2-3+12-(3+1) の順序で評価され、-2 が生成されることが示唆されています。これは、+ と - の優先順位が同じで、(2-3)+1 と評価されて 0 が生成されるほとんどの言語とは大きく異なります。[26] これにより、FOCAL ソース コードを他のシステムに変換するときに微妙なエラーが発生する可能性があります。
ただし、FOCAL-69 と FOCAL-71 では + と - の優先順位は同じなので、SET T=2-3+1予想どおり 0 が生成されます。
FOCALは、数式で()、[]、<>を同じペアで使用して優先順位を設定できるという点で珍しいものでした。[26]たとえば、次の式は有効です。
01.30 A=<10*[5+1]*(1+5)>を設定します
これらはすべて同じ優先順位であり、同じレベルでは左から右に読み取られるため、この文は[]、()、<>の順に評価され、360が生成されます。[26]
この言語には以下の組み込み関数が含まれていました: [27]
FABS()– 絶対値FATN()– アークタンジェントFCOS()– ラジアンでの引数の余弦FEXP()– 議論の力の自然な根拠FITR()– 引数の整数部分FLOG()–ナペリアンログFRAN()– 乱数FSGN()– 引数の符号。FOCAL-69ではFSGN(0)=1ですが、FOCAL-71以降のバージョンではFSGN(0)=0です。FSIN()– ラジアンで与えられた角度の正弦FSQT()– 平方根
キャラクター機能
FOCAL-71 では、ASK に似ていますが ASCII 値を返す、1 文字の値を入力するための 2 つの新しい関数が追加されました。
FINユーザーが文字を入力するまで停止し、ASCIIコードを返します。FOUTASCII値を文字としてコンソールまたはファイルに出力します。
その他の機能
FOCALにはいくつかの特殊目的の機能も含まれていた: [28]
FADCPDP-8のアナログ-デジタルコンバータからチャンネル番号をパラメータとして値を読み取ります。FDIS指定されたY位置のプロットFDXS指定されたX位置にプロットする
環境コマンド
プログラムの実行
FOCAL はGOTO、プログラムを開始するためにエディターで使用されます。ただし、経験則では、これを に短縮します。これは、 BASIC のGOに相当します。エディターで を使用すると、指定された行で実行を開始することもできます。
RUNGOTO
編集コマンド
プログラムに新しい行を入力するには、コマンドを行番号で始めるだけです。編集コマンドはERASE(略語E)[26] MODIFY(略語M)[29](WRITE略語W)でした:[15]
ERASE– すべての変数をゼロにします。これはプログラムで変数をリセットするために使用されることがあります。ERASE line number– 指定された行の文を削除するERASE group number– 指定されたグループ内のすべてのステートメントを削除するERASE ALL– プログラム全体を削除するMODIFY line number– 指定した行の編集を許可するWRITE line number– 指定された行のステートメントを表示するWRITE group number– 指定されたグループ内のすべてのステートメントを表示するWRITE ALL– 指定されたプログラムを表示する
ファイルコマンド
ファイル コマンドは OPEN (略語 O) でした。
OPEN INPUT [device:][file][,ECHO]– ファイルの先頭から読み取る準備をするOPEN OUTPUT [device:][file][,ECHO]– ファイルの先頭から書き込む準備をするOPEN RESTORE INPUT[,ECHO]– 履歴書入力OPEN RESTORE OUTPUT[,ECHO]– 出力を再開するOUTPUT CLOSE– バッファを出力してファイルを閉じる
ライブラリコマンド
FOCAL には、FOCAL プログラムのコレクションをコード ライブラリとして管理する機能が含まれていました。プログラムは を使用して他のプログラムをチェーン形式で呼び出したりLIBRARY CALL、 を使用して別のプログラム内の単一のサブルーチンを呼び出したりLIBRARY GOSUBできます。プログラム名は 6 文字までです。LIBRARY コマンド (省略形 L) には、次のサブコマンドがありました。
LIBRARY DELETE [device:]program name– プログラムを削除するLIBRARY LIST [device:][file name]– カタログLIBRARY RUN [device:]program name [line number]– プログラムを連鎖し、オプションで指定された行番号から再開するLIBRARY SAVE [device:]program name– プログラムを保存するLIBRARY EXIT– PDP-8モニタープログラムに戻る
FOCAL-71 が追加されました:
LIBRARY CALL [device:]program name– プログラムをロードするLIBRARY GOSUB [device:]program name [group number]– 外部プログラム内のサブルーチンを呼び出す
エラーコード
インタプリタにはエラー メッセージやエラー番号のテーブルを保存するための十分なメモリ領域がなかったため、FOCAL はエラー検出コードのアドレスを固定小数点数として報告するという回避策を使用しました。たとえば、ゼロ除算エラーが検出されると?28.73 @ 01.10、 が報告されます。ここで、28.73 はメモリ ページ 28 に 73 ワードのオフセットを加えた位置でこのエラーをチェックするコードを表し、01.10 はエラーが発生した行番号です。PDP-8 のページは 128 バイト長であるため、このアドレスは位置 3657 に変換されます。
バージョン間の変更
DEC は PDP-8 シリーズ用に 3 つのバージョンの FOCAL をリリースしました。オリジナルは単に FOCAL と呼ばれ、2 つの更新バージョンは FOCAL,1969 と FOCAL,1971 です。FOCAL,1969 はオリジナルとほぼ同じでしたが、FOCAL,1971 はファイル処理、新しい数学、その他さまざまな変更を加えたメジャー アップデートでした。スタンドアロン システムであった最初の 2 つのバージョンとは対照的に、FOCAL,1971 は新興のOS/8 (当時はまだ PS/8 と呼ばれていました) に基づいており、ファイルの処理と編集にはこのオペレーティング システムをより多く使用していました。
フォーカル、1971
新しいバージョンでの変更点の 1 つは、精度を高めるための 10 桁の数学パッケージです。関数FSGNは、入力式がゼロと評価された場合にゼロを返すようになりました。以前は 1 を返していました。関数は、FRANよりランダムに分散された数値を生成する、より優れたアルゴリズムを使用するようになりました。また、FIN文字列を受け取り、そのASCII値を返す (BASIC の に類似ASC)FOUT関数と、数値を受け取り、その ASCII 文字を含む文字列を返す ( CHR) 関数も追加されました。
これらのオプションはすべて限られたメモリを使用するため、起動時に、FOCAL,1971 はユーザーにどの機能を使用するかを尋ねるダイアログに入りました。
JOSSとの比較
FOCAL は、実質的には JOSS のクリーンアップ版であり、構文がより簡潔で解析しやすいように変更されています。ほぼすべての FOCAL コマンドは JOSS と 1 対 1 で対応しており、細かい点のみが異なります。一目見て最も明らかな変更点は、JOSS は大文字と小文字を区別せず、キーワードを大文字と小文字が混在した形で出力するのに対し、FOCAL は大文字のみであることです。さらに、JOSS のステートメントはピリオドで終了するため、記述されたステートメントのように見えますが、FOCAL では行末は必要ありません。
大きな違いの 1 つは、JOSS には完全な比較演算セットと、構文内で動作するブール論理システムが含まれていることです。さらに、分岐とループは任意のステートメントに適用できますが、FOCAL では goto と同等の演算しか実行できませんでした。たとえば、JOSS では次の操作が可能です。
iffor
1.10 X>10の場合はAと入力します。 1.20 i=1(1)10の場合はiと入力します。
最初の行はオプションで X の値に基づいて A を出力し、2 行目は 1 から 10 までの数字を出力します。対照的に、FOCAL には値を比較する機能がなく、ループは完了時に次の行にスキップして適用されました。FOCAL での同等のコードは次のようになります。
1.10 IF (X-10),,1.30 1.20 タイプA! 1.30 I=1,1,10の場合;タイプI、!
JOSS の実装により、一般的な構造の構築が容易になり、プログラマーの意図にさらに近づくようになりますが、ランタイムがより複雑になるという代償があります。たとえば、JOSS では、ループ内の範囲を 1,2,3,10(5)50,75,78 のように柔軟に記述できます。この柔軟性には代償があります。FOCAL では、開始、停止、ステップをカスタムのメモリ内構造に記述し、ループの実行時に簡単に更新できますが、JOSS では、より複雑になる可能性はあるものの、多くの場合はより複雑ではない式を再評価する必要があります。
FOCAL のコードを簡潔にするために、変更は比較的小規模でした。たとえば、JOSS' はわずかDo part 20.に小さい FOCAL になりDO 20、 は にDo step 20.1なりますDO 20.1。コマンド キーワードも可能な限り短縮され、JOSS' はDemandFOCAL's になります。これはASK、 を短くするとともに、文字 D を に一意に使用できるようにするためのものですDO。
パーサーを簡素化するために、一部の JOSS 構造が削除されました。たとえば、JOSS は を使用して複数の割り当てを実行できましたSet S=P, P=Q, Q=S.が、FOCAL ではこれらを個別のステートメントで実行する必要がありましたSET S=P; SET P=Q; SET Q=S。同様に、出力をフォーマットするために使用される JOSS の は、を使用してFormFOCAL の に統合されました。
TYPE%
BASICとの比較
FOCAL と BASIC の比較は必然でした。なぜなら、両方の言語は同時代のミニコンピュータで一般的であり、2 つの言語には構文と構造の共通点がたくさんあるからです。ほとんどの場合、FOCAL コードは BASIC に直接変換できます。たとえば、ユーザーに値の入力を求める場合、FOCAL では次のようになります。
「あなたの年齢は何歳ですか?」と尋ねる,AGE
BASIC では同等のものは次のようになります:
入力「あなたの年齢はいくつですか?」、AGE
どちらか一方に欠けているいくつかの機能と、構文の比較的小さな違いを除けば、2 つの言語は非常に似ています。
注目すべき例外の 1 つはIFBASIC の で、 の後に任意のステートメントを配置できるためTHEN、JOSS の制御構造に似ています。BASIC は JOSS と比較してコードの順序を逆にし、条件式を行末ではなく行頭に配置します。つまり、BASIC では を使用し、IF this THEN thatJOSS では を使用しますthat IF this。FOCAL の はBASIC の計算された goto、IFに似ていますが、 ではターゲットとして任意の数の行を使用できます (FOCAL では負、ゼロ、正の 3 行のみ)。
ON X GOTO 10,20,30ON...GOTO
両者のもう 1 つの大きな違いは、FOCAL には、変数に割り当てることができるデータ要素としての文字列に対する固有のサポートが欠けていたことです。文字列が追加される前の初期の BASIC や FORTRAN バージョン (F77) と同様に、この制限は、入出力コマンドでリテラル文字列を使用することで回避されていました。これが重大な問題になるのは、個々の文字列、または文字列内の文字を操作する場合のみです。
文字列変数はサポートされていなかったため、文字列を入力するには、ユーザーが入力した文字を数値に変換するという、間に合わせの手段HELLOが使用されていました。たとえば、入力ステートメントで入力すると、FOCAL は H を「8」に変換します。これは、PDP-8 の6 ビット文字コードにおける「H」の数値です (「H」は 8 番目の文字です)。次に、「E」を指数の開始文字として解釈し、「8」の「LLO」乗を計算しようとします。これには数秒の CPU 時間がかかり、0.76593020E+103 という、役に立たない応答が返されます。それでも、「説明書が必要ですか?はい、いいえ「プログラマーは、結果を既知の文字値に対してテストし、文字入力のように見えるものを生成できます。
文字列の先頭にゼロを追加すると、文字列は数値に変換されるため、プログラムは IF ステートメントを使用して特定の複数文字の文字列をテストできますI (A-0BROWN) 1.00,2.00,1.00。たとえば、A = "BROWN" の場合は 2.00、それ以外の場合は 1.00 に分岐します。ただし、ユーザーが不運にも 'E' 文字が配置されていないテキストを入力すると、プログラムはオーバーフロー エラーをスローします。たとえば、"BROWN" または "RED" をテストすることはできますが、"GREEN" または "YELLOW" をテストすることはできません。
FOCAL の PDP-8 実装では、数値を 4 つの 12 ビット ワード (合計 48 ビット、仮数部 36 ビット、指数部 12 ビット) として表す浮動小数点表現が使用されていました。これにより、ほとんどの当時のインタープリタよりも大幅に高い精度と大幅に広い範囲の値が可能になり、FOCAL は本格的な数値計算に適した選択肢となりました。この高い精度と、デフォルトの 10 進出力フォーマットの適切な選択により、2 進数から 10 進数への丸めの問題は初心者のユーザーには明らかではありませんでした。比較すると、Microsoft BASIC は当初32 ビット フォーマットを使用していましたが、後のバージョンではこれを 40 ビットに拡張しました。ほとんどの BASIC では丸めの問題があり、単純な式で小さな非ゼロの剰余が生じることがありました。
FOCAL は、同等の BASIC システムよりもリソースの使用効率が高かったことは、一般的に認められています。当時の一般的なマシンでは、磁気コア メモリが 6 ~ 24 キロバイトであることが多く、FOCAL は BASIC よりも大規模で複雑なプログラミング タスクを処理できました。
バージョンとスピンオフ
コカコーラ社は、FOCAL のカスタマイズ版である COKE を使用しました。[引用が必要]
FOCAL は後に PDP-7、PDP-9、PDP-10、PDP-11、PDP-12、PDP-5、LINC-8 に実装されました。
FOCAL マニュアルには、FOCAL パーサーにコマンドを追加する方法が示されていたため、多くのサイトでカスタム ハードウェアを操作するための特殊なコマンドが追加されました。
デジタル機器コンピュータユーザー協会は、 FOCALのパッチと拡張機能を多数収集しました。FOCAL からは、より優れた大容量ストレージファイル I/O や仮想変数メモリなど、多くの機能を追加した FOCAL-W など、大幅な機能強化版も生まれました。
1970 年代半ば、DELTA は FOCAL のより洗練されたバージョンでした。プログラム行番号は、00 から 99 の「部分」と 000000 から 999999 の「ステップ」で、英数字順に実行されました。DELTA には、Tektronix 4010/14 ディスプレイ スコープ用の特殊なコマンドがいくつかありました。
ロシアでは、1990 年代初頭まで、Electronika BKシリーズの大量生産された家庭用コンピューターで使用されていました。
マイクロソフトは紙テープで提供されるFOCALのバージョンを販売しました。[30]レイモンド・チェンによると、マスターテープは紛失しており、FOCALは入手できなくなりました。
サンプルコード
オリジナルの Lunar Lander は、FOCAL 言語のほとんどの機能を使用しているため、FOCAL コードを調査するための優れた例となります。このコードは、Jim Storer の Lunar Lander ページにあるオリジナルのものです。[31]
01.04 T 「コントロールは月着陸船を呼び出します。手動コントロールが必要です」! 01.06 T 「10 秒ごとに燃料率 K を 0 または任意の値にリセットできます」! 01.08 T 「8~200 ポンド/秒。燃料は 16000 ポンドです。推定値」! 01.11 T 「自由落下衝撃時間 - 120 秒。カプセル重量 - 32500 ポンド」! 01.20 T 「最初のレーダーチェックが始まります」!!!;E 01.30 T 「着陸手順を開始します」!「時間、秒、高度」 01.40 T 「マイル+フィートの速度、MPH 燃料、LBS 燃料率」! 01.50 SA=120;SV=1;SM=32500;SN=16500;SG=.001;SZ=1.8 02.10 T " ",%3,L," ",FITR(A)," ",%4,5280*(A-FITR(A)) 02.20 T %6.02," ",3600*V," ",%6.01,MN," K=";AK;ST=10 02.70 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1 02.72 T "不可能";FX=1,51;T "." 02.73 T "K=";AK;G 2.7 03.10 I (MN-.001)4.1;I (T-.001)2.1;SS=T 03.40 I ((N+S*K)-M)3.5,3.5;SS=(MN)/K 03.50 D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1 03.80 D 6;G 3.1 04.10 T「燃料切れ、AT」、「L」、「秒」! 04.40 SS=(FSQT(V*V+2*A*G)-V)/G;SV=V+G*S;SL=L+S 05.10 T "月面上",L,"秒"!;SW=3600*V 05.20 T "衝突速度"、W、"MPH"!、"燃料残量:"MN、"LBS"! 05.40 I (1-W)5.5,5.5;T 「完璧な着陸!-(ラッキー)」!;G 5.9 05.50 I (10-W)5.6,5.6;T 「良い着陸-(もっと良くなる可能性あり)」!;G 5.9 05.60 I (22-W)5.7,5.7;T 「着陸失敗おめでとうございます」!;G 5.9 05.70 I (40-W)5.81,5.81;T 「クラフトダメージ。幸運を祈る」!;G 5.9 05.81 I (60-W)5.82,5.82;T 「不時着 - 酸素は5時間残っています」!;G 5.9 05.82 T 「残念ですが生存者はいませんでした。あなた方は失敗しました!」 「IN」 05.83 T 「事実、新たな月のクレーターを爆破しました」、W*.277777、「フィートの深さ」 05.90 T !!!!"もう一度やりますか?"! 05.92 A 「(答え:はいまたはいいえ)」P;I (P-0NO)5.94,5.98 05.94私 (P-0はい)5.92,1.2,5.92 05.98 T 「コントロールアウト」!!!;Q 06.10 SL=L+S;ST=TS;SM=MS*K;SA=I;SV=J 07.10 I (S-.005)5.1;SS=2*A/(V+FSQT(V*V+2*A*(GZ*K/M))) 07.30 D 9;D 6;G 7.1 08.10 SW=(1-M*G/(Z*K))/2;SS=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9 08.30 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1 09.10 SQ=S*K/M;SJ=V+G*S+Z*(-QQ^2/2-Q^3/3-Q^4/4-Q^5/5) 09.40 SI=AG*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30)
プログラムは、多くのサブルーチンにきれいに分離されています。これは、FOCAL プログラム (および JOSS) でほぼ普遍的でした。行番号スキームによって、このような構造が使いやすくなったためです。このプログラムでは、9 つのルーチンを使用します。最初のグループ 1 は、単にType ステートメントを使用して命令を出力し、実行の初期値を設定します。燃料の質量は直接記録されず、代わりに、現在のMass と空の質量が使用されるためN、残りの燃料は でM-N、が 0 のときに着陸船の燃料がなくなりますM-N。またE、行 01.20 の末尾の rase にも注意してください。これにより、すべての変数値がリセットされます。
メインのゲーム ループはグループ 2 によって実行されます。最初の実行中にコードがグループ 1 からグループ 2 に「落ちる」と、最初の 2 行に初期値が出力されます。行 02.20 の終わり近くで、ユーザーはAバーン レートを と入力するように求められK、その後、ループ タイマーは を使用してリセットされますS T=10。行 02.70 は、ユーザーの入力をいくつかの可能性に対してテストし、200 を超えるか 8 未満の場合は、次のように入力します。不可能」とピリオドの列を入力し、ループしてユーザーに再度試すよう求めます。値がこれらの値の間にある場合は、グループ3に進みます。FOCALIFコマンドの機能が限られていることがここで明らかになります。BASICでは、これを1つに減らすことができます。IF K>200 OR K<8 THEN...
グループ 3 は、まず燃料がなくなったかどうかをテストし、なくなった場合はグループ 4 にジャンプします。次に、 の 10 秒の期間が経過したかどうかをテストし、経過した場合はループしてすべてを再度出力します。これにより、 TとS がT10 にリセットされるという副作用があります。行 03.40 は、この期間に燃焼した燃料の量 によって、車両全体の質量 が自重 N を超えて減少するかどうかをテストします。減少しない場合は先に進みます。減少する場合は、代わりに残りの燃料が燃焼する時間をループ タイマーに設定して、ループを早期に終了します。いずれの場合も、グループ 9 を呼び出して速度と位置を更新します。次に、I の値が収束するまでグループ 7、8、9 をループします。
S*KS*K-M
10 秒のタイマーが切れたとき、または 03.10 行の燃料テストまたは 07.10 行の高度テストにより終了したとき。後者の場合、グループ 4 にジャンプしてグループ 5 にフォールスルーするか、グループ 5 に直接ジャンプします。グループ 5 はゲーム終了の結果を入力し、ユーザーに再試行するかどうかを尋ねます。再試行する場合は、01.20 にジャンプしてすべての値をクリアし、ヘッダーを再度印刷します。再試行しない場合は、05.98 にフォールスルーして終了しますQ。
参照
参考文献
- ^ マニュアル1968、p.1.1。
- ^ 1957年12月から現在まで(PDF) 1978年12月、38ページ。
- ^ McCracken, Harry (2014-04-29). 「コンピューターをパーソナルにしたプログラミング言語、BASIC の 50 年」Time。2016 年 2 月 5 日時点のオリジナルよりアーカイブ。2016年 2 月 12 日閲覧。
- ^ ab Marks, Shirley (1971 年 12 月)。JOSS 時代: 実験の考察(PDF) (技術レポート)。Rand。
- ^ 「アルタイルの成長を見守ろう!」Byte 1976年4月、48ページ。
- ^ abcd Szczepaniak 2014.
- ^ EduSystem ハンドブック(PDF) . Digital. 1973. p. V.
- ^ Savetz 2013より。
- ^ Stapleton, RA; Goodman, SE (1988 年 6 月)。ソビエト連邦とパーソナル コンピュータ「革命」(PDF) (技術レポート)。アリゾナ大学。p. 8。
- ^ 「Elektronika BK-0010」。オールドコンピュータ博物館。
- ^ マニュアル 1968年。
- ^ ab マニュアル1968年、2.1ページ。
- ^ abc マニュアル1968年、2.7ページ。
- ^ ab マニュアル1968年、3.7ページ。
- ^ abc マニュアル1968、3.2ページ。
- ^ abc マニュアル1968年、3.6ページ。
- ^ マニュアル 1968、p. A.1。
- ^ ab マニュアル1968年、3.4ページ。
- ^ ab マニュアル1968年、3.5ページ。
- ^ マニュアル1968、3.3ページ。
- ^ マニュアル1968、3.1ページ。
- ^ マニュアル1968、p.2.2。
- ^ マニュアル1968、p.2.3。
- ^ マニュアル1968、p.2.5。
- ^ FOCAL: 新しい会話言語。デジタル。
- ^ abcde マニュアル1968、p.2.4。
- ^ マニュアル1968、3.10ページ。
- ^ マニュアル 1968、p. A.3。
- ^ マニュアル1968、3.8ページ。
- ^ 「Microsoft FOCAL インタープリターに何が起こったのか?」。YouTube。2022年 9 月 18 日閲覧。
- ^ 「Lunar Lander」。月着陸ゲーム関連文書。
文献
- FOCAL プログラミング マニュアル(PDF)。Digital Equipment Corporation。1968 年。
- Szczepaniak, John (2014 年 5 月 1 日)。「50 周年を迎えた BASIC の基本的な歴史」Gamasutra。
- Savetz, Kevin (2013 年 4 月)。「Dave Ahl と Betsy Ahl」(インタビュー)。
外部リンク
- FOCAL ソースコード、Lunar Lander、Sumer Game などを含むいくつかのプログラムの FOCAL ソース
- DEC の FOCAL 1969 プロモーション ブックレット
- コンピュータ歴史シミュレーション プロジェクト (Focal はここから無料でダウンロードできます)
- ftp://www.cozx.com/pub/langs/focal.tar.gz [永久リンク切れ ] Linuxを含む複数のオペレーティングシステムで動作するCソースバージョン
- 教育に適した最新のDOSバージョンのCソース
- アブラモフ VA 対話言語 FOCAL (ロシア語) ISBN 5-06-001785-0
- オセチンスキー LG FOCAL ミニコンピュータ用 (ロシア語) ISBN 5-217-00323-5
- Фокал снаружи изнутри。 (пилется) – 外側も内側も焦点。 (進行中) (ロシア語)
- Файл справки к фокалу-1б – FOCAL-1B のヘルプ ファイル (ロシア語)
