1970年代末から1980年代初頭にかけては、少数のエレクトロニクス好きたちは、8ビットCPUのコンピュータをキットなどから自作しその上でTiny BASICを動かしたり、スタートレックなどのゲームを動かすことなどを楽しんでいた。
だが大多数はコンピュータを実務に使いたいと感じており、キットではなく最初から完成品の、動作することが確実なコンピュータを求めていた。メーカー側はそうした要望に応えてターンキーシステムを開発しそれにBASICインタプリタをROMに書き込んだ形で搭載するようになり、BASICは一気に当時のマイクロコンピュータ(パーソナルコンピュータ)の標準言語の地位を獲得した。この時に搭載されたBASICインタプリタはほとんどがマイクロソフト製で、同社躍進のきっかけとなった。また、マイクロソフト製BASICは中間コードを使用する構造になっており、汎用機を再現した極めてエミュレータに近いランタイム形式の実行環境でもあったため、当時の互換性が皆無なコンピュータ事情の中でも、スクリプト自体の移植は容易だった。
その後、パソコンに操作を提供するのにも使われ、しばしばROM-BASICとしてハードウェアに組み込まれた。電源投入後にエディタ込みで利用できることから、現在における、シェル、インタフェースとしての役割ももち、ローダなどの役割も担った。入力の効率化のため、省略形式での入力や、1980年代後半には、ラベル、インデントへの内部的な対応、C言語への橋渡し、日本では漢字の利用など、様々な機種ごとの独自の発展を遂げた。当時のPCの処理速度は遅いので、処理の高速化が必要な部分はデータ形式でアセンブリ言語による処理を呼び出すなどの手法もとられた。
1980年代後半から1990年代前半ころにはC言語がパーソナルコンピュータのユーザにも少しずつ知られるようになり、BASICの代わりにC言語を使うことが増えていった。
一方で1990年代などでもプログラミングの専門家ではない数学者が、あいかわらず行番号を使用する数値計算用のBASICを開発(UBASIC)していた。 BASICは1970年代後半から1980年代にかけて、当時黎明期にあったパーソナルコンピュータ(マイクロコンピュータ)の各機種に続々と搭載され、業界の発展にも貢献した。 だが、BASICを最初に開発したダートマス大の2人は今で言う「パブリックドメイン」でいいと考えており、また標準化団体のANSIも後手にまわり、BASICには「方言」が乱立した。 マイクロコンピュータやパーソナルコンピュータに標準搭載されたBASICは、たいてい各メーカーの各機種ごとに独自拡張が行われた(おもに画面操作やI/Oの直接操作などについて、独自の仕様が次々と導入された)。コモドール社のPET 2001のCommodore BASICに類似したシャープのS-BASIC、SEGAのベーシックカートリッジ、次第にシェアを増やしたマイクロソフト製のBASIC(MBASIC、BASICA
「方言」の乱立
この結果、「あるパソコンのBASICで書かれたプログラムは、他のパソコンではそのままでは動かすことができない」という状態になった。 初期のTiny BASICはともかくとしても、BASIC実装処理系のメイン・メモリの制限により言語仕様が極めて制限された実装が存在した。 処理プログラムの大きさや速度の制限を改善あるいは回避するテクニックを紹介する。いくつかは、ソースの読みやすさを犠牲にするようなテクニックでもあった。 次のようなコンパイラがある。 しかし、パソコンに内蔵または標準添付されていたインタプリタと違い、コンパイラは別売であったり、高価であったり、実行にはランタイムライブラリを必要であったりする場合があった。このことから、BASICインタプリタによる開発に習熟したユーザーは、より高速で柔軟なプログラムを求めて、機械語(アセンブリ言語)や、C言語などに移行していった。 また、コンパイラと称していても、実際はインタプリタとソースコードを同梱した実行ファイルを作るだけ、というものもある。中間表現と、そのインタプリタ、という構成のものもある。 急速に広まったBASICだが、構造化機能の無いBASICは教育に使うな、などとコンピュータサイエンティストの一部から酷評されたりもした。1975年にはすでに、エドガー・ダイクストラから激しく批判された"How do we tell truths that might hurt?"などが知られる。 行番号とGOTO文は特に激しく批判された。(構造化前の)BASICのIF文とGOTO文を組み合わせて使用する文(「IF .... THEN GOTO ...」)を頻発せざるを得ず、IF + GOTO文を増やすほどスパゲティプログラムになってしまうことはしばしば指摘された。 さらにBASICには局所変数(ローカル変数)が無いなど、他にも問題は多い。つまり、プログラムのどこからでもアクセス可能な大域変数(グローバル変数)しかなく、これもまたスパゲティプログラムを誘発する要因である。
方言の例PC-8800シリーズのN88BASICのドロー画面
カーソル位置を指定するLOCATE文は、別の処理系ではCURSOR文
音楽を演奏するPLAY文、MUSIC文とそれらに記述されるMML
画面モードを指定するCONSOLE文
スプライト機能を使用する命令
VRAMと配列変数の内容をやりとりする命令
条件付きループを実現するWHILE?WEND
GOTO, GOSUB文の飛び先を指定するラベル
CALL, CMD, SETなどで始まる命令文
メイン・メモリの制限による処理系の実装例
数値型は整数型のみ、また数値演算は整数演算のみ
変数名は頭文字1文字または2文字程度しか認識しない
文字列の長さが限られる(255文字など)
配列の大きさ(添字の最大値)が限られる
中間コードサイズを小さくしたり処理を速くする、機種依存性のあるテクニックの例
プログラムの初めに全ての変数のデフォルトを整数だと宣言する(DEFINT A-Z)。これはきちんと%などを付けて整数変数として書いてあるプログラムでは意味がないし、小数演算があるプログラムなのにこれを書くとまともに動かなくなる。整数の範囲の演算しかしていないが、%を付けずに書かれているプログラムを後から改善する場合だけに意味のあるテクニック。
命令を省略形で書く(PRINT→?、LET A=B→A=B、REM→' など)
ただし、中間コードを採用している処理系では、?と入力してもPRINTに展開されるので、結果は変わらない。また、REMを'と書くのはかえってサイズが増える。
余白やコメントを入れない[4]
NEXTの変数名を省略する(可能な処理系のみ)
一行に複数の文を詰め込んで(マルチステートメント)を使用して行の制限一杯に命令文を詰め込む[4]
よく使う変数は早めに確保する(実行時に毎回変数領域の先頭から検索されるため)
よく呼び出すサブルーチンは先頭に配置する(同じような理由。なお、一度通過したGOTO/GOSUB命令のオペランドを内部で行番号からメモリアドレスに書き換える処理系ではあまり効果がない)
キャラクタコードをバイナリと見立て、バイナリに相当するデータを直接プログラムに記述する
コンパイラ
BASCOM(マイクロソフト BASIC-80 CP/M用インタプリタ)
MS-DOS用N88-BASICコンパイラ(日本電気 PC-9800シリーズ)
F-BASIC386コンパイラ(富士通 FM TOWNS)
MSXべーしっ君(アスキー MSX)
実行ファイルは生成しない
X-BASICコンバーター(シャープ X68000)
C言語に変換した上でのコンパイル
FreeBASICコンパイラ(Microsoft Windows、Linux、DOSエクステンダ、Xbox)
フリーでGPL形式の80386向けコンパイラで、現代向けに多数の機能追加が行われている[注釈 1]が、QuickBASICとの互換性もある。
行番号とGOTO文への批判
Size:83 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef