Fortran(FORmula TRANslation)誕生於1957年,專為科學計算設計,歷經Fortran 77/90/95/2003/2018演進,始終聚焦數值計算性能。C語言誕生於1972年,伴隨Unix系統成長,定位為系統編程語言,兼顧底層控制與可移植性,後成為通用編程基石。C++繼承C特性並引入面向對象/泛型編程,進一步拓展應用邊界。
COMPLEX為內建類型,編譯器原生優化(如表達式展開、SIMD向量化),大規模複數運算(電磁場、量子力學、信號處理)效能極高。_Complex關鍵字,C++提供std::complex<T>模板。雖支持運算符重載,但早期編譯器優化較弱,現代編譯器(GCC/Clang/ICX)已能生成高質量代碼,性能差距大幅縮小。main(int argc, char **argv) 直接訪問命令行參數,字符串以\0結尾,靈活但需手動管理。GET_COMMAND_ARGUMENT),常用交互式讀取(READ(*,*))或環境變量。字符串為定長或可變長(Fortran 2003),處理相對繁瑣。malloc/free/realloc、mmap、棧分配(VLA/C99)、自定義分配器,完全控制生命周期與佈局。ALLOCATABLE屬性數組(ALLOCATE/DEALLOCATE),Fortran 2003支持指針(POINTER)及C互操作(ISO_C_BINDING),動態能力大增,但語法仍顯冗長。這是最易導致Bug的差異:
a[12][10] 內存佈局為 12 行 × 10 列,a[i][j] 偏移 = i*10 + j。遍歷應內層遍歷列(j)以利緩存。a(12,10) 內存佈局為 10 列 × 12 行,a(i,j) 偏移 = j*12 + i。遍歷應內層遍歷行(i)。[0, N-1]。a(100) → 1..100),支持任意下標範圍(a(11:110) → 11..110),便於數學公式直接映射。| 特性 | C/C++ | Fortran |
|---|---|---|
| 函數類型 | 統一返回類型 func(參數) | 分FUNCTION(有返回值)與SUBROUTINE(無返回值) |
| 參數傳遞 | 默認傳值,指針實現傳引用 | 統一傳引用(地址傳遞),子程序修改實參生效 |
| 返回值 | return expr | 賦值給函數名func_name = expr |
| 聲明 | 原型聲明/頭文件 | 調用處需INTEGER func_name聲明返回類型 |
| 隱式類型 | 無,必須顯式聲明 | 隱式類型規則(I-N整數,其餘實數),建議IMPLICIT NONE |
DO CONCURRENT, OpenMP指令)、數學庫生態(LAPACK/BLAS原生Fortran接口)。ISO_C_BINDING(Fortran 2003+)實現零開銷互調,共享內存數據(遵守列/行優先轉換)。C與Fortran代表了「系統編程」與「科學計算」兩大傳統陣營的巔峰。現代高性能計算(HPC)早已打破語言壁壘,混合編程、異構計算(GPU/TPU)、領域特定語言(DSL)、自動調優才是主流。理解兩者差異,非為站隊,而是為在正確層面選擇正確工具,構建高效、可維護的計算系統。