为何Fortran编译器不为独立子程序/函数创建显式接口?
Fortran编译器不为独立子程序自动创建显式接口,核心源于语言的历史设计、编译模型以及兼容性约束,具体技术阻碍包括以下几点:
单单元独立编译的传统模型
Fortran从诞生起就支持编译单元独立编译:每个源文件(编译单元)可单独编译为目标文件,后续再通过链接器合并。当编译器处理调用独立子程序的单元时,完全无法获取该子程序的定义细节——因为子程序的代码在另一个独立编译的文件中。而模块会被导入到调用单元的编译过程中,编译器能直接读取模块内的子程序接口信息,因此可以生成显式接口做参数检查。强向后兼容性要求
Fortran拥有数十年的历史积累,大量遗留代码依赖隐式接口的行为。比如早期代码可能存在隐式类型转换、参数个数/类型不匹配但靠内存布局侥幸运行的情况,若强制编译器为独立子程序自动生成显式接口,这类旧代码会直接编译失败。为了兼容海量现有代码,标准与编译器厂商均不会打破这一传统机制。无原生自动接口传递机制
与C语言的头文件机制不同,Fortran标准原生没有设计自动生成/传递接口信息的机制。要为独立子程序提供显式接口,只能通过用户手动编写INTERFACE块实现,编译器无法自动从其他编译单元提取接口信息并传递给调用单元。虽然部分现代编译器提供了扩展功能(如自动生成接口文件),但这属于非标准特性,并非语言原生支持。接口的不确定性与动态特性
部分独立子程序存在动态特性,比如使用ENTRY语句定义多个入口点、支持可变参数(如旧版的*格式参数),这类子程序的接口并非固定唯一,编译器难以自动生成明确的显式接口。此外,旧版Fortran的隐式类型规则(如I-N开头变量默认整型)可能导致子程序与调用单元的类型规则不一致,进一步增加了接口自动生成的复杂度。
内容的提问来源于stack exchange,提问作者Youjun Hu

