ダートマスBASIC(Dartmouth BASIC)は、プログラミング言語BASICの元祖となった処理系である。ダートマス大学で設計・実装されたため、そのように呼ばれている。ジョン・ケメニーとトーマス・カーツがDTSS (Dartmouth Time Sharing System) の一部として設計した言語であり、対話的な使用を意図した初期のプログラミング言語の1つである。

言語は、コンパイラがオンメモリで動作し、1パスでコンパイルできるよう設計された。そして即座に実行されるので、使い勝手としてはインタプリタ的であったとも言える。

ダートマスにて数年間に渡っていくつかのバージョンが生み出された。最初のコンパイラはタイムシェアリングシステムが運用可能となる以前に完成した。これはCardBASICと呼ばれ、パンチカードで入力する標準的なバッチ処理で使用した。その後のバージョンと同様、ケメニーとカーツが指導する学部学生のチームが実装した。最初の対話型バージョンが一般ユーザーに使えるようになったのは1964年6月のことである。その後第2版は1964年10月、第3版は1966年、第4版は1969年、第5版は1970年、第6版は1971年、第7版は1979年にリリースされた。

## 歴史

### 1960年代

コンパイラの開発とオペレーティングシステム (DTSS) の開発は並行して行われ、最初のBASIC処理系は1964年初めごろバッチ処理内で動作するものとして書かれた。対話型バージョンは、1964年5月1日午前4時(ET)、ジョン・ケメニーとジョン・マクゲシーがDTSSの端末からBASICプログラムを実行することに成功した。最初のプログラムがどのようなものだったかは完全に明確にはなっていない。しかし、

という1行のプログラムだったという説と、エラトステネスの篩を実装したものだったという説(1974年のケメニーとマクゲシーのインタビュー)がある。

第2版では大きな変更は加えられていない。PRINT文のセミコロンによる列区切りと配列の添え字のゼロ使用が加えられた。

第3版では、INPUT文による端末からのデータ入力と、強力なMAT文による行列演算機能、RESTORE文でREAD/DATA文のデータ読み出しを先頭に戻す機能が追加された。第4版では文字列操作機能と文字列変数が導入され、第5版ではファイル操作機能が追加された。60年代末ごろ、ゼネラル・エレクトリック版のBASIC(DTSSプロジェクトで使用していたのがGEのハードウェアだった関係で、GEは初期のBASICの利用者となっていた)がダートマスBASICから離れ、広まっていった。

### 1970年代

71年9月の第6版では、引数のあるプロシージャを個別にコンパイル可能とし、この版を元に、次に述べるSBASICなど、様々なBASICが派生していった。1976年、スティーブ・ガーランドが構造化プログラミング機能を追加すべく、構造化構文を追加したSBASICを設計した。SBASICは、第6版ダートマスBASICのソースコードを生成するプリコンパイラとして実装された。SBASICの構文が ANSI Full BASIC の基盤となった。1979年、ケメニーとカーツがダートマスBASICとして最後の版となった第7版をリリースした。ケメニーとカーツはこれを機に大学を離れ、ANSI Full BASIC 準拠の True BASIC を製品化した(Full BASICの標準化は遅れたため、実際には標準化と同時進行)。

## ユーザインタフェース

ダートマスBASICの環境は初期の統合開発環境 (IDE) の実装であり、対話型のコマンドラインインタフェースである。明示的なログアウトは不要で、短時間でもユーザーが応答しないと自動的にログアウトされる。

ユーザーが何かを入力する場合、行番号を先頭に書けば、その行はプログラムに追加され、同じ行番号の行が既に存在する場合はその内容を置換する。行番号のない入力はコマンドと解釈され、即座に実行される。行番号だけを入力すると、同じ行番号がプログラムに既に存在すれば、その行を削除する。このような編集方式になっていたのは、DTSSで使用する端末がテレタイプ端末だったためである。

次のようなコマンドがあった。ダートマスBASICでは、行番号をともなってプログラム中に書くものは「文(ステートメント)」(後述)、対話型環境に入力し即座に実行されるものは「命令(コマンド)」と、明確に区別されていたが、この区分は後のインタプリタにおいて完全に曖昧になった。

### コマンド

- `HELLO` — DTSSにログインする。
- `BYE` — DTSSからログオフする。
- `BASIC` — BASICモードを開始する。
- `NEW` — プログラム名を指定して、新規にプログラムを書き始める。
- `OLD` — 名前を指定して既存のプログラムをストレージから取り出す。
- `LIST` — 現在のプログラムを表示する。
- `SAVE` — 現在のプログラムをストレージにセーブする。
- `UNSAVE` — 現在のプログラムをストレージから消去する。
- `CATALOG` — ストレージ内にあるプログラム名を一覧表示する。
- `SCRATCH` — 名前はそのままで現在のプログラムの内容を消去する。
- `RENAME` — 内容を消去せずに現在のプログラムの名前だけ変更する。
- `RUN` — 現在のプログラムを実行する。
- `STOP` — 実行中のプログラムを中断する。
- `FRI` — Fridenモード(機械式ラインフィードのあるテレタイプ端末用)
- `NFR` — Fridenモードから脱出
- `EXP` — 説明 (explain)、すなわちヘルプ機能。EXP EXP でシステムが説明可能なコマンド一覧を表示する。

多くのユーザーはこれらのコマンドをBASIC言語の一部と思い込んでいた。実際に一部のコマンドはBASIC専用だが、システムとしてはタイムシェアリングシステム(DTSS)の一部であり、ALGOLやFORTRANのプログラムを使用する場合にもこれらのコマンドが使われた。

## 言語

最初の対話型バージョンでは、次のような機能を実装していた。演算子やキーワードの一部は FORTRAN II や ALGOL 60 から採用されている。

### 文の一覧

次のような文があった。

- `DEF` — 1行の関数を定義する。
- `DIM` — (dimensionの略で)配列の大きさを定義する。
- `END` — プログラムの終りを定義する。
- `STOP` — ENDに到達する前にプログラムを停止させる。
- `FOR / TO / STEP` — ループを定義する。
- `NEXT` — ループの末尾を示す。
- `GOSUB` — サブルーチンに制御を転送する。
- `RETURN` — サブルーチンから制御を戻す。
- `GOTO` — 制御を別の文に移す。
- `IF / THEN` — 条件判断。
- `LET / =` — 式の値を変数に代入する。
- `PRINT` — 結果を出力する。
- `DATA` — プログラム内に静的データを格納する。
- `READ` — DATA文で格納しているデータを入力する。
- `REM` — コメント文。

変数は基本的に浮動小数点数である。変数名は、AからZまでと、後ろに数字を1文字続けた2文字(A0、Z9 など)が可能で、全部で286個の変数が使える。配列名はAからZまでに限られる。配列は定義しなくても使えるが、DIM文で定義していない配列は要素数10(添え字が1から10まで)となる。

### 関数の一覧

- `ABS` -- 絶対値
- `ATN` -- 逆正接関数(結果の単位はラジアン)
- `COS` -- 余弦関数(引数の単位はラジアン)
- `EXP` -- 指数関数(底はネイピア数)
- `INT` -- 整数値(小数点以下を切り捨て)
- `LOG` -- 自然対数
- `RND` -- 乱数
- `SIN` -- 正弦関数(引数の単位はラジアン)
- `SQR` -- 平方根
- `TAN` -- 正接関数(引数の単位はラジアン)