如果没有这样做,那么只有一个原因:努力做到这一点高于可能的收益。
微软肯定不会这样做,因为成本太高:.net 代码存在于程序集中,没有人会改变它。是的,程序集会阻止逐类增量编译。没有人会停止使用程序集。
这是我的答案,为什么没有人需要它。您可以将构成单个项目的类分布在几个程序集中并一一编译。它实际上是增量编译,但不像逐类增量编译那样细粒度。如果您的架构设计得当,汇编级增量编译就足够了。
编辑:好的,我下载了 Mono C# 编译器来看看是否可以使其增量。我认为这不是很难。基本上它执行以下步骤:1)解析文件2)编译3)创建程序集。您可以在编译类型后挂钩某个位置,然后将其保存到某种中间文件中。然后只重新编译改变的。所以这是可能的,但看起来这不是 Mono 团队的高优先级问题。
编辑 2:我发现了这个有趣的线程,人们在其中讨论 Mono C# 编译器的增量编译。它相当古老,但关键解释可能仍然有效:
词法分析和解析通常非常快,并且仅取决于要解析的代码的大小。语义分析通常是最耗时的步骤,因为加载引用的程序集并筛选大量元数据以解析符号和类型确实是编译器的核心,此外,新的“编译”代码“附加”到此元数据/AST 增加了什么随着时间的推移解析符号的复杂性。代码的发射首先在内存中完成,因此速度很快。保存到磁盘很慢,但取决于发出的代码大小。
对于增量编译,缓存元数据会使一切变得非常快,因为通常很少会从一个编译到另一个编译。但是 gmcs 必须只使元数据/AST 的一部分无效,它不是为.
编辑 3:C# 编译器/incremental
在 v1.0 和 v1.1 中有选项,但它已被删除:
在 C# 编译器的 1.0 和 1.1 版本中找到的 /incremental 标志现在被认为已过时。
编辑 4:Miguel de Icaza 给出了明确的答案(1、2)为什么 Mono 编译器不会是增量的:
还有很多很多地方 GMCS 并非设计用于编辑和继续场景。
如果有人想把这个作为他们的论文主题,我没问题,但是在太多领域的变化太大了。我什至不想费心列举它们。
我没有列出的原因是因为它们在编译器中无处不在。相信您一尝试就会遇到它们;-)
所以他认为这是一项比一个人的论文更艰巨的任务。而 Mono 有更多的突出和实际的任务。