BCPL

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
BCPL
パラダイム 手続き型
設計者 マーチン・リチャーズ
開発者 ケンブリッジ大学
型付け なし
影響を受けた言語 CPL
影響を与えた言語 B言語C言語

BCPL (Basic Combined Programming Language、Basic-CPL)は1966年ケンブリッジ大学マーティン・リチャーズ (Martin Richards)が設計したプログラミング言語である。

歴史[編集]

BCPLは元々ほかの言語を開発するために記述されたコンパイラであり、現在は利用されていない。しかしながらBCPLはB言語の基礎となっており、B言語から派生したC言語は文法的にBCPLの亜種であるといえるため、その影響は現在にも色濃く残されている。BCPLは世界初の弓カッコ『{}』を文法規則に利用した言語である。弓カッコは度重なる文法の変化を生き残り、プログラミング言語の構成要素として一般的になった。より正確には当時はキーボード上の制約により{と}のシンボルの代用として$(と$)の組み合わせがよく利用されていた。C言語では採用されなかったBCPLの//による単一行のコメントはC++や後のC99で再び採用された。

BCPLは1960年代初頭に開発された複雑なCPLを簡単にしたものである。リチャーズは「コンパイルを難しくする特徴を仕様から削る」ことによりBCPLを開発した。CTSSで動作するIBM 7094用の最初のコンパイラの実装は、1967年の春にリチャーズがMITProject MACを訪問している間に書かれた。1969 Spring Joint Computer Conferenceの論文で初公開された。

BCPLはクリーンでパワフルで移植性が高かった。そのため小さくて単純なコンパイラを記述することが可能であった。コンパイラが16KBのメモリで動作すると言われた。しかもリチャーズのコンパイラはそれ自身がBCPLで記述されており、非常に移植性が高かった。そのためBCPLは処理系のブート用として人気のある選択肢だった。

コンパイラの移植性についての主な理由はその構造にあった。コンパイラは2つのパーツに分けられていた。フロントエンドはソースをパースし、仮想機械用のO-codeを生成した。バックエンドはO-codeを受け取り、ターゲットマシンのコードに変換した。新しいマシンをサポートするためにはコンパイラのコードの1/5だけを書き直せばよく、通常は2~5人月の作業であった。その後まもなくこの構造はごく一般的になった(Pascal及びJava参照)が、この目的のためにバーチャルマシンを定義したのはリチャーズのBCPLコンパイラが世界初である。

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

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

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

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

BCPLは最初のHello worldプログラムが記述された言語であるといわれている。最初のMUDもまたBCPLによって記述された[1]

いくつかのオペレーティングシステムではその一部または全体がBCPLで記述された(例えば、TRIPOSや、起動部 (Kickstart)やAmigaDOS初期バージョンを含むAmigaOSの重要パート)。またBCPLは影響力の強いパロアルト研究所Alto-最初の近代的なパーソナルコンピューターのプロジェクト-で最初に使われた言語であり、その他の数多くの有力なプロジェクトの間では、初期のBravoドキュメント調合システム (document preparation system)がBCPLで記述された。

1970年までには、ハネウェル635/645IBM 360TX-2、CDC 6400、Univac 1108、PDP-9、KDF 9、Atlas 2に実装されていた。1979年には少なくとも25のアーキテクチャで実装された。2001年現在ではほとんど使われないようだ。

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

BCPLの哲学は、最良を知ると皆が考える暴君がいるのではなく、何が許されて何が許されないのかという決まりが定められているのでもない。どちらかといえばBCPLは、たとえ明らかに馬鹿げた事態に直面したときでさえ、不平を言わずに自らの能力を最大限に活かしてサービスを提供せんとする召使いとして振舞う。彼が何をしていて、細かい制限に制約されないということを、プログラマーは常に理解しているものと考える。

BCPLの設計と哲学は後にC言語に影響を与えるB言語に多大な影響を与えた。C言語は現在システムプログラミング用言語の1つである。

プログラム例[編集]

n以下の素数を求めるプログラム。

//
// n以下の素数を求める
//
GET "LIBHDR"

LET START() BE
$(
    LET I, J, N

    WRITEF("N=")
    N := READN()

    FOR I=2 TO N DO
    $(
        FOR J=2 TO I-1 DO
        $(
            IF I REM J = 0 DO
                BREAK
        $)
        IF I=J DO
            WRITEF("%N*N", I)
    $)
$)

外部リンク[編集]