Category Archives: 8.その他のツールとコマンドの連携

B言語の雰囲気を楽しむ


アニメ『B: The Beginning』

警察と犯罪者とそれを違法に成敗するB。Bの方は人間とは思えない能力でとてつもなく強いです。それに現場にBのメッセージを残します。このBが意味深。警察側に切れ者がいますが、Bを追い詰めていくのでしょう。しかし、Bは身近にいる、と。そしてまた別の組織の登場。面白い要素は詰まってるので、ブルーレイとかで発売されたらまとめてみる予定です。

Bということで今回はB言語です。B言語は、C言語の元になったプログラミング言語です。今はどこにもB言語で動いているシステムはないとは思うのですが、B言語のマニュアルを元に作られたコンパイラを見つけました。あくまでもB言語の雰囲気を楽しむ(this is a toyと説明されています)コンパイラですが、こちらで配布されています。
https://github.com/Leushenko/ybc

linux用アーカイブがあるのでダウンロードします。

takk@deb9:~$ wget https://github.com/Leushenko/ybc/releases/download/v0.5-linux/ybc.zip

展開して内容を確認してみましょう。

takk@deb9:~$ unzip ybc.zip
takk@deb9:~$ cd ybc
takk@deb9:~/ybc$ ls
LICENSE    b-lib-linux.s  tests            ybc.bmx            ybparser.bmx
README.md  b-lib.s        ybassembler.bmx  ybcodegen.bmx
TMeta.bmx  examples       ybc              ybexpressions.bmx
takk@deb9:~/ybc$

ybcというファイルがB言語のコンパイラのようです。

takk@deb9:~/ybc$ file ybc
ybc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=45302d179228ab9ddb0ce4510c26acc305f8c7d9, stripped
takk@deb9:~/ybc$

32bitの実行ファイルなので、64bit環境で試す場合は、下準備が必要です。

takk@deb9:~$ sudo apt-get install lib32z1
takk@deb9:~$ sudo apt-cache search libc6-dev-i386

これで、32bitのELFも動くようになります。

さて、ybcディレクトリに格納されているB言語のサンプルプログラムを見てみましょう。

takk@deb9:~/ybc$ ls examples/
example1.b  example2.b  example3.b
takk@deb9:~/ybc$ cat !$example1.b
cat examples/example1.b
/* The following function will print a non-negative number, n, to
  the base b, where 2<=b<=10,  This routine uses the fact that
  in the ANSCII character set, the digits O to 9 have sequential
  code values.  */

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

        if(a=n/b) /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n%b + '0');
}

newline() putchar('*n');

main() {
        printn(12343, 10);
        newline();
        printn(12343, 8);
        newline();
        printn(12343, 16);
        newline();
}

takk@deb9:~/ybc$

C言語の元になったB言語ですが、なんだか今風のスクリプトっぽいですね。
このサンプルをB言語コンパイラでビルドしてみましょう。

takk@deb9:~/ybc$ ./ybc !$
./ybc examples/example1.b
done.
takk@deb9:~/ybc$
takk@deb9:~/ybc$ ./a.out
12343
30067
3037
takk@deb9:~/ybc$

見事実行できました。

計算が合ってるか一応確認。

takk@deb9:~/ybc$ printf "%o %x\n" 12343 12343
30067 3037
takk@deb9:~/ybc$