1

假设我们有一种虚构的静态类型编程语言——我们称之为SL。每个 SL 文件对应一个模块- SL 将相关功能逻辑分组到命名空间中。

对当前模块中的函数的调用很容易检查:编译器通过发现所有声明的函数并存储它们的签名。我们稍后可以通过将参数类型与签名中形式参数的类型进行比较来验证任何此类调用。

但是,处理对其他模块中的函数的调用似乎更复杂一些。特别是,假设编译器可以定位到与导入模块名称对应的源代码/目标代码,它是如何提取类型信息的呢?可以:

  • 扫描解析导入模块的源代码,直到找到函数声明?
  • 从目标文件中读取某种元数据?
  • 对符号名中的函数返回类型和参数类型进行编码,并在编译时读取符号表?
  • 在其他地方查找元数据?

我很好奇 Haskell、D 和 Go 等现代语言的编译器采用什么方法。


编辑:我知道 C 和 C++ 使用头文件解决了这个问题。我对这种方法不感兴趣。理想情况下,我正在寻找一个根本不涉及任何解析的解决方案。

4

2 回答 2

1

首先,请注意这种类型解析是编译器的属性,而不是语言本身。C/C++ 的不同实现实际上在这些方面提供了不同的特性——例如,微软的“预编译头文件”选项。

Haskell 的 GHC 编译器通过生成包含必要类型信息的接口文件(带有“.hi”后缀)来处理这个问题。我想这符合“在其他地方查找元数据”的资格。

于 2013-04-18T19:12:52.923 回答
0

这就是为什么您需要 c/c++ 的头文件来包含静态库或 dll 的原因。对于 dll,您可以通过仅检查 dll 来找出函数。所以这意味着dll文件存储了函数的名称、返回值和参数类型。有一些工具可以生成此声明。

实际上,您为您的问题提供了解决方案。所有方法都根据情况使用。

从目标文件中读取某种元数据?

对于像 dll 这样的动态库,您可以动态查询目标代码并通过函数指针调用它。去http://code.google.com/p/go-wiki/wiki/WindowsDLLs 所以是的。.net 语言,如 c#,vb 经常使用它。

在其他地方查找元数据?

对于 C/C++,如果使用静态库,则需要一个用于定义的头文件。我不能举出你说的语言的例子。

扫描解析导入模块的源代码,直到找到函数声明?

如果您有代码,那么它就像您拥有的其他代码一样,是显而易见的做法。

我认为 Go、D 或 Haskell 与 C/C++ 没有什么不同。

于 2013-04-15T14:36:38.623 回答