K.Maebashi's blog

B言語の処理系を作っています


分かる人にしかわからない話ですみませんが、先日から「B言語」というプログラミング言語の言語処理系を作っています。
いちおう知らない人向けに説明すると、B言語というのは、C言語のひとつ前の言語です。C言語というのはかつては大変広く使われていた言語で、私が初めて書いた本「C言語ポインタ完全制覇」もC言語についての本でした。

アフィリエイトリンクです。
https://amzn.to/4pjmxqb
最初に書いたのは2001年1月発売で、こちらは2017年12月に発売した改訂版です。この業界で、改定を挟んで25年も売れ続けている本なんてそうありません。文句なしのロングセラーです。読者の皆様のおかげです。

C(言語)が作られたのが1972年頃、Bはそれより古いわけで、1969年頃に作られたようです。つまり大昔のプログラミング言語です。

Cは多くの人が(かつては)使っていましたが、BはほどなくしてCで置き換えられたので、Bを使ったことがあるという人は少なくとも日本にはほとんどいないと思います。たいていの人は、「C言語を勉強した時に、入門書の最初のところに、『C言語はB言語をもとに作られた』と書いてあったので名前だけ知っている」という状態ではないでしょうか。私もそんなもんでした。

でもその状態のままというのも気持ちが悪いので、今回、Bの言語処理系、ここではバイトコードに変換するコンパイラとそれを実行するVMを作りました。

ソースはGithubに上がっています。

https://github.com/kmaebashi/blang

B言語については、前述の「C言語 ポインタ完全制覇」にもちょっとだけ書いたので、以前からある程度調べてはいましたが、ちゃんと処理系まで作ってみると見えてくるものもあるものです。

おおざっぱにCとの違いはこんな感じ。

  1. 今のようなバイトマシンではなく18ビットとか36ビットとかの「ワード」を基準にしたワードマシンを前提にした言語なので、変数の型が、18ビットとか36ビットとかの「ワード」しかありません。なので浮動小数点数は使えませんし、ポインタも整数も区別がありません。
  2. カンのいいひとは「では文字列はどうするんだろう? 1文字に1ワード割り当てるほどメモリに余裕があった時代ではないだろうし」と思うでしょうが、文字は、1ワードの中に2文字とか4文字とか詰め込みます。なので「putchar('Hi!');」とか書けます。1ワードに複数文字入っているのでstr[i]のような書き方で文字を取り出すことはできず、文字列sからn番目の1文字を取り出したければ、char(s, n)のような関数を使う必要があります。
  3. Cなら文字列の中の改行は\nで終端は\0ですが、Bでは改行は*nで終端は*eでした。*eの値はゼロでなく、ASCIIコード表のEOT(コードは4)でした。getchar()がファイルの終端まで読んだ時もEOFではなく*eを返します。
  4. バージョンによるようですが、auto a[10];のように配列を宣言した時(型はないのでintはなく、自動変数の場合autoと書く)、使える要素はa[0]~a[10]の11個でした。今の言語の感覚からすると「え?」でしょうが、実際Cの初心者はみんなうっかりa[10]に代入してしまうので、こっちの方がわかりやすいのかもしれませんね。
  5. while文はありますがfor文はありません。構造体も共用体もありません。forはまあwhileで代用するとしても、構造体がないのは実用プログラムを作るうえでは今の目線では致命的ですね。


現在、Bのチュートリアルにあるプログラムくらいは一通り動いています。

A TUTORIAL INTRODUCTION TO THE LANGUAGE B
https://www.nokia.com/bell-labs/about/dennis-m-ritchie/btut.html

テストプログラムはここ。
https://github.com/kmaebashi/blang/tree/main/btut

解説記事もWebに上げたいと思います。正月休み中にできるかしら。


≪ より新しい記事
より古い記事 ≫

このエントリーをはてなブックマークに追加

この記事へのコメント:

コメントを書く

名前: