BCPL (Basic Combined Programming Language、Basic-CPL)は、手続き型で命令型の構造化プログラミング言語である。BCPLは元々ほかの言語を開発するための言語であり、90年代以降は利用されていない。しかしながらBCPLは、後発の言語であるB言語やC言語に影響を与えており、特にC言語が広く普及したことから、BCPLの影響は現在のプログラミング言語にも色濃く残されている。BCPLは今日のモダンなプログラミング言語に見られる、カッコやデリミタなどの特徴を備えていた。1966年にケンブリッジ大学のマーティン・リチャーズが設計した。

## 仕様

BCPLは小さくて単純なコンパイラを記述できるように設計され、コンパイラが16KBのメモリで動作すると言われた。しかもリチャーズのコンパイラはそれ自身がBCPLで記述されており、非常に移植性が高かった。そのためBCPLは処理系のブート用として人気のある選択肢だった。コンパイラの移植性の高さにはその構造に理由があった。コンパイラは2つのパーツに分けられていた。フロントエンドはソースをパースし、仮想機械用の中間表現であるO-codeを生成した。バックエンドはO-codeを受け取り、ターゲットマシンのコードに変換した。新しいマシンをサポートするためにはコンパイラのコードの1/5だけを書き直せばよく、通常は2~5人月の作業であった。その後まもなくこの構造はごく一般的になった(Pascal及びJava参照)。

BCPLは1種類のデータ型だけしかない特殊な言語だった。1ワードは通常アーキテクチャが定めるマシンワードの固定ビット長で、当時のマシンが持つメモリ容量ではポインタとしても十分な範囲があった。当時は1ワードが8ビットではないコンピュータがほとんどであった。アドレス可能なメモリの最小単位がワードではなくバイトであるマシンや、より大きなメモリ空間を使用できるアドレス長が32bitまたは64bitのマシンでBCPLを利用する際に、この選択は問題があったということが後に判明した。

全ての値の判断は値を処理するのに利用した演算子によって決定された(例えば+は2つの値を両方とも整数として加算し、!は間接的に値を参照するポインタとして扱った)。この働きにより実装はタイプチェックを提供しなかった。ハンガリアン記法はプログラマーが予期せぬタイプエラーを回避するために開発された。

ワード指向のBCPLとバイト指向のハードウェアのミスマッチについては様々な方法で解決を試みられた。その1つはバイト列の中にワードを出し入れする標準ライブラリルーチンの提供だった。ビットフィールドセクション演算子と、('%'文字で示す)中置記法のバイト間接参照演算子の2つの言語機能が後に付け加えられた。

BCPLは独自の方法で翻訳単位を超えるシンボルのバインディングを扱う。BCPLはユーザー定義型のグローバル変数を持たない。その代わりにFORTRANの"blank common"に似たグローバルベクタがある。翻訳単位を超えて共有する全てのデータは、スカラーと、グローバルベクタに事前に配置したベクタへのポインタで構成される。ヘッダファイル(GET命令を使ってコンパイル時に読み込まれるファイル)は翻訳単位間でグローバルデータを同期させる重要な手段であり、GLOBAL命令を使用してシンボル名とワードアドレスの組み合わせたシンボル情報のリストをグローバルベクタに記述する。グローバルベクタは変数だけでなく外部関数へのバインディングにも使用する。これにより翻訳単位の動的なロードを容易に達成できる。基本ともいえるリンカに頼らないためBCPLではプログラマがリンクのプロセスを制御できる。

グローバルベクタはまた標準ライブラリの置き換えや引数の変更を容易に行えた。プログラムは元のルーチンのグローバルベクタを別のメモリに保存しておき、別バージョンへのポインタに置き換えることができた。この別バージョンは内部でオリジナルバージョンを呼び出せた。これはデバッグに役立った。

BCPLは世界初の弓カッコ『{}』を文法規則に利用した言語であるとされる。最初のBCPLのマニュアルには弓カッコについての記述はなく$(と$)が用いられているが、後にTX-2に移植されたBCPLでは弓カッコが使われており、そのことを記述したマニュアルはB言語の開発時期よりも古いものである。さらに、このマニュアルは第2版であり、第1版時点で弓カッコが使われていれば、その起源はさらに古いことになる。
なお、弓カッコはB言語やC言語から逆に影響されてBCPLに導入されたものであるとC言語の作者であるリッチーは示唆しているが、上記の時間的前後関係からそのようなことはありえず、これはリッチーが参照しているBCPLのマニュアルがTX-2版よりもさらに古い最初のものであったことに基づく誤解である。弓カッコの採用において、BCPLとB言語の間に関連性があったかどうかは完全には判明していないが、B言語の開発時点で、開発者であるトンプソンやリッチーはTX-2版BCPLを知らなかった可能性が高く、当時使用されていたテレタイプ端末の制約によって偶然に一致した可能性がある。C言語では採用されなかったBCPLの//による単一行のコメントはC++や後のC99で再び採用された。

BCPLの哲学は書籍「BCPL, the language and its compiler」からの引用によって端的に示される。

## 歴史

BCPLは最初にケンブリッジ大学のマーティン・リチャーズが1967年に開発した。1960年代初頭に開発された複雑なCPLを簡略化しようとする試みだった。リチャーズは「コンパイルを難しくする特徴を仕様から削る」ことによりBCPLを開発した。CTSSで動作するIBM 7094用の最初のコンパイラの実装は、1967年の春にリチャーズがMITのProject MACを訪問している間に書かれた。1969 Spring Joint Computer Conferenceの論文で初公開された。

BCPLは「ブートストラップ・ケンブリッジ・プログラミング・ランゲージ」の略だと長い間言われていたが、オリジナルのCPLはBCPLの開発が終わった後もまだ実装されていなかった。

BCPLは最初のHello worldが記述された言語であるといわれている。最初のMUDもまたBCPLによって記述された。

TRIPOSや、起動 (Kickstart)処理、AmigaDOS初期バージョンを含むAmigaOSのコア部分など、いくつかのオペレーティングシステムではその一部または全体がBCPLで記述された。またBCPLは影響力の強いパロアルト研究所のAlto(最初の近代的なパーソナルコンピューターのプロジェクト)で最初に使われた言語であり、また初期のBravoワードプロセッサなど、その他の数多くの有名なプログラムがBCPLで開発された。

1969年にはICT 1900シリーズ用に書かれた初期のコンパイラが、マーティン・リチャーズが自分のアルテア2で出力したOコードの紙テープから起動した。両者のマシンはワード長が異なっており(48ビットと24ビット)、文字コードが異なり、文字列データの構造も異なっていたが、上手く動作しておりこの方法の信用が高まった。

1970年までには、ハネウェル635/645、IBM 360、PDP-10、TX-2、CDC 6400、Univac 1108、PDP-9、KDF 9、Atlas 2に実装されていた。BBNは1974年にOコードを使わない独自の実装を開発した。最初の実装はBBNのTENEX PDP-10数台にインストールされ、BBNがARPANETのために開発していた次世代IMP(ルータの原型)として使うためのPDP-11用のコードを出力するクロスコンパイラだった。

また1980年代後期にはマーティン・リチャーズの兄であるジョン・リチャーズが設立したリチャーズ・コンピューター・プロダクツ社によりBBC Microバージョンが開発された。この言語はイギリスの国勢調査プロジェクトで使用された。またイギリスのソフトハウスであるArnor社がAmstrad CPC用とAmstrad PCW用のコンパイラを1985年に発売した。イギリスのケンジントンにあるTopexpress社はアップル・マッキントッシュ用のMacBCPLを1985年に発売した。

BCPLの設計と哲学は後にC言語に影響を与えるB言語に多大な影響を与えた。C言語は現在システムプログラミング用言語の1つである。当時のプログラマーは、C言語の次はアルファベット順にD言語となるのか、それとも元の言語を尊重してP言語なるのかとよく言われた。なおC言語の後継言語として最も成功したのはC++であり(`++`はC言語のインクリメント演算子)、D言語は実在している。

1979年には少なくとも25のアーキテクチャで実装された。Unix以外でもC言語の人気が高まるにつれて使われなくなっていった。

マーティン・リチャーズは自身のウェブサイトでBCPLの更新を続け、最後の更新は2018年になっている。Linux、FreeBSD、Mac OS X、Raspberry Piなど様々な環境で動作する。最新版はグラフィックやサウンドのライブラリが付属し、詳しいマニュアルがPDFで提供されている。彼は自動譜面作成システムScore followingWなどの開発を続けている。

広く使われているBCPLのMIME形式はtext/x-bcpl。

## プログラム例

マーティン・リチャーズがリリースしているBCPLの最新版(2018年12月現在)であるCintsysで以下のプログラムを動かすには、エラーを回避するためLIBHDR、START、WRITEFを小文字にすること。

階乗の出力:

n-クイーンパズルを解く: