章节摘要:数组是引擎,模块与过程是让引擎能被工程化地组装、检修、替换的骨架。本章解决两件事:模块如何用命名空间、public/private、子模块把"全局共享"变成"受控接口";过程如何用 intent、value、pure、elemental 这些属性把参数契约写清楚,让编译器替你检查、替你优化。读完本章,你能把一个几十万行的科学软件组织成边界清晰的模块树,而不是一坨靠 COMMON 块粘合的代码。注意一个信号:当你的主程序不再靠参数列表"接力传递"数据,而是从模块里按需取用接口时,就说明你已经跨过了脚本与工程的分界线。
阅读完本章,你应当能够:
金句:模块把"谁都能碰的全局变量"变成"只有接口能碰的受控状态"——这是 Fortran 工程化转型的分水岭。
模块是 Fortran 的命名空间与封装单元:use 的三种形态、默认私有策略、子模块的接口实现分离。这一节解决代码组织的骨架问题。
函数与子程序的分工、intent 与 value 的参数语义、pure 与 elemental 的并行属性、递归的栈成本,以及泛型接口的编译期分派。这一节把过程写成"有契约的原子服务"。
两节的关系是"容器"与"内容":4.1 定义过程住在哪、边界在哪、谁看得见;4.2 定义过程本身怎么设计才可靠。容器不清,内容再精也散;内容不实,容器再漂亮也是空壳。模块里的过程自带显式接口(4.1 的副产品),而 4.2 的泛型接口又依赖模块这个载体,两者互为前提。
4.1 模块体系(过程住在哪、边界在哪) │ └──► 4.2 过程设计(过程怎么设计才可靠)──► 第5章 面向对象
这一章对"从脚本到工程"的转型至关重要。科研代码最初往往是单文件脚本,几十个子程序摊在同一个文件里,靠 COMMON 块和参数列表互相传递数据。代码长到一定规模后,改一处影响一片。模块与过程契约把这种"摊大饼"变成"搭积木":每个模块自成一个有边界的单元,过程之间靠签名与 intent 交流。判断自己是否掌握了本章,可以看一个信号——写新功能时,你是先想"放在哪个模块、接口长什么样",还是直接动手往主程序里塞代码。前者是工程思维,后者是脚本惯性。