mci*_*321 29 c# incremental-compiler
多年前有人问为什么c#不允许像Java这样的增量编译.El Skeet说它与Java输出.class文件而不是程序集有关.
现在已经发布了像Mono编译器即服务这样的2011年和常规事物,为c#创建增量编译器需要做些什么?
编辑:大家都在谈论这不是一个问题,这里是Jon Skeet从我链接到的主题的引用:
你是建议你永远不会发现自己在等待构建?甚至15秒?如果一个构建需要15秒,你想在一小时内建立20次(我当然使用TDD),这意味着我浪费了5分钟.休息5分钟是一回事 - 这是一种放松等待的好方法 - 但是被耽搁15次20次可能会非常令人沮丧.做任何有用的东西都不够长(除了喝一杯),但它足够刺激.
我怀疑有两个因素会导致我感到烦恼的程度,其他人显然没有:1)TDD真的依赖于更快的转变2)在Eclipse中使用Java时,这种延迟非常罕见
And*_*rey 10
如果没有这样做,那么只有一个原因:做到这一点的努力高于可能的好处.
微软肯定不会这样做,因为成本太高:.net代码存在于程序集中,没有人会改变它.是的,程序集会阻止逐类增量编译.没人会停止使用组件.
这是我的答案,为什么没有人需要它.您可以在几个程序集中分发构成单个项目的类,并逐个编译它们.它实际上是渐进式编译,但不像逐类增量编译那样精细.当您的架构设计得当时,汇编级增量编译就足够了.
编辑:好的,我下载了Mono C#编译器,看看是否有可能使其增量.我觉得这不是很难.基本上它执行以下步骤:1)解析文件2)编译3)创建程序集.你可以在编译类型之后挂钩,然后保存到某种中间文件中.然后重新编译只更改的.所以这是可能的,但看起来它不是Mono团队的高优先级问题.
编辑2:我发现这个有趣的线程,人们讨论Mono C#编译器的增量编译.它相当陈旧但关键解释可能仍然有效:
Lexing和解析通常非常快,并且仅取决于要解析的代码的大小.语义分析通常是最耗时的步骤,因为加载引用的程序集和筛选巨大的元数据以解析符号和类型实际上是编译器的核心,而且,新的"编译"代码被"附加"到此元数据/ AST会增加什么随着时间的推移解决符号的复杂性.代码的发送首先在内存中完成,因此速度很快.保存到磁盘的速度很慢,但取决于发出的代码大小.
对于增量编译,缓存元数据会使一切变得非常快,因为通常很少会从一个编译更改为另一个编译.但是gmcs必须使部分元数据/ AST无效,而不是为它构建的.
编辑3:C#编译器/incremental在v1.0和v1.1中有选项,但它被删除了:
现在认为在1.0和1.1版本的C#编译器中找到的/ incremental标志已过时.
编辑4:米格尔奥德伊卡萨给出明确的答案(1,2)为什么单声道编译器将不增量.
有很多很多地方GMCS不适用于编辑和继续方案.
如果有人想把这个作为他们的论文主题,那对我来说没问题,但是太多领域的变化量太大了.我甚至不想打扰他们.
我没有列出东西的原因是因为它们将在编译器中无处不在.一旦你试一试,你肯定会遇到它们;-)
因此,他认为这比任何一个人的论文更具挑战性.Mono有更多出色和实际的任务.