一位開發者釋出了一個跨多種程式語言的開源月相計算函式集合,被稱為 Werewolf Early Warning System 。該專案在八種不同的程式語言中實現了相同的天文演算法,從系統級語言如 C++ 和 Rust 到指令碼語言如 Python 和 JavaScript 。
支援的程式語言:
- 系統級語言: C/C++、Rust、Zig
- 指令碼語言: Lua、JavaScript、Python
- 領域特定語言: awk、bc
- 最新新增: Raku
複製貼上規則創造了有趣的程式設計挑戰
這個專案特別引人注目的是其嚴格的複製貼上規則要求。每個函式必須完全自包含,允許開發者直接將程式碼複製貼上到他們的專案中,無需依賴項或環境變更。這一約束在開發者中引發了關於此類限制如何影響編碼風格和效能的討論。
這一要求迫使程式設計師以不同的方式思考他們的常規方法。與其依賴外部庫或全域性變數,每個實現都必須是純淨和獨立的。這在整潔程式碼實踐和實際約束之間創造了有趣的張力。
一位開發者指出, Rust 實現可能比 C 版本執行得更快,這不是因為 Rust 本身更快,而是因為自包含要求導致了不同的最佳化選擇。 Rust 程式碼使用帶有閉包的單個取整操作,而 C 版本需要兩個取模操作來在約束內保持可讀性。
超越簡單的時間除法
該專案解決了關於月相計算的常見誤解。許多開發者最初假設你可以簡單地將自 Unix 紀元以來的時間除以月球週期。然而,月相涉及更復雜的天文計算,包括求解 Kepler 方程和考慮軌道力學。
該演算法源自 John Walker 在1980年代的 moontool 程式,該程式本身基於《實用天文學與計算器》。每個實現都返回月球年齡的弧度值,然後可以轉換為照明分數、相位名稱和表情符號表示。
關鍵演算法特性:
- 以弧度為單位返回月球"年齡"
- 公式:(1-cos(x))/2 給出照明分數
- 月球年齡(以天為單位):將標準化年齡乘以約29.5
- 基於 John Walker 在1980年代開發的 moontool 演算法
- 原始資料來源:"Practical Astronomy With Your Calculator"
社群貢獻和技術改進
該專案吸引了程式設計社群的貢獻,包括最近新增的 Raku 實現。 Raku 版本展示了一些優雅的語言特性,包括內建的歐幾里得取模支援和原生π常數。
圍繞最佳化機會出現了技術討論,一些開發者建議將角度標準化到[0, 2)範圍而不是[0, 360)可以提高效能和精度,特別是在使用 sinpi 和 cospi 等專門數學函式時。
該專案展示了程式設計約束如何導致創造性解決方案和跨語言學習。透過在不同語言中實現相同演算法同時保持嚴格的純淨性要求,它提供了關於語言設計如何影響程式碼結構和效能權衡的見解。