bcは、任意精度算術言語だ。
実際のところ、bcは電卓だ。任意精度計算できる。
$ bc
1+1
2
1234*5678
7006652
2^100+3^100
515377520732011332304111729993850674198810727377
言語というだけあって変数も使える。
$ bc
x = 1
x
1
x+x
2
条件分岐、ループ、関数も揃っている。
$ bc
if ( 1 < 2 ) 1 else 0
1
for( i = 1 ; i != 10 ; ++i ) sum+=i
sum
45
define next(x) {
return (x+1)
}
next(99)
100
実数を使う場合は変数scaleを設定する必要がある。
$ bc
10/3
3
scale=10
10/3
3.3333333333
scale変数をわざわざ設定したくない場合、引数-lをつけるとscaleが20になる。
$ bc -l
10/3
3.33333333333333333333
scale
20
文法はC言語風で馴染みやすい。
実はbcが書かれる前にdcというプログラムがあった。これはBell LabsのRobert MorrisによってBで書かれたプログラムで任意精度計算を逆ポーランド記法で行えるというものだった。dcはUNIXの歴史の中で最初期のプログラムだった。というのもBell LabsがPDP-11を入手したとき、このマシン用に書かれた最初のプログラムがdcだったからだ。
しかし一般人は中置記法で計算したかったので、dcのフロントエンドであるbcが書かれた。作者にはRobert Morrisも含まれている。
当時のbcの実装は、C言語風のbc言語をdc言語にコンパイルして結果をdcにパイプで流し込んでいたらしい。
POSIXによる規格化にあたってはbcのみが規格化された。1991年に独立したGNU bcが実装され、2003年にはOpenBSDが独立してbcを実装している。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html