假设我们有一种虚构的静态类型编程语言——我们称之为SL。每个 SL 文件对应一个模块- SL 将相关功能逻辑分组到命名空间中。
对当前模块中的函数的调用很容易检查:编译器通过发现所有声明的函数并存储它们的签名。我们稍后可以通过将参数类型与签名中形式参数的类型进行比较来验证任何此类调用。
但是,处理对其他模块中的函数的调用似乎更复杂一些。特别是,假设编译器可以定位到与导入模块名称对应的源代码/目标代码,它是如何提取类型信息的呢?可以:
- 扫描解析导入模块的源代码,直到找到函数声明?
- 从目标文件中读取某种元数据?
- 对符号名中的函数返回类型和参数类型进行编码,并在编译时读取符号表?
- 在其他地方查找元数据?
我很好奇 Haskell、D 和 Go 等现代语言的编译器采用什么方法。
编辑:我知道 C 和 C++ 使用头文件解决了这个问题。我对这种方法不感兴趣。理想情况下,我正在寻找一个根本不涉及任何解析的解决方案。