#current で既にデフォルトになってる、新たな bc コマンド
お手軽にコマンドラインで計算するのに使う、おなじみの bc コマンドのお話です。あまり変化なさそうな分野だと思っていたら、current ではいつの間にやら新しいバージョンに差し替わっていました。
実行すると一目瞭然、「>>>」というプロンプトがつくようになりました。
$ bc
>>> 1+2
3
以下ではプロンプト以外の従来bcとの違いや、FreeBSD で選ばれた理由などを適当にまとめます。
Gavin Howard さん作、gh-bc
FreeBSD では今まで OpenBSD 由来の bc (usr.bin/bc)が入っていました。新しい bc コマンドはGavin Howard さんが独立にスクラッチから作られたものです。ビルドに C99 コンパイラを要求する点など、モダンさが伺えます。
FreeBSD のソース上は usr.bin/gh-bc というディレクトリに入っています。本稿でもこの bc は gh-bc と呼ぶことにします。
開発元 URL https://git.yzena.com/gavin/bc
FreeBSD リポジトリ https://svnweb.freebsd.org/base/head/usr.bin/gh-bc/
開発元のREADME.mdによると、Linuxなどで広く使われている GNU bc (FreeBSDだと pkg/ports からインストール出来ます)と比べると
- スクリプトに便利な拡張機能
- パフォーマンス
- 安定性
- より POSIXに準拠している
などが優れていると謳っています。
パフォーマンスに関しては GNU bc との比較を公式でベンチマーク比較していて、それを見ると桁違いな速さを見せつけてるケースが多いです。
https://git.yzena.com/gavin/bc/src/branch/master/manuals/benchmarks.md
FreeBSD で選ばれた理由
FreeBSD でこの gh-bc を使用するようにした理由に関しては、上記のパフォーマンスなどの点以外に、
- 多桁計算用ライブラリが他のライブラリに依存していない
- man 文章が非常に詳細である
などがあるようです。詳細は以下の commit log を参照してください。
従来の bc は OpenSSL の多桁計算ライブラリに依存しているようで、確かにそれに依存しないというのは魅力ですね。
12 release では明示的ビルドが必要
currentではすでにデフォルトが切り替わってますが、12-releaseではどうでしょうか。
12-release でもソース自体は入っている状態ですが、通常はビルドはされないようになっています。明示的に gh-bc に切り替えるには、「WITH_GH_BC=yes」というオプションをつけて buildworld する必要があります。
sinがsin
使ってわかりやすい違いとして、sin関数がちゃんと「sin()」として使えることがあります。従来のbcではsinは「s()」、cosは「c()」、logは「l()」とかいう、省略しすぎな名称でしたが、それぞれちゃんと省略しない関数名が使えるようになっています。
また、「pi()」という関数が定義されていて、引数に桁数をすると、その桁数の円周率を返してくれます。
詳しくは man で
記事での紹介ではかなりかいつまんでになりましたが、FreeBSDでの採用理由になったように man が詳細ですので興味のある方はmanを参照してください。
従来のbcのmanはこちら
https://www.freebsd.org/cgi/man.cgi?query=bc&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE&arch=default&format=html