以下のソースコードがB言語のHelloWorld!です。
main( ) {
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';
Hello Worldというと、K&R Cのものが一番有名ですが、実は最初に発表されたHello Worldは1972年にカーニハンが「A Tutorial Introduction to the Language B」という書籍の中で外部変数(C言語でいうところのextern宣言された変数)の説明のために用いたコードのようです。
C言語はB言語を元にして生まれたと言われているだけあり、C言語に似ている雰囲気がありますが、やや異なった見た目もしています。
とりあえず、外部変数を使っていると話がややこしくなるので、外部変数なしのHello Worldもお見せします。
main( ) {
printf("hello, world*n");
}
このようにしてみると、ほぼC言語と変わらないことが分かります。
改行を表すためのエスケープシーケンスの書き方が \n ではなく、 *n になっていることが主な相違点です。
次に外部変数を使ったHello Worldに戻ります。
外部変数の代入に = 記号がないのが独特な雰囲気を出していますが、 "hello, world" という文字列を3つの変数に分割していることも独特です。
前者は単なるSyntaxの好みの問題に近しいですが、後者はB言語の仕様にも関わってきますので、解説します。
まずB言語には型がありません。これは、RubyやPythonには型がないけどGoやJavaには型があるという文脈での「型がない」という、動的型 vs 静的型の議論とは異なります。
B言語には36ビットの整数型という1つの型しかないです。
そのため、全ての変数の型はコンパイル時に定まるため、ある意味では静的型があるとも言えます1。
36ビットという現代人からすると中途半端なビット数は、B言語が動いていたメインフレームであるGE-645のビット数が由来になっていると考えられます。
変数に文字列を格納するためには、この36ビットの変数の中に「右寄せ・ゼロ埋め」の形式でASCIIコードを詰めていました。ASCIIコードは8ビットなので、1つの変数に格納できる文字数は最大で4文字です。
そのため、外部変数をつかったバージョンのHello Worldは4文字づつに分割されています。
-
ここはネタなので、マサカリ投げないで下さい ↩