F#编译器是否是单通道编译器?

7
我搜索了一下网络,只在一个个人博客中找到了一篇有关F# 单通编译的提及,而官方文档中并没有。根据我的经验,F# 确实采用单通编译,因此你只能引用文件中早先定义的类型或函数,或出现在编译顺序中较早的文件中的类型或函数。请问这种说法是否正确?

2
F# 中的类型推断严格按照自上而下、从左到右的顺序进行。 - John Palmer
4
这通常是正确的,但不是完全正确的,因为您可以创建互相递归的类型和函数的有限系统,在这种情况下,它们会同时看到彼此。此外,在F# 4.1中,您可以将整个模块声明为“递归”。 - Fyodor Soikin
我刚刚在阅读这个 :), 一般来说是的,但请看这里的具体例子:https://blogs.msdn.microsoft.com/dotnet/2016/07/25/a-peek-into-f-4-1/,关于“相互引用的类型和模块”的部分。 - s952163
1个回答

1
您需要定义“pass”是什么意思才能回答这个问题。
许多编译器都是所谓的多“阶段”,这意味着源文本转换为可执行机器代码或IL代码的不同阶段。
我认为术语“pass”已经过时,指的是可能在处理过程中多次读取实际源文件的早期编译器,真正的商业级别的编译器几乎肯定不会这样做或需要这样做。
例如,我很多年前曾经在Windows上开发过一个PL / 1(又称PL / I)编译器,它经历了几个阶段,包括:
解析-消耗源文件并创建解析树 声明-将解析树中的标识符解析为已声明的名称 优化-分析解析树并最佳地重组它。 代码生成-分析解析树并生成OBJ文件。
今天大多数编译器基本上都这样做(无论是否在不同的阶段中 - 但他们做相同的工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接