Rust 是一個日益受歡迎的 COBOL 遷移目標,適合那些希望在沒有垃圾回收器的情況下同時獲得記憶體安全與高效能的組織。對於安全關鍵型與效能敏感型系統而言,COBOL 遷移到 Rust 的保證極具說服力:整類記憶體錯誤在編譯時就被捕捉,產生的二進位檔案快速且可預測。

Rust 同時也是此清單中要求最高的目標,因為它的所有權與借用模型與 COBOL 的扁平資料模型有著根本性的不同。本指南說明 COBOL 遷移到 Rust 實際涉及什麼、英國企業可用的方法、成本如何,以及如何管理風險。

重點(TL;DR)

  • Rust 適合記憶體安全與效能都很重要的 COBOL 遷移,沒有垃圾回收器,也沒有執行時開銷
  • Rust 的所有權與借用模型是決定性的挑戰:COBOL 扁平的 WORKING-STORAGE 必須被重新表達為擁有所有權的 Rust struct,而不與 borrow checker 對抗
  • Rust 沒有原生的十進位型別;金融欄位需要一個像 rust_decimal 這樣的 crate,而不是 f64
  • 中等規模的遷移通常花費 200,000800,000 英鎊,耗時一到兩年;預期相較於受管語言目標,所有權模型會增加設計工作量

為何為 COBOL 遷移選擇 Rust

Rust 是針對一組特定需求的審慎選擇:

無需垃圾回收器的記憶體安全。 Rust 的所有權系統在編譯時保證記憶體安全,沒有受管執行環境那種引發停頓的垃圾回收。對於正確性與可預測延遲都很重要的系統而言,這是一個真正的優勢。

效能。 Rust 編譯為原生程式碼,效能可與 C 和 C++ 相媲美,適合 COBOL 系統經常承擔的繁重批次與交易工作負載。

可靠性。 編譯器的嚴格性意味著許多在其他語言中會進入生產環境的錯誤,在 Rust 中根本無法編譯。對於安全關鍵型系統,這種前期的嚴格性會在系統的整個生命週期中獲得回報。

可移植性。 Rust 在其支援的任何平台上執行,並能乾淨地部署到 Linux 伺服器與容器。

所有權模型才是真正的工作

這是最能將 Rust 遷移與 Java、C# 或 Python 遷移區分開來的一點。COBOL 使用扁平的 WORKING-STORAGE 節,其中每個資料項在程式內都可全域存取,處處存在隱含的共享狀態。Rust 強制執行嚴格的所有權與借用:每個值都有唯一的所有者,存取由 borrow checker 管理。

一次正確的遷移會將 COBOL 的資料模型重新表達為擁有所有權、具有明確存取模式的 Rust struct 型別,而不是試圖重建 COBOL 的全域可變狀態(那會在每一步都與 borrow checker 對抗)。這是設計工作,而非機械翻譯,這也是為何 Rust 遷移通常比受管語言目標帶來更多前期架構工作量。自動轉換能讓你得到可編譯、結構正確的 Rust;而將其打磨成慣用的、對 borrow checker 友善的 Rust,則需要人類專業知識。

十進位精度這一點

與 Go 一樣,Rust 沒有原生的十進位型別。COBOL 的 PIC 9COMP-3 欄位保存精確的十進位值,將它們對應到 f64(IEEE 754 二進位浮點)會在金融計算中引入捨入誤差。對於任何貨幣或對十進位敏感的邏輯,請使用像 rust_decimal 這樣的 crate,而不是 f64。將每個十進位欄位視為一個審慎的決定。希望在不增加額外相依性的情況下獲得精確十進位運算的組織,有時更偏好 C# (原生 decimal)或 JavaBigDecimal)。

需要真正翻譯的 COBOL 建構

一次安全的遷移會將 COBOL 的語意翻譯為慣用的 Rust:

  • 群組項成為具有擁有所有權、有型別欄位的 Rust struct 型別。
  • PIC 子句對應到正確的 Rust 型別:英數字用 String,依位數區分的數值用 i16 / i32 / i64,十進位欄位用十進位 crate(在精度不重要時用 f64)。
  • EVALUATE / WHEN 自然地對應到 Rust 的 match 運算式。
  • PERFORM 範圍成為函式呼叫;段落與節分解為函式。
  • COPYREPLACE(copybook)必須被解析,包括巢狀的 copybook。
  • EXEC SQL(DB2)、EXEC CICS 與 VSAM 需要重新設計到 Rust 資料庫 crate(例如 sqlxdiesel)與現代服務模式上。
  • EBCDIC 編碼與定寬版面需要明確轉換為 UTF-8 以及有型別的模型。

遷移方法

有三種主要方法,各有不同的風險與成本特徵。

1. 自動轉換

工具解析 COBOL 並產生 Rust,為群組項產生 struct、帶大小的整數型別,以及為 EVALUATE 產生 match 運算式。Mecanik COBOL 遷移到 Rust 工具 使用完整的編譯器管線,產生可編譯的 Rust 以及一份標記出內嵌 SQL、CICS 互動、動態呼叫與十進位精度欄位的 Migration Report。

最適合: 在重構為慣用的、具有所有權意識的設計之前,快速建立一個可編譯的 Rust 基準。

風險: 產生的 Rust 結構正確,但不會自動符合慣用法;所有權重構與十進位決策是人類的工作。

2. 平行重寫

Rust 系統與 COBOL 系統平行執行,兩者處理相同的輸入,輸出相互驗證,直到 Rust 通過且 COBOL 退役。

最適合: 無法冒險中斷連續性的任務關鍵型與安全關鍵型系統。

風險: 平行執行兩個系統會使遷移期間的營運成本加倍,並要求有紀律的對帳。

3. 漸進式遷移(Strangler Fig)

COBOL 程式被逐一替換為 Rust 等價物。系統先成為混合體,最終成為純 Rust。

最適合: 完全重寫不切實際的大型單體 COBOL 系統。

風險: 混合狀態可能比計畫持續更久,並要求謹慎的介面設計。

對於大多數英國遷移,strangler fig 方法結合選擇性的自動轉換,能在風險與速度之間提供最佳平衡。

英國的 COBOL 遷移到 Rust 成本

成本在很大程度上取決於程式碼庫規模、複雜性與方法。英國企業專案的指示性區間:

系統規模方法估計成本
小型(< 50,000 行)平行重寫80,000 至 200,000 英鎊
中型(50,000 至 500,000 行)Strangler fig200,000 至 800,000 英鎊
大型(500,000+ 行)自動化 + 漸進式重構500,000 至 2,000,000+ 英鎊
舊有主機退役完整專案1,000,000 至 10,000,000+ 英鎊

這些數字涵蓋分析、遷移、測試與上線支援,不包括持續營運成本、訓練與下游整合工作。由於所有權模型帶來的額外設計工作量,對於給定規模,Rust 遷移往往趨向這些區間的上端。

Mecanik COBOL 遷移到 Rust 服務 專注於安全關鍵型與效能敏感型遷移。對於權衡目標語言的組織,COBOL 遷移概覽 列出了包括 C#、Java、Python、Go 與 C++ 在內的完整範圍。對於從 IBM z/OS 遷出的遷移,舊有主機遷移服務 涵蓋基礎設施退役以及程式碼遷移。

主要風險及應對方法

所有權模型。 決定性的 Rust 風險。為將 COBOL 的扁平狀態重新表達為擁有所有權的 struct 預留設計時間。試圖對全域可變狀態進行字面直譯會導致與 borrow checker 的對抗。

十進位精度。 審查 Migration Report 中標記的每個十進位欄位,並在上線前對金融欄位使用 rust_decimal(或類似方案)。

未記錄的商業邏輯。 數十年內嵌的商業規則,卻沒有外部文件。發現與記錄是任何遷移中最耗時、風險最集中的部分。

資料存取層。 針對 DB2 的 EXEC SQL 與 VSAM 處理必須重新設計到 Rust 資料庫 crate 上。這通常是所有權重構之後最大的單項工作。

團隊技能。 Rust 的學習曲線比受管語言更陡峭。請把團隊的上手時間或專家支援納入考量。

回歸測試與切換。 透過在真實(匿名化)資料上進行全面回歸測試,證明 Rust 輸出與 COBOL 相符,並規劃帶有回復與對帳的切換。

關鍵要點

  • Rust 適合記憶體安全與效能都很重要的 COBOL 遷移,沒有垃圾回收器。
  • 所有權與借用模型是決定性的挑戰;請為設計工作量做規劃,而不僅是翻譯。
  • Rust 沒有原生的十進位型別;對金融欄位使用 rust_decimal,而非 f64
  • 大多數英國企業專案採用帶有選擇性自動化的 strangler fig 方法,且 Rust 遷移比受管語言目標帶來更高的前期設計成本。

常見問題(FAQ)

為何為 COBOL 遷移選擇 Rust 而非 C++? 兩者都是非受管的高效能目標。Rust 增加了 C++ 不強制的編譯時記憶體安全保證,這對安全關鍵型系統很有價值。C++ 可能適合已有 C++ 程式碼庫與專業知識的團隊。兩者都位於目標語言譜系中以效能為重的一端。

COBOL 遷移到 Rust 最難的部分是什麼? Rust 的所有權與借用模型。COBOL 扁平的、可全域存取的 WORKING-STORAGE 必須被重新表達為擁有所有權、具有明確存取模式的 Rust struct。這是自動轉換無法完全替你完成的設計工作。

Rust 如何處理 COBOL 的壓縮十進位欄位? Rust 沒有原生的十進位型別,因此十進位欄位預設回退到 f64,這可能在金融計算中引入捨入。對貨幣邏輯使用像 rust_decimal 這樣的 crate。好的轉換器會標記每個十進位欄位,以便你逐一欄位做決定。

COBOL 邏輯能自動轉換為 Rust 嗎? 可以,借助工具。好的轉換器會產生帶有 struct、帶大小整數與 match 運算式的可編譯 Rust,並標記內嵌 SQL、CICS 互動、動態呼叫與十進位欄位。朝慣用 Rust 的所有權重構仍然是人類的工作。

COBOL 遷移到 Rust 需要多長時間? 小型、文件完善的系統需要四到十二個月。中型企業系統需要十二到三十個月。大型主機專案的完全退役可能需要三到五年。相較於受管語言目標,Rust 通常會增加設計時間。