章节摘要:Fortran 很少单独存在——数据预处理与可视化在 Python,系统集成在 C,核心数值内核才是 Fortran。本章解决"怎么接":ISO C 绑定如何让 Fortran 与 C 双向调用,复杂数据结构跨语言怎么传,Fortran 内核怎么封装成 Python 扩展。读完本章,你能搭出"Python 管流程、Fortran 算内核"的典型混合架构,并理解每层边界上的命名、布局与所有权约定。互操作层的金律是"显式约定代替编译器默认"——边界上的每个细节都要写明白,留默认就是在埋雷。
阅读完本章,你应当能够:
金句:混合编程的边界不是"把代码拼在一起",而是"让两种语言在各自的强项上待着,用清晰的契约连接"。
iso_c_binding 模块、bind(c) 子句、类型与数组的双向映射、名称修饰的消除。这一节是互操作的语法地基。
数组的列优先与 C 行优先差异、结构体映射、不透明句柄(opaque handle)模式。这一节解决"不只是传几个数"的场景。
把 Fortran 内核封装成 Python 扩展的两条路线(编译扩展 vs 进程隔离),f2py 与手动 iso_c_binding 的取舍,以及数据拷贝与性能的权衡。
三节按"原子 → 结构 → 生态"推进:7.1 打通最小单元的调用(标量与数组),7.2 处理复杂结构(结构体、句柄、布局差异),7.3 上升到生态(Python 集成与分工)。7.1 是地基,7.2 是 7.1 的组合应用,7.3 是前两者的工程化出口。
7.1 ISO C 绑定(打通标量与数组调用) │ ▼ 7.2 复杂结构传递(结构体与句柄)──► 7.3 Python 集成(封装与分工)
这条递进线的终点是"封装":7.3 里 Fortran 内核对外只暴露几个函数和一把句柄,内部结构对 Python 完全不可见——这正是 7.1 的类型映射与 7.2 的句柄模式组合起来的结果。
本章的实操门槛比前面几章高,因为错误不再由 Fortran 编译器单独兜底——跨语言边界上的类型不匹配、布局错位,往往是未定义行为,排查成本高。学习建议:先用最小例子把单个方向的调用打通(Fortran 调一个 C 函数、C 调一个 Fortran 子程序),确认符号名、传值传址、数组布局都对得上,再上复杂结构。手边常备两样对照工具:C 侧的 offsetof 和 Fortran 侧的 c_sizeof,跨平台前用它们核一遍布局。凡是能通过"句柄"模式解决的,就别硬做字段级映射,这是本章最值得带走的一条工程经验。