B言語
(
ビ?げんご
)は、
AT&Tベル?究所
の
ケン?トンプソン
(Ken Thompson) によって開?された
プログラミング言語
である。ケン?トンプソンが
デニス?リッチ?
(Dennis Ritchie)監修の元で設計し、1969年頃に登場した
[1]
。
特?
[
編集
]
B言語
は再?に??し、非?値型に??し、特定の機種に依存しない言語であり、OSや他の言語などを開?するための言語として設計された
[2]
。デ?タ型を持たない言語で、ハ?ドのCPUレジスタに??した
ワ?ド
型1種類に依存し、どのようなビット長のCPUにも??できた。文脈によりワ?ドは
整?
または
アドレス
として扱われた。
ASCII
コ?ドが一般的になり、?時ベル?究所にも
DEC PDP-11
が導入され、文字デ?タ型のサポ?トが重要になった。B言語のような型がない言語の仕?は欠点とみなされるようになり、トンプソンとリッチ?は言語を?張して?部型とユ?ザ?定義型をサポ?トし、その言語は
C言語
となった。
B言語で記述された
プログラム
は、
コンパイラ
によって
中間コ?ド
に?換され、?行には
インタプリタ
を必要とした。?行時に
インタプリタ
によって逐次?理されるため、?行速度は極めて?かった。ただし
PDP-7
版は
機械語
を出力できるように改良された。
?史
[
編集
]
トンプソンは、
DEC社
製コンピュ?タ
PDP-7
上で
UNIX
の開?を行っていたが、?時、
UNIX
上では
プログラム
を
アセンブリ言語
で記述することしかできなかった。そこでトンプソンは
UNIX
上で動作する
高級言語
の開?を始めた。トンプソンは
UNIX
の開?以前、
Multics
の開?に携わっており、B言語は、
Multics
上で動作していた
BCPL
を元に開?された
[note 1]
。
B言語は本質的には、トンプソンがその時代の
ミニコン
の
メモリ容量
に?めるために、不要と感じたコンポ?ネントを除去したBCPLシステムである。またトンプソンの好みに沿うような?更も行われた(たいていは、一般的なプログラムで空白以外の文字?を削減できるという方向であった
[3]
)。BCPLにあった
ALGOL
由?の記法は大幅に改められた。代入演算子は、
ALGOL 58
(
英語版
)
で採用された
:=
から、ALGOL開?メンバ?の1人である
ハインツ?ルティスハウザ?
がかつてSuperplanで採用していた
=
に?され、また比較演算子は
=
から
==
へ置き換えられた。
トンプソンは加減算代入演算子を?明し、
x =+ y
の形で??した(C言語では順序が逆?して
+=
となった)。またB言語ではインクリメント、デクリメント演算子(
++
and
--
)が導入された。演算子を前につけるか後ろにつけるかで、?更前と?更後のどちらの値が式の結果に適用されるのかを選?できた。これらの新機能は最初のバ?ジョンのB言語には見られなかった。デニス?リッチ?によれば、多くの人はDEC PDP-11で導入された自動インクリメント?自動デクリメント?アドレッシングモ?ドのために開?されたと思う人が多いが、Bが開?されたときにはPDP-11は存在しておらず?史的に見てありえないとしている
[3]
。
BCPL
や
Forth
と同じくB言語はマシンのワ?ド長である1つのデ?タ型のみを持っていた。多くの
演算子
(例えば
+
、
-
、
*
、
/
)ではこれを整?として扱い、それ以外は
ポインタ
として扱った。それ以外の部分についてはC言語の初期バ?ジョンとよく似ていた。C言語の
標準入出力ライブラリ
を彷彿とさせる
ライブラリ
がわずかながら存在していた
[2]
。
初期の頃は、初期の
UNIX
を使用した
DEC社
の
PDP-7
用と
PDP-11
用の??があり、また
GCOS
というOSが動作する
ハネウェル
の36
ビット
メインフレ?ム
の??もあった。最初にPDP-7用の
スレッデッドコ?ド
を出力する??が開?され、次にリッチ?がマシン語を出力するコンパイラを
TMG
(
英語版
)
で??した
[4]
[5]
[6]
。1970年にPDP-11が開?現場に導入され、スレッデッドコ?ド版がPDP-11に移植された。アセンブラのdcとB言語自身はB言語で記述された。最初の
yacc
がこのPDP-11用に開?された。リッチ?はこの時期にメンテナンスを引き受けていた
[3]
[6]
。
B言語の型のない設計はハネウェルやPDP-7などの多くの古いコンピュ?タでは意味のあることであったが、PDP-11以降のほぼ全てのコンピュ?タがサポ?トしている8ビットの
キャラクタ
デ?タ型にエレガントにアクセスすることが難しいことが問題になった。リッチ?は1971年に言語の?更を開始し、コンパイラがマシン語を出力するように?換すると同時に、最も?著な?張としてデ?タ型を??に追加した。1971年から1972年にかけてB言語はNew B言語へ進化し、そしてアラン?スナイダ?(Alan Snyder)の?い要求によって
プリプロセッサ
が加えられ、1972年から1973年の初期にC言語となった
[3]
。
1973年の夏の間にPDP-11用のUNIXがC言語で書き直され、一連の努力が成し遂げられた。1972~73年の間にハネウェル635とIBM
360
/370に移植する必要があり、マイク?レスク(Mike Lesk)は後にC言語の標準入出力ライブラリとなる「汎用的なI/Oパッケ?ジ」を書いた。
B言語は
C言語
にほぼ置き換わった
[7]
。B言語はハネウェルのメインフレ?ムGCOSで1990年代頃まで利用され?けていた
[8]
。また、小型システムの限定されたハ?ドウェアを利用するためであったり、大規模なライブラリやツ?ルやライセンスの問題、また?純に業務に必要十分であるからなどのような??な理由により、一部の
組み?みシステム
でも利用されていた
[7]
。非常に大きな影響力のあった
AberMUD
はB言語で記述されていた。
コ?ドの例
[
編集
]
ケン?トンプソンによる
Users' Reference to B
より
[2]
/* 以下の??は負でない整?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
;
脚注
[
編集
]
- ^
名?はBCPLの短縮形であるとされているが、トンプソンがMulticsを使用していた時代に開?した別の言語Bonが由?であるとする?もある[Thompson 69]。Bonはトンプソンの妻であるBonnieから?ている(マニュアルの記載より)、 秘密の呪文を?く宗?の
ボン?
から?ているなどの?もある。
[3]
?考文?
[
編集
]
外部リンク
[
編集
]
|
---|
低水準言語
| |
---|
高水準言語
|
1950年代
| |
---|
1960年代
| |
---|
1970年代
| |
---|
1980年代
| |
---|
1990年代
| |
---|
2000年代
| |
---|
2010年代
| |
---|
|
---|
架空の言語
| |
---|
|