深入瞭解 macOS 上的命令列計算機工具 bc

Chris YuanChris Yuan
2 min read

bc 的歷史背景

bc 的全名是「basic calculator」或「bench calculator」,是一個支援任意精度運算的計算器語言。它的歷史可以追溯到 1975 年,首次出現在 Version 6 Unix 中。當時由貝爾實驗室的 Lorinda Cherry 開發,作為另一個計算器程式 dc(desk calculator) 的前端介面。

dc 使用的是反波蘭記法(Reverse Polish Notation),輸入方式對一般使用者來說較為陌生。而 bc 則提供了類似 C 語言的語法,讓使用者能以更直觀的方式進行計算。

不同的 bc 實作版本

隨著時間發展,bc 衍生出了幾個不同的實作版本:

1. 傳統 Unix 實作

最初的 bc 實作是作為 dc 的前端,將 bc 程式碼轉換成 dc 指令。這個版本仍然存在於一些 Unix 和 Plan 9 系統中。

2. GNU bc

GNU bc 由 Philip A. Nelson 開發,首次發布於 1991 年。這個版本不再是 dc 的前端,而是一個獨立的位元組碼直譯器,使用 C 語言編寫。GNU bc 在 GPL3 授權下發布,並加入了許多擴展功能,如:

  • 支援多字元的變數名稱
  • 添加了 &&||! 等邏輯運算子
  • if 語句可以使用 else 子句
  • 新增 print 語句用於輸出

值得注意的是,GNU bc 在 2017 年 4 月發布 1.07.1 版後,曾經有將近 8 年沒有更新。不過就在最近,2024 年 12 月和 2025 年 1 月,GNU bc 連續發布了 1.08.0 和 1.08.1 版本,打破了長期停滯的狀態。

3. OpenBSD 實作

OpenBSD 在 2003 年重新實作了自己的 bc 版本,以符合他們對系統安全性和授權條款的要求。

4. Gavin Howard 的實作(macOS 採用版本)

這是 macOS 上使用的版本,由 Gavin Howard 個人開發,從 2018 年開始的專案。這個版本採用 BSD 授權,具有以下特點:

  • 完全相容 POSIX 標準,同時實作了 GNU 擴展和 BSD 的點號(.)擴展
  • 用同一個執行檔同時提供 bcdc 功能(透過符號連結)
  • 在效能和穩定性上有許多改進
  • 提供更完善的錯誤處理
  • 支援更多的數學函數擴展

gavinhoward/bc @ GitHub

macOS 上的 bc

根據作者 Gavin Howard 在部落格中的說明,他的 bc 實作是從 macOS 13 Ventura 開始被 Apple 收錄進 macOS的。在此之前,macOS 使用的是其他版本。

截至 2025 年,查看各版本的狀況:

  • macOS 13.2.1 搭載的是 4.0.2 版
  • macOS 14.4 已更新到 6.5.0 版
  • macOS 15.4 更新到 6.7.6 版

macOS 採用的 bc 版本對應可參考 Apple Open Sourceapple-oss-distributions/bc @ GitHub

這個版本也被 FreeBSD 採用,在 FreeBSD 13.3-RELEASE 中成為預設版本。目前這個專案持續活躍開發中,最新版本是 6.4.0(2024年釋出)。

與其他工具的比較

雖然有許多命令列計算工具(如 Python、dc、expr 等),bc 仍有其獨特優勢:

  1. 任意精度運算(不受浮點數精度限制)
  2. 類 C 語言語法,易於學習
  3. 輕量級,啟動快速
  4. 幾乎在所有 Unix-like 系統上都可用
  5. 可編寫腳本,支援函數和流程控制

結語

bc 雖然是一個古老的工具,但它的設計理念和功能在今天仍然實用。特別是 macOS 採用的 Gavin Howard 實作版本,不僅保持了與傳統的相容性,還加入了現代化的改進。對於經常需要在終端機進行計算的使用者來說,熟悉 bc 絕對能提升工作效率。

而令人興奮的是,原本被認為已經停止開發的 GNU bc,在沉寂近 8 年後,最近又有了新的更新,顯示這個經典工具仍然保有生命力。這也反映了命令列工具在現代計算環境中的持續重要性。

0
Subscribe to my newsletter

Read articles from Chris Yuan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Chris Yuan
Chris Yuan