search
LoginSignup
3

More than 1 year has passed since last update.

FreeBSD Advent Calendar 2020 Day 16

posted at

updated at

bc コマンドが新しくなる

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を参照してください。

gh-bc
https://www.freebsd.org/cgi/man.cgi?query=bc&apropos=0&sektion=0&manpath=FreeBSD+13.0-current&arch=default&format=html

従来のbcのmanはこちら
https://www.freebsd.org/cgi/man.cgi?query=bc&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE&arch=default&format=html

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3