假设我们有一个虚构的静态类型编程语言 - 我们称之为 SL 。每个SL文件对应一个模块 - SL将相关功能逻辑分组到命名空间中。
可以轻松检查对当前模块中函数的调用:编译器传递发现所有已声明的函数并存储其签名。我们稍后可以通过将参数类型与签名中的形式参数的类型进行比较来验证任何此类调用。
但是,处理对其他模块中的函数的调用似乎更复杂一些。特别是,假设编译器可以找到与导入模块名称对应的源/目标代码,它如何提取类型信息?是吗:
我很好奇Haskell,D和Go等现代语言编译器的用法。
编辑:我知道C和C ++使用头文件解决了这个问题。我对这种方法不感兴趣。理想情况下,我正在寻找一种不涉及任何解析的解决方案。
答案 0 :(得分:1)
首先,请注意,这种类型的解析是编译器的属性,而不是语言本身。 C / C ++的不同实现实际上提供了不同的功能 - 例如,Microsoft的“预编译头”选项。
Haskell的GHC编译器通过生成包含必要类型信息的接口文件(带有“.hi”后缀)来处理此问题。我认为这有资格“在其他地方找到元数据”。
答案 1 :(得分:0)
这就是为什么你需要一个c / c ++的头文件来包含一个静态库或一个dll。对于dll,您可以通过仅检查dll来确定函数。所以它意味着dll文件存储函数的名称,返回值和参数类型。有一些工具可以生成此声明。
实际上,您可以为您的问题提供解决方案。根据情况使用所有方法。
从目标文件中读取某种元数据?
对于像dll这样的动态库,您可以动态查询目标代码并通过函数指针调用它。 for go http://code.google.com/p/go-wiki/wiki/WindowsDLLs 是的像c#这样的.net语言,vb使用了很多。
在其他地方查找元数据?
对于C / C ++,如果使用静态库,则需要一个头文件来定义。我不能举出你说的语言的例子。
扫描并解析导入模块的源代码,直到找到函数声明?
如果您有代码,那么就像您拥有的其他代码一样,这是显而易见的方式。
我认为Go,D或Haskell与C / C ++不同。