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

特徴 
B言語は再帰に対応し、非数値型に対応し、特定の機種に依存しない言語であり、OSや他の言語などを開発するための言語として設計された 。データ型を持たない言語で、ハードのCPUレジスタに対応したワード型1種類に依存し、どのようなビット長のCPUにも対応できた。文脈によりワードは整数またはアドレスとして扱われた。ASCIIコードが一般的になり、当時ベル研究所にもDEC PDP-11が導入され、文字データ型のサポートが重要になった。B言語のような型がない言語の仕様は欠点とみなされるようになり、トンプソンとリッチーは言語を拡張して内部型とユーザー定義型をサポートし、その言語はC言語となった。

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

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

B言語は本質的には、トンプソンがその時代のミニコンのメモリ容量に収めるために、不要と感じたコンポーネントを除去したBCPLシステムである。またトンプソンの好みに沿うような変更も行われた（たいていは、一般的なプログラムで空白以外の文字数を削減できるという方向であった）。BCPLにあったALGOL由来の記法は大幅に改められた。代入演算子は、で採用された:=から、ALGOL開発メンバーの1人であるハインツ・ルティスハウザーがかつてSuperplanで採用していた=に戻され、また比較演算子は=から==へ置き換えられた。

トンプソンは加減算代入演算子を発明し、x =+ yの形で実装した(C言語では順序が逆転して+=となった)。またB言語ではインクリメント、デクリメント演算子(++ and --)が導入された。演算子を前につけるか後ろにつけるかで、変更前と変更後のどちらの値が式の結果に適用されるのかを選択できた。これらの新機能は最初のバージョンのB言語には見られなかった。デニス・リッチーによれば、多くの人はDEC PDP-11で導入された自動インクリメント・自動デクリメント・アドレッシングモードのために開発されたと思う人が多いが、Bが開発されたときにはPDP-11は存在しておらず歴史的に見てありえないとしている。

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

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

B言語の型のない設計はハネウェルやPDP-7などの多くの古いコンピュータでは意味のあることであったが、PDP-11以降のほぼ全てのコンピュータがサポートしている8ビットのキャラクタデータ型にエレガントにアクセスすることが難しいことが問題になった。リッチーは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言語はC言語にほぼ置き換わった。B言語はハネウェルのメインフレームGCOSで1990年代頃まで利用され続けていた。また、小型システムの限定されたハードウェアを利用するためであったり、大規模なライブラリやツールやライセンスの問題、また単純に業務に必要十分であるからなどのような様々な理由により、一部の組み込みシステムでも利用されていた 。非常に大きな影響力のあったAberMUDはB言語で記述されていた。

コードの例 
ケン・トンプソンによるUsers' Reference to Bより

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

printn(n, b) {
        extrn putchar;
        auto a;
        /* Wikipedia による注釈: この auto キーワードは自動変数(関数スコープの変数)
           を宣言している。C++11 の型推論の auto とは別もの。 */

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

/* 次のプログラムはネイピア数の小数点以下の部分を4000桁まで計算し、
   1行5文字のグループに分けて50文字を出力する。
   この手法は以下を単純に拡張した物であり、
     1/2! + 1/3! + ... = .111....
   それぞれ2桁、3桁、4桁…に対応する。 */

main() {
	extrn putchar, n, v;
	auto i, c, col, a;

	i = col = 0;
	while(i<n)
		v[i++] = 1;
	while(col<2*n) {
		a = n+1 ;
		c = i = 0;
		while (i<n) {
			c =+ v[i] *10;
			v[i++]  = c%a;
			c =/ a--;
		}

		putchar(c+'0');
		if(!(++col%5))
			putchar(col%50?' ': '*n');
	}
	putchar('*n*n');
}
v[2000];
n 2000;

脚注

参考文献

外部リンク 
 The Development of the C Language, Dennis M. Ritchie. BCPLとCとの関係の中でBを語っている。
 Users' Reference to B, Ken Thompson. Describes the PDP-11 version.
 The Programming Language B, S. C. Johnson & B. W. Kernighan, Technical Report CS TR 8, Bell Labs (January 1973). ハネウェルの製品用のGCOSバージョン。
 C言語の起源をめぐって 戸田孝 2006年11月

プログラミング言語
ケン・トンプソン
デニス・リッチー