歴史
Applesoft BASIC
Applesoft BASICは、Marc McDonaldとRic Weilandによって開発されたMicrosoft BASICの方言で、Apple IIシリーズのコンピューターに付属しています。これはInteger BASICに取って代わり、元のApple IIモデル以降のすべてのApple IIシリーズコンピュータのROM内のBASICです。また、整数BASICのINTではなく、Apple DOSコマンドを呼び出すために使用されるため、 FP BASIC (「浮動小数点」から)とも呼ばれます。
Applesoft BASICはMicrosoftによって提供され、その名前はAppleとMicrosoftの両方の名前に由来しています。 Randy Wiggintonを含むAppleの従業員は、Microsoftの通訳をApple IIに適合させ、いくつかの機能を追加しました。 Applesoftの最初のバージョンは1977年にカセットテープでリリースされ、高解像度のグラフィックスを適切にサポートしていませんでした。 Applesoft IIは 、カセットとディスク、およびApple II Plusおよびそれ以降のモデルのROMで利用可能になりました。1978年にリリースされました。この後者のバージョンには、いくつかの構文の違いとApple II高解像度グラフィックスのサポートがありますモード。通常、「Applesoft」という用語と同義です。
ApplesoftコンパイラーTASC(AppleSoft Compiler)は 、1981年にMicrosoftによって開発されました。
歴史
Steve WozniakがApple IIのInteger BASICを書いたとき、彼は主にゲームを書くことに興味があったので、浮動小数点演算のサポートを実装しませんでした。 1976年に、MicrosoftはMOS Technology 6502のBASICインタープリターであるMicrosoft BASICを開発しましたが、それを使用する実稼働コンピューターはありませんでした。 Appleが6502マシンを持っていることを知ると、MicrosoftはBASICのライセンスに興味があるかどうかを尋ねましたが、Steve JobsはAppleがすでに持っていると答えました。
Apple IIは1977年4月にWest Coast Computer Faireで公開され、6月に販売可能になりました。コンピューターに関する最も一般的な顧客の不満の1つは、BASICの浮動小数点機能の欠如でした。整数BASICは、-32768〜32767の整数に制限されており、それを使用してビジネスアプリケーションを作成しようとするユーザーに問題を引き起こしました。スティーブウォズニアックは浮動小数点機能をInteger BASICに追加したことはありませんでした。AppleIIで想定した2つの主要なタスクであるゲームおよび教育用ソフトウェアに必要だとは考えなかったからです。浮動小数点機能を追加するのに十分なInteger BASICを十分に理解したWozniakは、Disk IIドライブとコントローラー、およびApple DOSで忙しかったため、AppleはMicrosoftに頼りました。物事をより問題にしているのは、ライバルのコモドールPETパーソナルコンピューターが最初から浮動小数点対応のBASICインタープリターを持っていたことでした。 Applesoftのライセンスは、BASICをCommodoreにPETのライセンスで提供し、予想外にコストがかかることを証明したMicrosoftを破産から救いました。
Appleは、MicrosoftからApplesoft BASICの8年間のライセンスを31,000ドルの定額料金で取得し、1985年にAppleのMacintoshバージョンのBASICの権利とソースコードをMicrosoftに付与する契約により更新したと伝えられています。 ApplesoftはInteger BASICと下位互換性があるように設計されており、Microsoftの6502 BASIC実装のコアを使用します。これには、GETコマンドを使用してキー入力を検出し、プログラム行にスペースを必要としません。 Applesoft BASICはInteger BASICよりも低速ですが、古いBASICにはない多くの機能があります。
- アトミック文字列:文字列はもはや文字の配列ではありません(Integer BASICやCのように)。代わりに、ガベージコレクションされたオブジェクトです(SchemeおよびJavaのように)。これにより、文字列配列が可能になります。 DIM A $(10)は、0〜10の番号が付けられた11個の文字列変数のベクトルになりました。
- 多次元配列(数値または文字列)
- 8ビットの指数と31ビットの仮数の単精度浮動小数点変数、および三角関数や対数関数を含む改善された数学機能
- 高解像度グラフィックスのコマンド
- READおよびRESTOREコマンドを使用した、数値および文字列値を表すDATAステートメント
- 文字列型と数値型の間の変換のためのCHR $、STR $、およびVAL関数(どちらの言語にもASC関数がありました)
- ユーザー定義関数:BASICで記述された、単一のパラメーターを持つ単純な1行関数
- エラートラップ。BASICで書かれたサブルーチンを使用して、BASICプログラムが予期しないエラーを処理できるようにします。
逆に、ApplesoftにはInteger BASICに存在していたMOD(剰余)演算子がありません。
AppleがMicrosoft 6502 BASICのソースリストを受け取ったため、Apple IIにBASICを適合させるのは退屈な仕事でした。これはバグがあり、Integer BASICコマンドの追加も必要でした。 Appleには6502アセンブラーがなかったため、開発チームはソースコードを電話回線でCall Computerに送信することを余儀なくされました。これは、コンパイラーサービスを提供する服装です。これは非常に退屈で時間がかかるプロセスであり、Call Computerが機器の故障によりソースコードを失った後、プログラマーの1人であるCliff Hustonが自分のIMSAI 8080コンピューターを使用してBASICソースをクロスアセンブルしました。
特徴
Applesoftは、Integer BASICから継承された機能を除き、CommodoreのBASIC 2.0に似ています。 Applesoftにはビット単位の演算子がないなど、いくつかの小さな違いがあります。そうしないと、ハードウェアに依存する機能を利用しないほとんどのBASICプログラムが両方のBASICで実行されます。
PR#ステートメントは、出力を拡張カードにリダイレクトするために使用され、IN#は、拡張カードからの入力をリダイレクトするために使用されます。カードのスロット番号は、ステートメント内のPR#またはIN#の後に指定されます。スロットにカードが存在せず、再起動が必要な場合、コンピューターはロックします。 PR#0は出力を40列画面に、IN#0はキーボードに復元します。
PR#ステートメントを使用して、出力をプリンターにリダイレクトできます(例:10 PR#x:PRINT "Hello!")。xは、プリンターポートカードを含むスロット番号です。 BASICプログラムリストをプリンタに送信するには、ユーザーはPR#x:LISTと入力します。プリンターへの出力後、PR#0ステートメントを実行して画面への出力をリセットする必要があります。
PR#6により、Applesoftはディスクドライブを起動します(Disk IIコントローラーはどのスロットにも挿入できますが、通常はスロット6にあります)。 PR#3は、80列のカードが存在する場合、80列のテキストモードに切り替わります。 80列カードには、CHR $関数で生成できる12個の新しい制御コードも追加されます。 MouseText文字セットで強化されたApple IIeおよびIIcモデルには、この機能を有効または無効にする別の2つの制御コードが含まれています。
Commodore BASICと同様に、数値変数は40ビット浮動小数点として保存されます。各変数には5バイトのメモリが必要です。プログラマは、変数にパーセント記号を付けて整数として指定できます。この場合、変数は2バイトを使用し、-32768〜32767の範囲に制限されます。ただし、BASICは内部的にそれらを浮動小数点に変換しますが、各パーセント記号はプログラムコードの追加バイトも使用するため、実際にはこの機能は大きな配列変数のメモリ使用量を削減する場合にのみ役立ちます。
RND関数は、0〜1の擬似乱数の小数を生成します。RND(0)は、最後に生成された乱数を返します。負の数のRNDは、使用される特定の負の数によって決定されるシーケンス内のポイントにジャンプします。正の値を持つRNDは、指定された実際の値に依存せずに、シーケンスから新しい乱数を生成します。乱数は、以前に生成された値に基づく式を介して生成されるため、真にランダムではありません。システムがユーザーのキーストロークを待っている間、連続して値を循環する$ 4Eと$ 4Fの場所をPEEKして、真にランダムな値を提供し、RNDのシード(否定時)として使用できます。
Microsoft BASICの他の実装と同様に、Applesoftはプログラム行のスペース(文字列とコメントの外側)を破棄します。 LISTは、読みやすくするためにコードを表示するときにスペースを追加します。 LISTコードは、トークン化されたキーワードごとにANDの前後にスペースを追加するため、多くの場合、読みやすくするには十分な2つのスペースが連続して生成されます。
INPUTのデフォルトのプロンプトは疑問符です。 PRINTは、数字の前に先行スペースを追加しません。
Colecoは、AdamホームコンピューターのSmartBASICはApplesoftとソースコード互換であると主張しました。 Microsoftは、Applesoftと互換性のあるBASICを、Laser 128クローンのVTechにライセンスしました。
制限事項
Apple IIの初期のいくつかのモデルを通じて、Applesoft BASICは文字列以外のプログラムでの小文字の使用をサポートしていませんでした。 (したがって、Applesoftは小文字を表示できますが、プログラムの一部として認識することはできません。したがって、PRINTは有効なコマンドですが、printとPrintは認識できず、構文エラーが発生します。)
Applesoftには、次のようなほとんどの6502以外のMicrosoft BASICインタープリターに共通するいくつかのコマンドと機能がありません。
- INSTR(指定されたストリング内のサブストリングを検索)
- PRINT USING(印刷出力での数値の書式設定)
- INKEY $(プログラムを停止せずにキーを押して確認してください)が、PEEKの場所がこの機能を提供します。
- LPRINT(印刷されたコンテンツを画面ではなくプリンターに出力)
Applesoftは、以前のInteger BASICのように、プログラムをカセットテープに保存したり、カセットテープからロードしたりする機能以外に、ファイルやディスクを処理するための組み込みコマンドを備えていません。単にDOSとして知られるApple IIディスクオペレーティングシステムは、そのような機能を提供するために言語を強化します。
Integer BASICとは異なり、Applesoft BASICの変数名は2文字のみで重要です。より長くすることができますが、最初の2文字のみが使用されます。たとえば、「LOW」と「LOSS」は同じ変数として扱われ、「LOSS」に値を割り当てようとすると、「LOW」に割り当てられた値が上書きされます。さらに、言語はトークン化を使用しているため、プログラマーはApplesoftのコマンドまたは操作でもある連続した文字の使用を避ける必要があります(ORをブール演算子として解釈し、SCをレンダリングするため、変数に「SCORE」という名前を使用できません)または、「GR」コマンドが低解像度グラフィックモードを呼び出し、この場合は構文エラーを作成するため、「BACKGROUND」を使用することもできません。
サウンドとグラフィックス
唯一のサウンドサポートは、ASCIIベル文字を印刷してシステムアラートビープ音を鳴らすオプションと、スピーカーをクリックするPEEKコマンドです。この言語は、繰り返されるクリックからバリトン以上の話題を生み出すほど速くはありません。ただし、プログラムは、数オクターブにわたる電子音を生成するために呼び出される機械語ルーチンを保存できます。
Applesoftは、Apple II loresグラフィックディスプレイをサポートしています。このディスプレイでは、個々のブロックと水平線または垂直線をプロットするコマンドを使用して、水平方向に40色、垂直方向に最大48ブロックの16色を表示できます。採用モードと同様に、ポイントを描画するコマンドを使用して、6色(16色のロアパレットの固定サブセット)を解像度280×192、垂直192(水平配置に制限あり)で表示できます。画面上の斜めの線。 Apple IIeから、Apple IIIコンピュータで導入されたモードに基づく新しい「倍高解像度」モードが、128kのメモリを搭載したマシンで利用可能になりました。このモードは、元の採用モードの解像度を本質的に複製しますが、16色すべてのloresパレットを含みます。ただし、Applesoftはこのモードのサポートを提供しておらず、それを利用するために補足の機械言語ルーチンに依存する必要があります。 Apple IIgsの追加の新しいグラフィックモードも同様にサポートされていません。
Apple IIの限られた「ハードウェア分割画面」(画面の下部にある4行のテキスト)を除き、テキストとグラフィックスを混在させることはできません。
ベクターベースのシェイプテーブルは、ハイレゾグラフィックスでオブジェクトを描画するために使用できますが、ビットマップを直接描画するルーチンと比較すると低速です。また、水平線と垂直線の定義のみをサポートします。対角線と曲線はサポートされていませんが、形状をさまざまな角度に回転して描画できるため、表面上は水平または垂直として定義された線が斜めに表示されます。さらに、図形をより大きなサイズに拡大して描画できます。
拡張機能
Applesoft BASICは、アンパサンド(&)コマンドとUSR()関数の2つの方法で拡張できます。これらは、メモリに格納された低レベルの機械語ルーチンを呼び出す2つの機能です。これは、高速である必要がある、またはメモリ内の任意の関数またはデータに直接アクセスする必要があるルーチンに役立ちます。 USR()関数は1つの数値引数を取り、計算された関数値を導出して返すようにプログラムして、数式で使用できます。 「&」は、CALLの短縮形であり、アドレスは事前に定義されています。
虫
ApplesoftのONERRによるエラートラッピングの不足は、エラー処理ルーチンがRESUMEを呼び出さなかった場合にシステムスタックがリセットされず、潜在的にクラッシュすることを意味します。 RESUMEを使用しないエラー処理は、ルーチンを終了する前に、CALL -3288または(同等の)62248の問題を回避できます。
性能
ウォズニアックは元々、彼のInteger BASICを「Game BASIC」と呼んでいました(新しいコンピューターにBreakoutクローンを実装できるように書いたため)。 Applesoft BASICで記述されたアクションゲームはほとんどありません。ほとんどの場合、すべての数学演算に浮動小数点数を使用するとパフォーマンスが低下するためです。
Applesoft BASICプログラムは、リンクされた行のリストとして保存されます。 GOTOまたはGOSUBには線形時間がかかります。一部のプログラムには、呼び出し時間を短縮するためにサブルーチンが上部にありました。
Integer BASICが行うこととは異なり、Applesoft BASICは、ソース行が入力された時点で、ソースコード内のリテラル番号を内部バイナリ形式に変換しません。むしろ、数字の文字列は入力されたとおりに保存され、行が実行されるたびに実行時に比較的遅い変換が発生します。多くの場合、変数のルックアップはこの変換よりも高速なので、ループに入る前に、変数内のループ内で使用される数値定数を保存する方が一般的に高速です。
サンプルコード
Applesoft BASICのHello Worldは、次のように入力できます。
コロン(:)で区切ると、同じコード行に複数のコマンドを含めることができます。 ? Applesoft BASIC(およびMicrosoft BASICのほぼすべてのバージョン)で「PRINT」のショートカットとして使用できますが、単語のスペルは受け入れられるだけでなく、正規のものです。Applesoftは「?」を変換しました。 「PRINT」と同じトークンに入力されたプログラムでは(したがって、「?」を使用して実際にメモリが保存されることはありません)、したがって、プログラムがリストされると「PRINT」として表示されます。上記のプログラムは、LISTコマンドに次のように表示されます。
Applesoft II BASICが1978年半ばに最初にリリースされたとき、カセットテープで提供され、Apple IIのマシン言語モニタを介してメモリにロードできました。 1979年に元のIIが強化されたApple II +に置き換わったとき、ApplesoftはROMに含まれ、起動可能なフロッピーディスクが存在しない場合は電源投入時に自動的に起動しました。逆に、Integer BASICはROMから削除され、DOS 3.3ディスク上の実行可能ファイルに変わりました。
初期の進化
1977年11月のリファレンスマニュアルに記載されているようにRAMに保存された元のApplesoftは、後のApplesoft IIよりも小さなインタープリターコードを持ち、8 kbのメモリを占有します10。