| 開発者 | ダン・ルイスとフランク・ブラッチャー、Tymshare |
|---|---|
| 初登場 | 1968年 |
| 影響を受けた | |
| ダートマス BASIC、JOSS、CAL | |
| 影響を受けた | |
| ベーシックプラス | |
SUPER BASIC (略してSBASIC と呼ばれることもある) は、1968 年から TymshareのSDS 940システムで提供され、1970 年代まで利用できたBASIC プログラミング言語の高度な方言です。
ベースとなったダートマスBASICと同様に、SUPER BASICはインタープリタではなくコンパイルして実行する言語でした。行列演算コマンドを含むダートマスBASICバージョン4のコマンドと関数のほとんどを提供することに加えて、SUPER BASICには、TymshareのバージョンであるCALを介して、ランドコーポレーションで開発された影響力の大きいJOSS言語[1]の多くの機能も含まれており、さまざまな新しい関数、組み込み型としての複素数、倍精度のサポートが追加されました。
SUPER BASIC は、ダートマスの基本的なシステムに比べて文字列LEFT処理も大幅に改善し、、および文字列関数、単純な文字列連結などの機能を導入しました。これらは後にDECのMIDBASIC -PLUSで使用され、これが後に 1980 年代に広く使用されるようになったオリジナルのMicrosoft BASICの基礎として使用されました。
RIGHT
歴史
オリジナルのダートマス BASIC は1964 年にリリースされましたが、当時は主に実験的なものでした。数回の改訂を経て、GE 635マシンに移植され 1968 年に公開された第 4 版で本当に役立つものになりました。ダートマスは、基礎となる設計をパブリック ドメインに置き、誰でも自分のプラットフォームに移植して BASIC と呼ぶことができるようにしました。作者のたゆまぬ努力により、さらに普及が進みました。ただし、コードはDTSSオペレーティング システムで動作するように設計されていたため、実稼働システムで動作させるには移植が必要でした。このため、わずかな違いがあるバージョンが急増しました。[2]
Tymshare はカリフォルニア大学バークレー校内で設立され、当初は大学のコンピューターを営業時間外に貸し出していた。Tymshare のオリジナルの BASIC、単に Tymshare BASIC は、大学内の「他の場所」のソースコードに基づいていたが[3] 、 Dan Lewis が改良を始めた。Frank Bracher はファイル入出力 (I/O) のルーチンを追加し、DATAプログラムに埋め込まれたステートメントのみに依存していたオリジナルの Dartmouth コードよりもはるかに実用的なものにした。Dartmouth のワークフローはテープベースであったため、個々のファイルの読み込みと保存は実用的ではなく、直接 I/O は後のバージョンまで対応されなかった。Bracher の I/O コードは元々 Tymshare のSUPER FORTRAN製品用に開発されたものだった。[2]
このシステムでよく注目される特徴の一つは、キャロライン・ディールが書いたマニュアルである。マニュアルは会話形式で書かれていた。[3]
Tymshareは1970年代を通じてSUPER BASICを維持していたが、レンタルタイムシェアプログラミングサービスの市場が縮小したため、システムはメンテナンスに入り、ルイスとブラッチャーはSUPER BASICをまだ使用している企業向けにコンサルティングを行うためにTymshareを離れた。Tymshare内のメンテナンスは主にウォルター・メインが担当した。[3]
Tymshareは1970年1月7日にSUPER BASICの商標を申請し、1977年10月17日に商標を更新しました。 1984年にマクドネル・ダグラスがTymshareを買収した際に、商標はマクドネル・ダグラスの所有物となりました。[3]
言語
直接モードと間接モード
当時のほとんどの BASIC システムと同様に、SUPER BASIC には対話型言語とプログラム エディタの両方として機能する単一のコマンド ラインエディタがありました。行番号なしで入力されたコマンドは即座に実行され、これを「直接モード」と呼びました。[a]同じ行の前に行番号が付いている場合は、代わりにプログラム コード ストレージ領域にコピーされ、「間接モード」と呼ばれます。行番号が一意である場合は新しい行がプログラムに追加され、同じ番号の既存の行が置き換えられ、既存の行番号が入力され、その後にコードがない場合はプログラムから削除されました。[4]
プログラムステートメント
行番号は0から999999でした。[5]DELETE (または短縮形の)は、たとえば などのDEL一般的な表記法を使用して、一定範囲の行を削除するために使用できます。[4]コマンドは自動行番号システムを開始します。 で区切られた2つのオプションのパラメータ、開始行番号とステップを受け取ります。開始番号が指定されていない場合は0、ステップは10と見なされます。たとえば、は0、10、20、... を生成し、は0、5、10、... を生成し、 は10、20、30... を生成します。[6] は、新しい開始行番号、番号を変更する行の範囲 (20-100 など)、ステップの3つのパラメータを受け取ります。[7]LISTDELETE 5,10-50ENTERBYENTERENTER BY 5ENTER 10 BY 10 RENUMBER
組み込みエディタはプログラム自体の行のみをロードして保存しますが、ユーザーは結果のテキストファイルを編集して、直接モードで実行される追加のコマンドを追加できます。一般的な例としては、プログラムを編集して、RUNファイルの最後に独自の行を追加することです。ロードされると、システムはそれを認識しRUN、ロード時にすぐにプログラムをコンパイルして起動します。[8]これはBASICシステムでは珍しいことですが、JOSSでは一般的に使用されていました。
声明
ダートマスBASICの全体的なコンセプトに沿って、SUPER BASICは、プログラムの実行時にソースコードをコンパイルするコンパイルアンドゴーRUNシステムでした。SUPER BASICには、ほとんどのBASICで見られる典型的な2つのコマンドと、START同じことを行う がありました。[9]注釈は を使用してどこにでも配置できます!。[10]
SUPER BASIC は、FORステートメントをいくつかの方法で拡張しました。小さな変更は、BYの代わりにを使用できるようにしSTEP、ステップをほとんどの BASIC のように最後に配置したり、JOSS や他の言語のように途中に配置できるようにしたことです。したがって、 と は両方とも有効でした。[11]さらに、SUPER BASIC は、およびを使用して範囲定義の代替形式を提供しましたが、他のほとんどの言語ではこれらに対して完全に別のループ構造を使用していました。たとえば、 はX<Y である限り続行されますが、 は条件が満たされると停止します。[12] Microsoft BASICと同様に、複数のループを 1 つの で終了できます。[12]ただし、インデックス変数を完全に省略できる MS の後のバージョンの機能は含まれていませんでした。最後に、JOSS の方法で、一般的な範囲指定子を明示的な値のリスト に置き換えることができます。[13]FOR I=1 TO 10 BY 2FOR I=1 BY 2 TO 10WHILEUNTILFOR X=1 WHILE X<YFOR X=1 UNTIL X<YNEXT I,J1 TO 10FOR I=1,4,5,6,10
JOSS モデルに従った、より大きな変更は、「文修飾子」の概念です。これにより、制御する文の後にIForを置くことができるようになりました。たとえば、 はと同等です。これにより、よく見られるユースケースを理解しやすくなります。[14]また、反対の意味を持つ という構文糖も含まれていました。たとえば、 です。これらの場合にはループを使用することもできます。これにより、単一の文のループを簡単に実装できます。たとえば、 です。 [ 15]また、「裸の」またはfor なしのを使用することもできます。修飾子は、 でまとめることもできます。[16]FORPRINT "IT IS" IF X=5IF X=5 THEN PRINT "IT IS" UNLESSIFPRINT "IT IS NOT FIVE" UNLESS X=5PRINT X FOR X=1 TO 10WHILEUNTILX=X+2 UNTIL X>10PRINT "YES" IF A=B UNLESS N=0
表現
変数
変数名は1文字または2文字、または1文字と数字で構成できます。SUPER BASICでは変数を型指定する必要がなく、変数は1つの時点では数値を保持し、別の時点では文字列を保持できます。これは変数の格納方法による副作用です。これにより、システムは実行時に変数の型をテストする必要がありINPUT、PRINTパフォーマンスが低下しました。これは、さまざまなコマンドを使用して変数の型を明示的に宣言することで対処できます。[17]
BASIC のほとんどの方言では、変数はコード内で遭遇するとその場で作成され、作成時に通常は 0 (または空の文字列) に設定されます。これにより、変数が適切に呼び出されていない以前のコードによって設定されるはずであるが、実行時に 0 が初期化されていない値なのか、完全に正当な 0 値なのかを判断するのが難しいという問題が発生する可能性があります。SUPER BASIC は、コマンドでこの問題に対処しましたVAR。2 つの主な形式があり、VAR=ZERO未定義の変数はすべてアクセス時に自動的に 0 の値を取得します (これは BASIC の通常のパターンです)。一方、VAR=UNDEF以前に見たことのない変数がその値にアクセスしようとする方法で使用された場合は、代わりに「変数に値がありません」というエラーが発生します。後者は、通常の動作によって、計算で使用されている変数が正しく初期化されていないという事実を隠すことができるデバッグシナリオで非常に役立ちます。 [18]
数値
特に指定がない限り、変数は11桁の精度を持つ48ビット単精度 浮動小数点形式で保存されます。また、変数をREAL A単精度形式として明示的に定義することもできます。これは、 などの何らかの接尾辞が$どこにあっても型を示す他のBASICでは考慮されませんでした。[17]
必要に応じて、で変数を宣言することで、24ビットワード2つではなく3つの24ビットワードに格納された17桁の倍精度DOUBLE A形式を使用できます。[19]関数を使用して、既存の単精度値または式を倍精度に変換できますDBL(X)。たとえば、 を使用すると、式を倍精度で評価するように強制できますDBL(10+20)。[20]
同様に、INTEGER A1ワード24ビット整数値を生成するように宣言することもできます。[17]
より珍しい追加機能は、複素数の直接サポートです。これらは他の変数と同様の方法で設定され、 を使用してCOMPLEX I,J2つの単精度スロットを確保しました。プログラムで などの他の文に遭遇すると、 (文で使用される) INPUTなどに同様の変更を加えた、1つではなく2つの数値を要求する代替モードがトリガーされます。 関数を使用して2つの単精度から1つの複素数を作成できますが、と はそれぞれ実部と虚部を単精度に抽出します。少数の追加ユーティリティ関数も提供されました。[21]READDATAPRINTCMPLX(X,Y)REAL(I)IMAG(I)
演算子と関数
基本的な数学演算子は7つありました。[22]
↑指数の場合 - 指数は12ビットの整数に変換されます*掛け算/分割用MODモジュロの場合、整数除算の余りDIV整数除算の場合+追加用-減算用
SUPER BASICの数学関数のリストは、一連の逆三角関数や2と10を底とする対数関数など、ほとんどのBASICよりも長かった。 [22]
RND ( X )、固定シーケンスを使用して乱数を返します。シードはRND ( -1 )で指定できます。 ABS ( N )、絶対値SQR ( N )またはSQRT ( N )、平方根SIN COS TAN ASIN ACOS ATNまたはATAN ATN / ATANは2 つの変数を使用し、( y , x )はy / x を計算し、そのATNを返します。 SINH COSTH TANH LOG LGT / LOG10 LOG2 EXP EXP2 INT はBASICと同様に、常に小数点以下を切り捨てます。FIX はINTに似ていますが、小数点以下を切り捨てるだけです。 ROUND はINTと異なり、値を最も近い値に丸めます。COMP ( X , Y ) COMPare は減算とSGNを組み合わせます。したがって、X > Y = 1 、X = Y = 0 、X < y + -1の場合、 PDIF ( X , Y ) Positive DIFferenceは差( X - Y ) X > Yの場合、それ以外の場合は0
SUPER BASICにはJOSSの関数もいくつか含まれていました: [23]
IP ()、整数部、INTに相当FP ( )、小数部、X - INT ( X )と同じMAX ( ... )はエントリのリストから最大値を返しますMIN ( ... )は最小値を返します
配列と行列の計算
SUPER BASICには、基本的な数学に加えて、他の多くのBASIC実装と同様に配列機能が含まれていました。2DIM A(5,5)次元配列を作成することができ、それらの格納方法の結果として、宣言されていないすべての変数は実際には10個のインデックスを持つようにDIM化されるため、LET B(5)=20事前にBをDIM化する必要はありませんでした。[24]
他のBASICとは対照的に、SUPER BASICでは、1つまたは両方の次元の範囲を定義することができ、定義されていない場合は1とみなされます。したがって、上記の例のAは1..5のインデックスを持ちますが、DIM A(-5:5,0:5)Xに-5から+5、Yに0から+5の11のインデックスを持つ配列を作成することもできます。また、BASEコマンドを使用してデフォルトを変更することもできます。BASE 0たとえば、すべての次元が0から始まります。[24]
これらの伝統的なBASICの概念に加えて、SUPER BASICには、後のバージョンのDartmouth BASICに見られる行列計算機能のほとんども含まれていました。これらはMAT、他のコマンドの前にキーワードを追加することで呼び出されました。たとえば、MAT A=B*C配列Bのすべての項目をCの対応する項目で乗算するのに対し、MAT A=B*5Bのすべての要素を5で乗算します。反転や恒等などの一般的な行列演算の関数が含まれていました。[25]
バイナリ数学と論理値
BASICのほとんどのバージョンと同様に、SUPER BASICには、比較演算子の標準セットである、、、、、および、ブール演算子、およびが含まれていました=。さらに、は、当時<>の多くのBASIC実装で見られた形式である、の代替形式として使用できました。 [14] SUPER BASICでは、「同値」(等しい)を表す 、および「含意」を表す も追加されました。[26]>=<=><ORANDNOT#<>XOREQVIMP
この基本セットに、SUPER BASIC は数値間の小さな差を比較するための 3 つの新しいコマンドも追加しました。これらは>>、、<<およびです=#。はるかに大きい演算子とはるかに小さい演算子は、2 つのオペランドの値、たとえば式 の A と B を比較しますA >> B。B を A に追加した結果、固有の丸め処理後に A が変更されない場合、>>は true を返します。内部的には、これは によって実行されていました。近い値である は、両方の値を内部メタ変数 と比較し、を実行します。[14]IF A=A-B=#EPSABS(A/B-1)<EPS
BASIC のほとんどの方言では、このような論理比較の結果を変数に格納できます。その際、論理値を表す内部形式が使用されます。論理値は、偽の場合は 0、真の場合は 1 または -1 になることが多いです。SUPER BASIC でもこれが可能でしたが、その結果、 はやや紛らわしい動作になりました。これは、演算子の優先順位に従って、B に 5 を割り当て、A=B の場合は true または false を返します。SUPER BASIC では、 を使用した double または complex と同様の方法で宣言される真の論理変数も追加され、 を使用すると他の変数を論理に渡すことができました。[27]LET A=B=5LOGICAL AL()
論理比較や論理演算子とは対照的に、SUPER BASIC ではビット単位の論理演算子もいくつか追加されました。これらは、ワード内の個々のビットに基本的な論理演算を適用しました。これらにはBAN、BORおよびBEX、または、排他的論理和の 、および が含まれます。追加の関数には、それぞれ左と右にビットシフトするLSH(X)と があります。2 進値の入力を容易にするために、定数は のように数値の前に「O」を付けて8 進形式[b]RSH(X)で入力できます。[28]LET A=O41
文字列
SUPER BASICでは文字列定数(リテラル)を一重引用符または二重引用符で囲むことができたので、PRINT "HELLO, WORLD!"またはを使用することができましたPRINT 'HELLO, WORLD!'。[29]
後のBASIC方言とは対照的に、文字列を任意の変数に割り当てることができ、$記号は使用されなかったため、A="HELLO, WORLD!"は有効でした。これにより、ユーザーが数字と文字を組み合わせた値を提供し、SUPER BASICが数字で始まるものはすべて数値であると想定した場合に混乱が生じる可能性がありました。これにより入力が混乱する可能性がある場合にシステムをガイドするために、 を使用して文字列変数を明示的に宣言することがSTRING Aできます。SUPER BASICのすべての変数と同様に、これらは配列にすることができます。STRING A(5)さらに、SUPER BASICは、TEXT文字列要素の長さを定義する2番目のパラメータを取る追加のステートメントを追加しました。したがって、TEXT A(12):10は10文字の要素が12個ある配列を作成し、 はTEXT B(5:10):155..10の6つの要素があり、それぞれが15文字の長さの配列になります。[30]
文字列演算子と関数
SUPER BASICには=比較演算子と+連結演算子が含まれていた。以下の関数が含まれていた: [31]
ASC(S)は、文字列の最初の文字のASCII番号を返します。 CHAR(N)は、MS CHR()と同じ、単一のASCII文字を含む文字列を返します。 COMP(A,B) は 2 つの文字列を比較し、どちらが大きいかに応じて -1、0、1 を返します。 INDEX(A,B)は、A内のBのインデックスを返します。オプションの3番目のパラメータはオフセットの開始点です。 LENGTH(A)、文字列の長さ SPACE(X)は、X個のスペースからなる文字列を返します。 VAL(A)は文字列から数字を探し、それを返します。 STR(N)は数値を文字列に変換します 左(MSと同じ) 右 SUBSTR、MSのMIDとして
ユーティリティ関数
典型的な効用関数も含まれる: [32]
POSはプリントヘッドの列を返しますPOS ( X )はファイル内の位置を返しますTAB ( X )はプリントヘッドを列Xに移動しますTAB ( X , N )はファイル番号N内の同じです日付時刻
PISUPER BASIC には、およびの疑似変数も含まれていました。DPI後者は倍精度であり、前述のように、EPS最小の値を表す も含まれていました。
印刷フォーマット
SUPER BASIC には、 文で使用できる 2 種類の印刷書式設定が含まれていましたPRINT。PRINT IN IMAGE X:は、他の BASIC が またはCやその後継言語で見られるより一般的な例をX使用して実装したものと同様の方法で、に格納された書式文字列を使用しました。フィールド タイプには、整数[33]、指定された 10 進数形式、指数、および文字列とテキストが含まれていました。符号は、整数フィールドまたは実数フィールドのいずれかで 1 桁の数字を示し、E フィールドで 1 桁の数字を示しました。[34]およびは、任意の値のプレフィックスとして使用できます。[35]PRINT USING%# *$
PRINT IN FORMATは、一般的に同じように機能しましたが、違いは、スペースを で明示的に定義する必要があることですB。したがって、書式文字列は、"%% BBB %%.%%"2 つの数値を 3 つのスペースで区切って印刷しますが、これが画像の場合は、"BBB"両側にスペースが 1 つずつ入った状態で が印刷されます。このFORMATバージョンでは、より多様な書式文字列がサポートされ、インライン改行などの項目も含まれていましたが、マニュアルに示されている例では、最終的に同じことを実現するのに、なぜ 2 つのシステムが存在するのかが明確ではありません。[36]
INPUT興味深いことに、だけでなく にも同じフォーマットコマンドを使用できますPRINT。この場合、ユーザー入力は文字列に基づいて適切にフォーマットされるため、フォーマットが の場合は1.2345に切り捨てられる可能性があります。[37]1.2%.%
ファイルI/O
INPUT ON XSUPER BASIC には、 と に基づくファイル入出力システムが含まれていました。PRINT ON XはXファイル ハンドル、つまり数値です。数値は を使用して割り当てられました。はの代替として提供されましたが、内部的には同一です。完了すると、ファイルはまたは を使用して解放できます。[38]ファイルを操作する場合、 を使用して次に読み取る場所を読み取り、 を使用して変更できます。[39]が使用されている場合は、フォーム内の位置を返しました。 [40]ファイル サイズを返しました。[41] は、読み取り中にファイルの終わりに達したかどうかをループでテストするために使用できます。[42]OPEN filename FOR [INPUT|OUTPUT] AS FILE XWRITE ON XPRINT ON XCLOSE XCLOSE filenameLOC(X)LOCATE 100 ON 2 POS(X)IN FORM SIZE(N)ENDFILE(X)
システムには、TEL端末に入力待ちがあるかどうかを返す関数も含まれていました。SUPER BASICプログラムには、次のようなコードが含まれることがよくありました。
100 WAIT ( 1 ); TELしない場合は100
ユーザ入力を待機し、継続する前に毎秒テストする。[43]さらに、とを"TEL"使用して読み取りおよび書き込み用に開くことができる疑似ファイル名が含まれていました。[44]に加えて、 と の両方がテレタイプコマンドも参照しました。[45]OPEN "TEL" FOR OUTPUT AS 2WRITE ON 2 "HELLO WORLD""TEL""T""TELETYPE"
注記
- ^ この用語は JOSS に由来しており、MS 由来の BASIC では一般にこれを「即時モード」と呼びます。
- ^ 16 進数は、ほとんどのマシンが 8 ビット ベースのワードを使用するまで普及しませんでした。SDS 940 などの 6 ビット ベースの時代では、8 進数が一般的でした。
参考文献
引用
- ^ ランプソン、バトラー、「システム」、リサーチ、マイクロソフト
- ^ グレゴリー2018、132ページより。
- ^ abcd グレゴリー2018、133頁。
- ^ ab マニュアル1978年、14ページ。
- ^ マニュアル1978、3ページ。
- ^ マニュアル1978、11ページ。
- ^ マニュアル1978、107ページ。
- ^ マニュアル1978、13ページ。
- ^ マニュアル1978、15ページ。
- ^ マニュアル1978、143ページ。
- ^ マニュアル1978、9ページ。
- ^ ab マニュアル1978年、43ページ。
- ^ マニュアル1978、140ページ。
- ^ abc マニュアル1978、29ページ。
- ^ マニュアル1978、44ページ。
- ^ マニュアル1978、45ページ。
- ^ abc マニュアル1978、47ページ。
- ^ マニュアル 1978、6、7 ページ。
- ^ マニュアル1978、26ページ。
- ^ マニュアル1978、27ページ。
- ^ マニュアル1978、25ページ。
- ^ ab マニュアル1978、7、8ページ。
- ^ マニュアル1978、17ページ。
- ^ ab マニュアル1978年、21ページ。
- ^ マニュアル1978、24ページ。
- ^ マニュアル1978、30ページ。
- ^ マニュアル1978、30、31ページ。
- ^ マニュアル1978、28ページ。
- ^ マニュアル1978、33ページ。
- ^ マニュアル1978、34ページ。
- ^ マニュアル1978、35-37ページ。
- ^ マニュアル1978、18ページ。
- ^ マニュアル1978、51ページ。
- ^ マニュアル1978、52ページ。
- ^ マニュアル1978、53ページ。
- ^ マニュアル1978、55ページ。
- ^ マニュアル1978、60ページ。
- ^ マニュアル1978、71-75ページ。
- ^ マニュアル1978、84ページ。
- ^ マニュアル1978、85ページ。
- ^ マニュアル1978、132ページ。
- ^ マニュアル1978、126ページ。
- ^ マニュアル1978、99ページ。
- ^ マニュアル1978、76ページ。
- ^ マニュアル1978、89ページ。
文献
- SUPER BASIC リファレンスマニュアル。Tymshare。1978 年 2 月。
- グレゴリー、ネイサン(2018)。The Tym Before ... Lulu。ISBN 9781387304059。
