BASIC
BASIC(ベーシック)は手続き型言語のひとつ。
名前の語源は「beginner's all-purpose symbolic instruction code」(「初心者向け汎用記号命令コード」を意味する)の頭字語、または、基礎のFORTRAN言語を意味する「basic FORTRAN」ともいわれる。
目次 |
[編集] 概要
FORTRANの文法が基になっており、初心者向けのコンピュータ言語として、1970年代以降のコンピュータ(特にパソコン)で広く使われた。パソコンがCUI環境からGUI環境となった現在でも、Microsoft Windowsアプリケーションの主力開発言語であるVisual 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言語と比較されることが多い。
- 対話型の編集・実行環境がある(コマンドライン型のコンパイラ以外)。
- 古い処理系ではすべての行頭に行番号を必要とし、分岐を
GOTOに依存する。行番号は、BASIC処理系が主にラインエディタ機能を有しており、編集するプログラムの行を指定するのにもちいられた。現在でも互換性のために両者を残している処理系もある。 - 初心者に優しい字句の方針を持つ。
- 予約語の大文字と小文字を区別しない。大文字を基本とする処理系が多く、強制的に大文字に変換される処理系もあった。
- 算術演算子以外の記号は極力使わない。論理演算子は
AND、OR、XOR、NOTである。括弧は演算の優先順位も、関数の引数も、配列もすべて「()」のみを用いる。ブロックも「{}」のような括弧ではなく「FOR文からNEXT文までの間」といった構文により指定する。 - 等価演算子に数学と同じ表記の「
=」が使える。代入構文(LET文およびその省略形)で用いられた場合に代入演算子と解釈される。C言語では代入演算子と区別するため等価演算子に「==」が使われるため、誤って「=」とされるミスが発生するが、BASICではそのような問題は起こらない。
- プログラムは命令と関数からなる。これらの名は予約語とされ、変数名に用いることはできない。
- 変数は基本的に実数型と文字列型である。中でも文字列操作は柔軟にできるようになっている。文字列型は変数名の末尾に「
$」をつけて区別することが多い。 - 命令文は改行で区切る。
- 一行に複数命令を詰め込めるよう「マルチステートメント」という独自の区切り記号(
:)を実装した処理系も多い。 - 字下げは必須ではない(書き方としては推奨される)。
- 一行に複数命令を詰め込めるよう「マルチステートメント」という独自の区切り記号(
- 実行は基本的に行頭から行われる(
MAINを持つ処理系もある)。 - 高級言語である(ただし、低水準の操作を拡張されたものも多い)。
- その他にも初心者への配慮が見られる。
- 恒等式と混乱されがちな代入文を、
LET文を用いることで「LET A=2」(Let A equal 2:「Aを2と同じにしなさい」)と読め、意味がつかみやすくなる。LETは省略可能であり、初心者の理解のためにのみ存在する命令である。 - 画面出力の
PRINT文は既定で改行され、改行せずに続けたいときには「;」をつける。これは多くの言語に見られる改行文字(CR LF)による改行に比べ処理系の実装に手間がかかるが、人間には優しい。
- 恒等式と混乱されがちな代入文を、
[編集] 主な予約語と構文
後述の方言のため、処理系によっては存在しないか名前が違うものもある。
- 命令
IF 〜 THEN 〜 ELSE- 条件分岐ELSEに対応しない処理系もある
FOR 〜 NEXT- ループ構文END- プログラム終了READ〜DATA- データを変数に代入- 読む
DATAの位置を指定するにはRESTORE命令を使う
- 読む
DIM- 配列変数の宣言REM- コメント行LET- 変数代入(省略可能な処理系が多い)MAT- 行列処理PRINT- 文字列表示LPRINT- プリンタ印字PRINT~USING- 書式付き文字列表示- これらの出力は自動的に改行される。それを避ける場合は末尾に「
;」(改行なし)や「,」(タブ区切り)を付ける。
- これらの出力は自動的に改行される。それを避ける場合は末尾に「
INPUT- 対話型入力POKE- メモリ領域の直接操作
- 関数
CHR$- アスキーコードから文字に変換VAL- 文字列を数値に変換MID$- 文字列操作関数RND- ランダム関数INPUT$- 1文字入力PEEK- メモリ領域の直接参照
- 演算子
+- 加算-- 減算*- 乗算/- 除算(実数)¥- 除算(整数)※一部の処理系のみMOD- 剰余 ※Full BASICではMOD$関数を使用^- べき乗OR- 論理和AND- 論理積XOR- 排他的論理和>,<- 大小比較=- 等号・または(LETでの)変数代入<>- 不等号=>,>=- 以上<=,=<- 以下
[編集] 非構造的な構文
主に旧世代のパソコンのBASICで実装されていた。処理系によっては、互換性のために残している。
GOSUB(GO SUB) 〜RETURN- サブルーチン分岐、復帰GOTO(GO TO) - 強制分岐ON〜GOSUB- 条件つきサブルーチン分岐ON〜GOTO- 条件つき強制分岐
[編集] 実行制御・編集支援命令
主に旧世代のパソコンのBASICで実装されていた。
AUTO- 行番号自動入力支援RENUM- 行番号の一括付け直しRUN- プログラム実行NEW- プログラム全消去LIST- プログラムの表示TRON- Trace On (実行中の行番号を表示する)TROFF- Trace Off (TRON解除)LOAD- ディスクからプログラムファイルの読み込みCLOAD- テープからプログラムファイルの読み込みSAVE- ディスクへプログラムファイルを保存CSAVE- テープへプログラムファイルを保存FILES- ディスクファイルの一覧
[編集] 歴史
1964年、米国ダートマス大学にて、数学者ジョン・ケメニー(1926-1992)とトーマス・カーツ(1928-)により、コンピュータ教育用の言語として開発された。これは同時期にともに開発された、タイムシェアリングシステム DTSS 上のラインエディタで利用されるよう設計されていた。
BASICは、GEとの提携を経て、学外にも普及した。ダートマス大学のオリジナルはコンパイラだったが、パソコンなどの商用版では基本機能を最小限にしたうえでインタプリタとして実装されることが多く、独自の発展を遂げた。
[編集] 8ビットパソコンの普及とBASIC
1970年代末から1980年代初頭にかけて、8ビットCPUを使った自作コンピュータでTiny BASICを動かし、その上でゲームを実行させる(スタートレックゲーム等)のがホビーストの目標となった。
同時に、メーカー製のターンキーシステムにBASICインタプリタがROMの形で搭載されはじめ、一気に当時のマイコンにおける標準言語の立場を獲得した。この時に搭載されたBASICインタプリタはほとんどがマイクロソフト製で、同社躍進のきっかけとなった。また、マイクロソフト社製BASICは、中間コードを使用する構造になっており、また汎用機を再現した極めてエミュレータに近いランタイム形式の実行環境だったため、当時の互換性が皆無なコンピュータ事情の中でも、スクリプト自体の移植は容易だった。
その後、(MS-DOS発表以前の)パソコンに、操作を提供するのにも使われ、しばしばROM-BASICとしてハードウェアに組み込まれた。 他の言語の進化に伴いBASICはあくまで初心者向けの言語でありプロにとっては論外のものということになった。しかし一方でプログラミングの専門家以外の人がプログラミングをするのにBASICが重宝されることも依然多い。例えばUBASICや十進BASICはいずれも数学者が開発したものである。
[編集] 高校数学におけるBASIC
日本では一時期多くの人がPC-9801を使っていたため、1990年代後半から行番号つきのN88-BASIC風のBASICが高等学校の数学の教科書やセンター試験に取り上げられた。しかし当時はウェブ上でフリーのBASICが豊富に入手できる時代の前であり、かつWindows時代になりPC-9801は完全に廃れていたため、「BASICを試したくてもその場がない」という事態に陥り、その意義が問われることもあった。現在は様々なBASICが容易に入手可能であり、教育現場では特に十進BASIC等が使われている。
[編集] 互換性とBASIC
BASICは、FORTRANやCOBOLと同様、ANSI、ISO、JIS (JIS X2002) などで言語仕様が規格化された。この規格BASICは後年、「Minimal BASIC」と呼ばれた。当時のコンピュータの能力を考慮して、規定された文法などの事項はごく最小限だったが、1970年代から1980年代にかけてのパソコンの発展はめざましく、Minimal BASIC規格が陳腐化するのも早かった。実際に規格にそった言語仕様を持った実装系は汎用コンピュータ用のオマケ程度のものは存在したが、パソコン用としてはほとんどなかった。
各メーカーのパソコンに標準搭載されたBASICは、機種ごとに画面操作やI/O直接操作などの独自拡張が行われた。マイクロソフト製(MS-BASIC、BASICA、G-BASIC、GW-BASICの移植版)のみならず、F-BASIC、S-BASIC、Hu-BASICなど各社が独自にBASICを開発し、いわゆる「方言」が生まれた。この結果、たとえBASICのメーカーが同じでも「あるパソコンで作ったBASICプログラムは、他のパソコンではそのままでは動かすことができない」ことの方がずっと多かった。
もっとも当時は群雄割拠の時代でもあり、特に市販ソフトが満足に出なくなったパソコンにおいては、BASICは重要な役割を果たした。
[編集] 方言の例
- カーソル位置を指定する
LOCATE文は、別の処理系ではCURSOR文 - 音楽を演奏する
PLAY文、MUSIC文とそれらに記述されるMML - 画面モードを指定する
CONSOLE文 - スプライト機能を使用する命令
- VRAMと配列変数の内容をやりとりする命令
- 条件付きループを実現する
WHILE~WEND GOTO,GOSUB文の飛び先を指定するラベルCALL,CMD,SETなどで始まる命令文
[編集] メイン・メモリの制限による処理系の実装例
初期のTiny BASICはともかくとしても、BASIC実装処理系のメイン・メモリの制限により言語仕様が極めて制限された実装が存在した。
- 実数型の実装は整数型・演算のみ
- 変数名は頭文字1文字または2文字程度しか認識しない
- 文字列の長さが限られる(255文字など)
- 配列の大きさ(添字の最大値)が限られる
[編集] 中間コードサイズを小さくしたり処理を速くする主なテクニック
プログラミングに際しても、処理プログラムの大きさや速度の制限を回避するためにソースの読みやすさを犠牲にするようなテクニックが横行した。
- 行頭ですべての実数型変数を整数型として宣言する(
DEFINT A-Z) - 命令を省略形で書く(
PRINT→?、LET A=B→A=B、REM→'など)
- ただし、中間コードを採用している処理系では、
PRINTも?も1バイトの同じ中間コードになるので、結果は変わらない。また、REMを'と書くのはかえってサイズが増える。
- 余白やコメントを入れない
NEXTの変数名を省略する(可能な処理系のみ)- 一行に複数の文を詰め込んで(マルチステートメント)を使用して行の制限一杯に命令文を詰め込む
- よく使う変数は早めに確保する。(実行時に毎回変数領域の先頭から検索されるため。)
- よく呼び出すサブルーチンは先頭に配置する
(同じような理由。なお、一度通過したGOTO/GOSUB命令のオペランドを内部で行番号からメモリアドレスに書き換える処理系ではあまり効果がない。)
- 機械語で書いたサブルーチンをメモリの一部に配置して、プログラム中で呼び出す
- CPUやメモリのウェイトを外す(I/Oポートを操作してCRTコントローラへのDMAを止める(その間画面は消える)など。BASIC言語というよりはハードウェアのテクニック。)
[編集] パソコン用BASICとコンパイラ
BASIC用コンパイラが存在しない処理系の方が多かったが、次のものが存在した。
- BASCOM (マイクロソフト BASIC-80 CP/M用インタプリタ)
- MS-DOS用N88-BASICコンパイラ (日本電気 PC-9800シリーズ)
- F-BASIC386コンパイラ (富士通 FM-TOWNS)
- MSXべーしっ君 (アスキー MSX)
- 実行ファイルは生成しない
- X-BASICコンバーター (シャープ X68000)
- C言語に変換した上でのコンパイル
しかし、パソコンに内蔵または標準添付されていたインタプリタと違い、コンパイラは別売であったり、高価であったり、実行にはランタイムを必要であったりする場合があった。このことから、BASICインタプリタによる開発に習熟したユーザーは、より高速で柔軟なプログラムを求めて、機械語(アセンブリ言語)や、C言語などに移行していった。
[編集] 構造化とBASIC
パソコンの普及により急速に広まったBASICだったが、Pascal、C言語の流行による構造化プログラミングの波が押し寄せると、行番号を残し、マルチステートメントやGOTO文などを多用するパソコンのBASICは、構造化を支持する識者からは酷評されるようになった。
[編集] Full BASIC
やがてそれは、BASICの原作者であるジョン・ケメニーとトーマス・カーツの知るところともなった。ダートマス大学でのバージョンは商用のBASICとは異なって既に1970年代後半から構造化などが進んでおり、ANSIでは新しい規格の策定も進んでいたが、これをパソコン向けにアレンジした実行時コンパイル型のTrue BASICが、1984年に開発された(日本ではクレオから発売)。このBASICは学術的(特に数学的)な意見を色濃くしたものだった。そしてTrue BASICとほぼ同一の構造化BASICであるFull BASICがANSI、ISO、遅れてJIS(JIS X 3003:1993)で規格化された。
- Full BASICの主な特徴
- 構造化に対応する制御文を追加した(
DO~LOOP、DO WHILE〜LOOP WHILEなど)- 行番号や
GOTOを使用しなくて済むようになった IF文が多行に渡るブロックIF(IF〜THEN〜ELSE〜ENDIF)も可能となった
- 行番号や
LETを省略できないようにした(True BASICではOPTION NOLETまたはNOLETを実行すると省略可能)- スコープの概念を取り入れた
- 計算精度や丸めの方法を規定した
- 配列の添字を1から始めるようにした(
OPTION BASE命令で0から始まるようにすることも可能) - 配列の行列演算が一発でできるようにした
- 文法の矛盾などを極力排除した
- 予約語を極力少なくした
- I/Oを直接操作するなどシステムに干渉する命令は持たないようにした(True BASICでは拡張ライブラリとして提供)
- グラフィック命令を規定し、座標系の原点を数学の第一象限にならって左下にした(変更も可能)
- Minimal BASIC規格の上位互換である
- 使用する必要はないが、行番号や
GOTOなども規格としては残っている - 実数型変数の型付けがない
- パソコン向けのそれまでのBASICとは命令の互換性が低い
- 使用する必要はないが、行番号や
[編集] QuickBASIC
マイクロソフト社はFull BASIC規格の策定には参加しなかったが、1985年にFull BASICに類した構造化や特徴を追加した独自規格のQuickBASICを発売した。これは自社のMS-DOS用のGW-BASICの上位互換で、コンパイラ並に動作を高速にした上にコンパイルも出来るようにしたもので、Version4.5まで発売した後に1991年のVisual Basicへと繋がっていった。
QuickBASIC との互換性を考慮したフリーなBASICとしてFreeBASICがある。
[編集] RATBAS
構造化ということを意識していなかったパソコン用のROM/Disk-Basic環境で、構造化プログラムを記述するために作られたプリプロセッサである。アスキーの書籍の形(アスキー書籍編集部編著「構造化BASIC RATBASのすすめ」 (ISBN 978-4-87148-152-6) )で、1985年に公開された。
これは、独自の構造化文法で記述されたソースプログラムを処理し、行番号やGOTO文を使うROM/Disk-Basicに変換するプログラムで、すべてBasicで記述されていた。構造化言語をFortran言語に変換するRatforに準じて、RATBASという名前が付けられた。
RATBASは、スタンドアローンのBasicプログラムと、μ-UXの外部コマンドとして作成されたサブセット版がある。μ-UXとは、年刊AhSKI!の1984年号に掲載された、Disk-Basicで記述されたUnix風のオペレーティング環境であるUni+を拡張したものである。
[編集] その他
日本の会社のその他のBASICは、マイクロソフトと同様に独自に構造化したか、または構造化されないまま製品ラインナップからは外されてしまった。日本のパソコンの16ビット化が進んだ1980年代の後半からFull BASICがJISで制定された頃にかけて、パソコンの主力開発環境はC言語がBASICに取って代わりつつあった。
このこともあり、Full BASIC規格準拠の処理系は教育用として使用されることはあるものの、市場にはあまり普及していない。
海外ではボーランドが独自に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.NETやREALbasicやActiveBasic等で、三者とも既に完全なオブジェクト指向言語になっていると言える。
[編集] 主なBASIC
[編集] 現在のパソコンのBASIC
[編集] マイクロソフト・マイクロソフト文法互換系
- Visual Basic - Microsoft
- Small Basic - Microsoft
- ActiveBasic (Windows用フリーウェア 国産)
- REALbasic (Windows・MacOS・Linux)
- Jabaco (english)
- BASIC/98 (Windows用 国産 N88-BASIC互換) - 有限会社電脳組
- XBLite
[編集] 独自系
- FutureBASIC (MacOS 構文はQuickBASIC互換)
- BCX (GPLv2 + BCX例外ランセンスのオープンソースソフトウェア BASIC → C言語トランスレータでインラインC/C++およびアセンブリを扱えるなどの特徴を持つ)
- UBASIC (DOS用フリーウェア 多倍長演算に特化)
- DarkBASIC (ゲーム製作に特化したBASIC言語、Windows専用、特に3Dゲーム)
[編集] Full BASIC系(規格準拠)
- (仮称)十進BASIC (JIS Full BASICに準拠、Windows・Linux・MacOS用フリーウェア、英語名 Decimal BASIC)
- True BASIC (Full BASIC規格の原型、MS-DOS・Windows・MacOS・UNIX、現在は英語版のみ)
- Ultra BASIC - 株式会社ラネクシー
[編集] 旧式構文系
- Chipmunk Basic(Windows・MacOS・UNIX用フリーウェア、インタプリタのみ)
[編集] ゲーム機などのBASIC
- ファミリーベーシック(NS-HuBASIC)(ファミコン、任天堂・シャープ・ハドソン共同開発)
- PCエンジンでべろBASIC(PCエンジン用開発ツール、徳間書店インターメディアが販売、ハドソン・日本電気ホームエレクトロニクス開発)
- GAME BASIC for SEGASATURN (セガサターン、MSX-BASICライク)
- BASIC STUDIO (プレイステーション2、アートディンク開発)
- プチコン (ニンテンドーDSi/DSiLL・ニンテンドー3DS、JOEDOWN・スマイルブーム・ロケットスタジオ共同開発)
[編集] 過去のパソコンなどのBASIC
[編集] 独自系
- Apple 6K BASIC (アップルコンピュータ Apple II 別名 Integer BASIC)
- G-BASIC (トミーぴゅう太用BASIC、日本語の命令。同機には別売のBASIC 1もあり) ※同機とは関係ない、マイクロソフト製の同名のBASICがある
- MW-BASIC (BASIC-09 OS-9用)
- BASIC-G (ソードのM5のBASIC、整数型しか使えないが高速だった。同機には実数用のBASIC-Fもあり)
- Tiny BASIC (黎明期のマイコン用に普及、Windowsなどのものとは別物)
- WICS (MZ-80K及びMZ-80Bシリーズ用のBASICに極力似せた表記方法を採用した、インタープリタ兼コンパイラ 整数型プログラミング言語)
- C-BASIC (CASIO FPシリーズ用のBASICで10進演算による精度の高い計算を得意とした。8ビット用のC82-BASICと16ビット用C86-BASICがある)
[編集] マイクロソフト・マイクロソフト文法互換系(Microsoft BASIC)
- Apple 10K BASIC (アップルコンピュータ Apple II+ 以降)
- BASCOM (CP/M用BASICコンパイラ)
- BASIC/98 (N88互換インクリメンタルコンパイラ)
- F-BASIC (FMシリーズのBASIC、富士通製)
- M-BASIC (CP/M用のBASIC)
- MSX-BASIC (MSX用のマイクロソフトBASIC、スプライト機能などを拡張、N88などより原型に近い)
- N-BASIC (PC-8001などのBASIC)
- N80-BASIC (PC-8001mkIIなどのBASIC)
- N88-BASIC (PC-8801(マイクロソフト製)、PC-9801(NEC製)のBASIC、98用は別途コンパイラもあり)
- N60-BASIC、N60m-BASIC、N66-BASIC、N66SR-BASIC (PC-6000シリーズ、PC-6600シリーズのBASIC)
- N100 BASIC (PC-100のBASIC)
- N82-BASIC (PC-8201のBASIC)
- BASIC-M25 (シャープMZ-2500)
- QBASIC (QuickBASICの簡易版、Windows95,98のCD-ROMに英語版が付属)
- QuickBASIC (Visual Basicの原型となった構造化BASIC)
- Microsoft BASIC Professional Development System (QuickBASICの進化形で、標準でISAMデータベースが構築でき、MS-MASM、MS-C、Quick C、MS-FORTRAN等とのミックスド・ランゲージ開発が可能な、プロユースの構造化BASIC)
[編集] シャープ・ハドソン系
- BASIC-M28 (シャープMZ-2861)
- BASIC-S25 (シャープMZ-2500)
- Hu-BASIC (MZシリーズなどのBASIC、ハドソン製)
- S-BASIC (MZシリーズのBASIC、シャープ製)
- SHARP BASIC (ポケコン用のBASIC)
- X-BASIC (X68000のC言語ライクなBASIC、ハドソン製)
- Z-BASIC (X1turboZのBASIC)