B言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
B言語
パラダイム 手続き型
設計者 ケン・トンプソン
開発者 ベル研究所
型付け なし
影響を受けた言語 BCPL
影響を与えた言語 C言語

B言語ビーげんご)は、AT&Tベル研究所ケン・トンプソン (Ken Thompson) によって開発されたプログラミング言語である。C言語に置き換えられる形でほぼ絶滅した。ケン・トンプソンがデニス・リッチー(Dennis Ritchie)監修の元で設計し、1969年頃に登場した。

特徴[編集]

B言語で記述されたプログラムは、コンパイラによって中間コードに変換され、実行にはインタプリタを必要とした。実行時にインタプリタによって逐次処理されるため、実行速度は極めて遅かった。ただしPDP-7版は機械語を出力できるように改良された。

歴史[編集]

トンプソンは、DEC社製コンピュータPDP-7上でUNIXの開発を行っていたが、当時、UNIX上ではプログラムアセンブリ言語で記述することしかできなかった。そこでトンプソンはUNIX上で動作する高級言語の開発を始めた。トンプソンはUNIXの開発以前、Multicsの開発に携わっており、B言語は、Multics上で動作していたBCPLを元に開発された。

B言語はその後、トンプソン自身とデニス・リッチー (Dennis M. Ritchie)、そしてブライアン・カーニハン (Brian Kernighan) によって改良を加えられ、NewB(NB)を経てC言語へと発展してゆくこととなる。

B言語は本質的には、トンプソンがその時代のミニコンメモリ容量に収めるために、不要と感じたコンポーネントを除去したBCPLシステムである。またトンプソンの好みに沿うような変更も行われた(たいていは、一般的なプログラムで空白以外の文字数を削減できるという方向であった)。

BCPLForthのようにB言語はマシンのワード長である1つのデータ型のみを持っていた。多くの演算子(例えば+、-、*、/)ではこれを整数として扱い、それ以外はポインタとして扱った。それ以外の部分についてはC言語の初期バージョンとよく似ていた。C言語の標準入出力ライブラリを彷彿とさせるライブラリがわずかながら存在していた。

初期の頃は、初期のUNIXを使用したDEC社PDP-7用とPDP-11用の実装があり、またGCOSというOSが動作するハネウェルの36ビットメインフレームの実装もあった。最初にPDP-7用のスレッデッドコードを出力する実装が開発され、次にリッチーがマシン語を出力するコンパイラを実装した。1970年にはスレッデッドコード版がPDP-11に移植された。最初のyaccがこのPDP-11用に開発された。リッチーはこの時期にメンテナンスを引き受けていた。

B言語の型のない設計はハネウェルやPDP-7などの多くの古いコンピュータでは意味のあることであったが、PDP-11や近代的なコンピュータが全面的にサポートするキャラクタデータ型にエレガントにアクセスすることが難しく問題になった。リッチーは1971年に言語の変更を開始し、コンパイラがマシン語を出力するように変換すると同時に、最も顕著な拡張としてデータ型を変数に追加した。1971年から1972年にかけてB言語はNew B言語へ進化し、そしてアラン・スナイダー(Alan Snyder)の強い要求によってプリプロセッサが加えられ、1972年から1973年の初期にC言語となった。1973年の夏の間にPDP-11用のUNIXがC言語で書き直され、こうした努力は完全に終わった。1972~73年の間にハネウェル635とIBM 360/370に移植する必要があり、マイク・レスク(Mike Lesk)は後にC言語の標準入出力ライブラリとなる「汎用的なI/Oパッケージ」を書いた。

B言語はハネウェルのメインフレームで1990年代頃まで利用され続けていた。また、小型システムの限定されたハードウェアを利用するためであったり、大規模なライブラリやツールやライセンスの問題、また単純に業務に必要十分であるからなどのような様々な理由により、一部の組み込みシステムでも利用されていた。非常に大きな影響力のあったAberMUDはB言語で記述されていた。

B言語はBCPLの影響を強く受けており、またその名称はBCPLの短縮形である可能性が非常に高い。しかしながら、トンプソンがMulticsで使うために設計した、関連がないというよりむしろ異なるものと言うべき古いBonというプログラミング言語が、その名前の由来である可能性がある。

コードの例[編集]

ケン・トンプソンによるUsers' Reference to Bより

/* 以下の関数は非負整数nをb進数の形で出力する(ただし2<=b<=10)。
このルーチンはASCIIキャラクタのコードの値が
0から9まで連続しているということを利用している。*/

printn(n,b) {
        extrn putchar;
        auto a;

        if(a=n/b) /* 代入文であり、等値性の比較ではない */
                printn(a, b); /* 再帰 */
        putchar(n%b + '0');
}

外部リンク[編集]

http://www.lbm.go.jp/toda/comp/corigin.html