BASIC(ベーシック)は手続き型プログラミング言語のひとつ。

名前は「beginner's all-purpose symbolic instruction code」(「初心者向け汎用記号命令コード」を意味する)のバクロニムである。

概要

いくつかの点でFORTRANに似ている。構文は、FORTRANの構文を知っていれば全然違うと感じるはずだが、FORTRANの文法が基になっているとしばしば解説されている。初心者向けのプログラミング言語として、1970年代以降のコンピュータ(特にパソコン)で広く使われた。標準規格であるFull BASICの仕様は、よく知られているBASICとは異なり構造化などがきちんとしており、また Microsoft Visual Basic .NET の仕様はよく知られているBASICとは全く異なりむしろFull BASICに近い、現代における有力な言語環境のひとつである。

プログラム例と出力例

画面に次のように入力したとする。

 10 REM 5つ数える
 20 FOR I = 1 TO 5
 30 PRINT I
 40 NEXT
 RUN

RUN命令を入力すると、それ以前に入力されたプログラムが実行される。この場合の出力は次のとおり。

1
2
3
4
5

また、プログラムに編集を加えたい場合、続いて例えば次のように入力する。

 10 REM 5つ数える(3だけ飛ばす)
 25 IF I = 3 THEN GOTO 40
 RUN

このように入力すると、10で始まる行が書き換えられ、20行目と30行目の間に25行目が挿入される。この場合の出力は次のとおり。

1
2
4
5

主な特徴

  • 歴史的な経緯から、FORTRANやパソコンではC言語と比較されることが多い。
  • 高水準言語である。
  • ダートマスBASICはコンパイルしているが)インタプリタとして実装された処理系が多い。
  • 編集環境を兼ねた一種のシェルのようなコマンドラインインタプリタを持つものも多いが、LISPread-eval-print loop英語版(REPL)のように洗練されたものではない。
  • 古いBASICではすべての行頭に行番号を必要とし、GOTO文などの飛び先は行番号で指定する。行番号は、テレタイプ端末時代に処理系と一体の行指向テキストエディタで扱うのに便利であった。現在でも互換性のために両者を残している処理系もある。
  • 本来は、RUNなどのように、プログラム外から処理系に指示を与えるものはコマンド命令)、FORなどのようにプログラム中のものはステートメント)、と、本来は(ダートマスBASICでは)明確な区別があったが、次第に混同されていった。
  • プログラム中の予約語(キーワード)には文の他に関数がある。それらと同じ名前を変数に使うことはできない(Tiny BASIC等では変数は一文字といったものも多い)。
  • 文字列変数の内容等を除いて、大文字と小文字を区別しない。入力の時点で全て大文字に変換される処理系もあった。
  • 算術演算子以外の記号は極力使わない。論理演算子はANDORXORNOTである。括弧演算の優先順位も、関数引数も、配列もすべて「()」のみを用いる。ブロックも「{}」のような括弧ではなく「FOR文からNEXT文までの間」といった構文により指定する。
  • 代入と比較はどちらも「=」である。代入はLET文とするのが本来の形だが(文は全てキーワードから始まる、という規則により)、「A = 1」のような、キーワード「LET」を省略した代入の構文が好まれた。
  • ファーストクラスの型は数値型と文字列型である。数値は浮動小数点数だけのものもあるが、整数型などがあるものもある。文字列型の変数名は末尾に「$」を付ける、といった規則のものもある。
  • LEFT$, MID$, RIGHT$など、文字列操作関数が豊富なことが多い。
  • 明示的な変数宣言を必要とせず、変数を使用し始めたところで宣言したものと解釈される。
  • 使ったことのない変数を使うと勝手に変数が作られ、また中身は自動的に初期化される(数値型は0、文字列型は空文字列)。
  • プログラムは先頭行から実行される。

歴史

1964年米国ダートマス大学にて、数学者ジョン・ケメニー1926年-1992年)とトーマス・カーツ(1928年-)により、教育用などを目的としてダートマスBASICが開発された。これは同時期にともに開発された、タイムシェアリングシステムDTSS上のラインエディタ(テレタイプ端末環境)で利用されるよう設計されていた。

BASICは、GEとの提携を経て、学外にも普及した。ダートマス大学のオリジナルはコンパイラだったが(ただし、完全オンメモリ動作・1パスという、きわめて軽く動作するものであり、言語仕様もそのような「軽い」コンパイルのために設計されている)パソコンなどの商用版では基本機能を最小限にしたうえでインタプリタとして実装されることが多く、独自の発展を遂げた。

8ビットパソコンの普及とBASIC

1970年代末から1980年代初頭にかけて、8ビットCPUを使った自作コンピュータTiny BASICを動かし、その上でゲームを実行させる(スタートレックゲーム等)のがホビーストの目標となった。

同時に、メーカー製のターンキーシステムにBASICインタプリタがROMの形で搭載されはじめ、一気に当時のマイコンにおける標準言語の立場を獲得した。この時に搭載されたBASICインタプリタはほとんどがマイクロソフト製で、同社躍進のきっかけとなった。また、マイクロソフト製BASICは、中間コードを使用する構造になっており、また汎用機を再現した極めてエミュレータに近いランタイム形式の実行環境だったため、当時の互換性が皆無なコンピュータ事情の中でも、スクリプト自体の移植は容易だった。

その後、(MS-DOS発表以前の)パソコンに、操作を提供するのにも使われ、しばしばROM-BASICとしてハードウェアに組み込まれた。 電源投入後にエディタ込みで利用できることから、現在における、シェル、インタフェースとしての役割ももち、ローダなどの役割も担った。 入力の効率化のため、省略形式での入力や、1980年代後半には、漢字の利用や、ラベルインデントへの内部的な対応、C言語への橋渡しなど、様々な機種ごとの独自の発展を遂げた。

他の言語の進化に伴いBASICはあくまで初心者向けの言語でありプロにとっては論外のものということになった。しかし一方でプログラミングの専門家以外の人がプログラミングをするのにBASICが重宝されることも依然多い。例えばUBASIC十進BASICはいずれも数学者が開発したものである。 また、当時のPCの処理速度から、処理の高速化が必要な部分はデータ形式でアセンブリ言語による処理を呼び出すなどの手法もとられた。

互換性とBASIC

各メーカーのパソコンに標準搭載されたBASICは、機種ごとに画面操作やI/O直接操作などの独自拡張が行われた。マイクロソフト製(MS-BASICBASICAG-BASICGW-BASICの移植版)のものや、その命令体系を引継ぎ実装したものである、F-BASICHu-BASICカタカナで表現するG-BASIC(前述のマイクロソフトの物とは異なる)、PETに由来するS-BASICSEGAのベーシックカートリッジ、Cを意識したX-BASICなど各社が独自にBASICを開発し、いわゆる「方言」が生まれた。この結果、たとえBASICのメーカーが同じでも「あるパソコンで作ったBASICプログラムは、他のパソコンではそのままでは動かすことができない」ことの方がずっと多かった。

もっとも当時は群雄割拠の時代でもあり、特に市販ソフトが満足に出なくなったパソコンにおいては、BASICは重要な役割を果たした。

方言の例

  • カーソル位置を指定するLOCATE文は、別の処理系ではCURSOR
  • 音楽を演奏するPLAY文、MUSIC文とそれらに記述されるMML
  • 画面モードを指定するCONSOLE
  • スプライト機能を使用する命令
  • VRAMと配列変数の内容をやりとりする命令
  • 条件付きループを実現するWHILEWEND
  • GOTO, GOSUB文の飛び先を指定するラベル
  • CALL, CMD, SETなどで始まる命令文

メイン・メモリの制限による処理系の実装例

初期のTiny BASICはともかくとしても、BASIC実装処理系のメイン・メモリの制限により言語仕様が極めて制限された実装が存在した。

  • 数値型は整数型のみ、また数値演算は整数演算のみ
  • 変数名は頭文字1文字または2文字程度しか認識しない
  • 文字列の長さが限られる(255文字など)
  • 配列の大きさ(添字の最大値)が限られる

中間コードサイズを小さくしたり処理を速くする主なテクニック

処理プログラムの大きさや速度の制限を改善あるいは回避するテクニックを紹介する。いくつかは、ソースの読みやすさを犠牲にするようなテクニックでもあった。

  • プログラムの初めに全ての変数のデフォルトを整数だと宣言する(DEFINT A-Z)。これはきちんと%などを付けて整数変数として書いてあるプログラムでは意味がないし、小数演算があるプログラムなのにこれを書くとまともに動かなくなる。整数の範囲の演算しかしていないが、%を付けずに書かれているプログラムを後から改善する場合だけに意味のあるテクニック。
  • 命令を省略形で書く(PRINT?LET A=BA=BREM' など)
ただし、中間コードを採用している処理系では、?と入力してもPRINTに展開されるので、結果は変わらない。また、REM'と書くのはかえってサイズが増える。
  • 余白やコメントを入れない
  • NEXTの変数名を省略する(可能な処理系のみ)
  • 一行に複数の文を詰め込んで(マルチステートメント)を使用して行の制限一杯に命令文を詰め込む
  • よく使う変数は早めに確保する(実行時に毎回変数領域の先頭から検索されるため)
  • よく呼び出すサブルーチンは先頭に配置する(同じような理由。なお、一度通過したGOTO/GOSUB命令のオペランドを内部で行番号からメモリアドレスに書き換える処理系ではあまり効果がない)
  • キャラクタコードをバイナリと見立て、バイナリに相当するデータを直接プログラムに記述する

コンパイラ

次のようなコンパイラがある。

しかし、パソコンに内蔵または標準添付されていたインタプリタと違い、コンパイラは別売であったり、高価であったり、実行にはランタイムライブラリを必要であったりする場合があった。このことから、BASICインタプリタによる開発に習熟したユーザーは、より高速で柔軟なプログラムを求めて、機械語アセンブリ言語)や、C言語などに移行していった。

また、コンパイラと称していても、実際はインタプリタとソースコードを同梱した実行ファイルを作るだけ、というものもある。中間表現と、そのインタプリタ、という構成のものもある。

構造化とBASIC

急速に広まったBASICだが、構造化機能の無いBASICは教育に使うな、などとコンピュータサイエンティストの一部から酷評されたりもした。BASIC批判の急先鋒としてはエドガー・ダイクストラ1975年の発言[1]などが知られる(Apple IIなどのパソコンが普及する以前の発言であることに注意)。

局所変数が無いことなど問題は多いが、しばしばGOTOのような見た目にわかりやすい事柄ばかりが取り上げられがちである。

標準化

基本BASIC

BASICの標準化が望まれたが、マイコンの急激な発展と、各メーカーの独自拡張が魅力であったという事情により、結局どの機種のBASICでも変わりが無いようなごく基本的な機能に絞った仕様が標準として制定された。ANSI X3.60-1978「American National Standard for the Programming Language Minimal BASIC」は、日本では JIS C 6207-1982「電子計算機プログラム言語 基本BASIC」として規格化された。制定直後にJISの分類の再編があり、電気電子のCから情報のXに移動してJIS X 3003となったが、次節のFull BASICのJIS化の際に改訂として同じ番号を使うという形で旧規格として消滅した。

日本では1990年代後半から、高等学校大学入試センター試験の数学に、標準化された基本BASICの範囲で書かれたプログラミングが扱われるようになった。

Full BASIC

ダートマスBASICは、他のBASIC(ケメニーらは「ストリート」BASIC、と呼んだ[2])とは異なって既に1970年代後半から構造化などが進んでおり、ANSIでは新しい規格の策定も進んでいたが、これをパソコン向けにアレンジしたTrue BASICが、1984年に開発された(日本ではクレオから発売)。構造化の他、行列演算の機能など、学術的(特に数学的)な方面の拡張も特徴である。そしてTrue BASICとほぼ同一の構造化BASICであるFull BASICISO/IEC 10279 (Information technology−Programming languages −Full BASIC)が1991年に INCITS/ISO/IEC JTC 1によって、JIS は JIS X 3003:1993『電子計算機プログラム言語 Full BASIC // The Programming Language Full BASIC』 が1993年に規格化された。

Full BASICの主な特徴
  • 構造化に対応する制御文を追加した(DOLOOPDO WHILELOOP WHILEなど)
    • 行番号やGOTOを使用しなくて済むようになった
    • IF文が多行に渡るブロックIFIFTHENELSEENDIF)も可能となった
  • LETを省略できないようにした(True BASICではOPTION NOLETまたはNOLETを実行すると省略可能)
  • スコープの概念を取り入れた
    • サブルーチンSUBEND SUB)や関数FUNCTIONEND FUNCTION)の中でローカル変数が使用できるようになった
    • サブルーチンと関数は戻り値を戻すかどうかで区別される
    • 再帰処理の実装が容易になった
  • 計算精度や丸めの方法を規定した
  • 配列の添字を1から始めるようにした(OPTION BASE命令で0から始まるようにすることも可能)
  • 行列演算機能
  • 構文のアドホックな所などを極力排除した
  • 予約語を極力少なくした
  • I/Oを直接操作するなどシステムに干渉する命令は持たないようにした(True BASICでは拡張ライブラリとして提供)
  • グラフィック命令を規定した。なお、(0, 0) が、デフォルトでは、コンピュータ系に多い左上ではなく数学などで伝統的な左下である(変更できる。高機能なBASICに多かった、任意にスクリーンとウインドウのそれぞれの座標を設定できるタイプである)
  • Minimal BASICの上位互換である
    • 使用する必要はないが、行番号やGOTOなども規格としては残っている
    • パソコン向けのそれまでのBASICとは命令の互換性が低い

その他の現代化BASIC

QuickBASIC

マイクロソフトはFull BASIC規格の策定には参加しなかったが、1985年にFull BASICに類した構造化や特徴を追加した独自規格のQuickBASICを発売した。これは自社のMS-DOS用のGW-BASICの上位互換で、コンパイラ並に動作を高速にした上にコンパイルも出来るようにしたもので、Version4.5まで発売した後に1991年Visual Basicへと繋がっていった。

QuickBASIC との互換性を考慮したフリーなBASICとしてQB64英語版FreeBASICがある。

RATBAS

構造化ということを意識していなかったパソコン用のROM/Disk-Basic環境で、構造化プログラムを記述するために作られたプリプロセッサである。アスキーの書籍の形(アスキー書籍編集部編著「構造化BASIC RATBASのすすめ」 (ISBN 978-4-87148-152-6) )で、1985年に公開された。

これは、独自の構造化された構文で記述されたソースプログラムを処理し、行番号やGOTO文を使うROM/Disk-Basicに変換するプログラムで、すべてBasicで記述されていた。RATBASという名前は構造化FortranのRatforなどに倣ったものである。

RATBASは、スタンドアローンのBasicプログラムと、μ-UXの外部コマンドとして作成されたサブセット版がある。μ-UXとは、年刊AhSKI!1984年号に掲載された、Disk-Basicで記述されたUnix風のオペレーティング環境であるUni+を拡張したものである。

その他

海外ではボーランドが独自にALGOL風の拡張を施したTurbo Basicを発売した。

GUI時代とBASIC

近年ではマイクロソフトの独自拡張によるRAD環境Visual Basic (VB) や、MS Officeなどで動作するそのサブセットVisual Basic for Applications (VBA)がWindowsにおける代表的なプログラミング言語のひとつとして広く利用されている。もっともVisual Basicは、GUIに特化したRAD環境として大幅に拡張が施され、元のBASIC言語とは、かけ離れてしまっている。

BASICは依然として初心者向けの言語ではあるが、パソコンに添付されることはなくなった。プログラムの入門でもBASICを使わず、最初からC言語などで教える教育機関も多い。無料で使えるJavaなどの、洗練された後発言語の普及により、開発環境としては選択肢の一つでしかなくなった。

また、コンパイラで開発した場合、実行ファイルとは別に、巨大なランタイムライブラリが必要となる処理系が多い。このため配布に必要なファイルのサイズが大きくなり、敬遠されることがある。それでもBASICは、依然として使われているのも事実である。

オブジェクト指向とBASIC

現在、BASICもオブジェクト指向化が見受けられる。その代表例がVisual Basic.NETREALbasicActiveBasicFreeBASIC等で、四者とも既に完全なオブジェクト指向言語になっていると言える。

主なBASIC

現在のパソコンのBASIC

マイクロソフトBASIC・ならびにその類似系

独自系

  • FutureBASIC (Mac OS、構文はQuickBASIC互換)
  • BCX(GPLv2 + BCX例外ライセンスのオープンソースソフトウェア BASIC → C言語トランスレータでインラインC/C++およびアセンブリを扱えるなどの特徴を持つ)
  • UBASIC (DOS用フリーウェア 多倍長演算に特化)
  • DarkBASIC (ゲーム製作に特化したBASIC言語、Windows専用、特に3Dゲーム)
  • GLBasic (GCCコンパイラを内部で利用するマルチプラットフォーム開発環境)

Full BASIC系(規格準拠)

旧式構文系

  • Chipmunk Basic(Windows・Mac OS・UNIX用フリーウェア、インタプリタのみ)

AndroidのBASIC

[4]

iPhone / iPadのBASIC

ゲーム機などのBASIC

過去のパソコンなどのBASIC

独自系

マイクロソフト系

これらは命令セットの仕様が共通なだけで、必ずしもマイクロソフト製というわけではない。

コモドール系

MZ-80KPET 2001の影響を強く受けていることもあり、シャープ純正のBASICの命令セットは互換性のため後継製品もそれに準拠して独自拡張した物となっている。

Web系

脚注

[ヘルプ]
  1. ^ en:Edsger_W._Dijkstra#How_do_we_tell_truths_that_might_hurt.3F_.281975.29
  2. ^ 英語で「走り屋による競走」を意味する Street racing英語版 といったような street の語義を意識して使っている。
  3. ^ 十進BASICのホームページ
  4. ^ AndroidでBASIC!で遊ぼう[改訂版]kindle 2016年11月20日 発行 著者:BASIC!友の会 発行:BASIC!友の会出版

関連書籍

  • マイコンBASIC互換表 CQ出版社
  • Kemeny, John G. & Kurtz, Thomas E. (1985). Back to BASIC: The History, Corruption and Future of the Language. Addison-Wesley Publishing Company, Inc. ISBN 0-201-13433-0.
    • 松田健生訳、市川新解説(1990)『バック・トゥ・BASIC 開発者が語る言語の歴史と設計思想』啓学出版ISBN 4-7665-1074-7