有人怎么能像Java一样制作c#增量编译器呢?

有人怎么能像Java一样制作c#增量编译器呢?,c#,incremental-compiler,C#,Incremental Compiler,几年前有人问。El Skeet说这与Java输出.class文件而不是程序集有关 现在,它的2011和groovy产品(如Mono compiler-as-a-service)已经发布,要为c#开发一个增量编译器需要做些什么 编辑:对于每一个喋喋不休地谈论这不是一个问题的人,这里引用了Jon Skeet在我链接到的帖子中的一段话: 你是说你永远不会发现自己在等待构建吗?甚至15 秒?如果一次构建需要15秒,而您希望在中构建20次 一个小时(我当然用TDD)意味着我在浪费5个小时 分钟。休息5分钟

几年前有人问。El Skeet说这与Java输出.class文件而不是程序集有关

现在,它的2011和groovy产品(如Mono compiler-as-a-service)已经发布,要为c#开发一个增量编译器需要做些什么

编辑:对于每一个喋喋不休地谈论这不是一个问题的人,这里引用了Jon Skeet在我链接到的帖子中的一段话:

你是说你永远不会发现自己在等待构建吗?甚至15 秒?如果一次构建需要15秒,而您希望在中构建20次 一个小时(我当然用TDD)意味着我在浪费5个小时 分钟。休息5分钟是一回事——这是一种很好的休息方式 放松等-但被保持15秒20次可能是非常危险的 令人沮丧的。它不够长,不能做任何有用的事情(除了 也许啜饮一杯)但时间太长了,会让人不舒服

我怀疑有两个因素导致了我的烦恼程度 其他人显然没有: 1) TDD确实依赖于更快的周转 2) 在Eclipse中使用Java时,这种延迟非常罕见


如果不这样做,那么只有一个原因:这样做的努力高于可能带来的好处

Microsoft肯定不会这样做,因为成本太高:.net代码存在于程序集中,没有人会更改它。是的,程序集阻止逐类增量编译。没有人会停止使用组件

这是我的答案,为什么没有人需要它。您可以将构成单个项目的类分布在多个程序集中,并逐个编译它们。它实际上是增量编译,但不像逐类增量编译那样细粒度。当您的体系结构设计正确时,汇编级增量编译就足够了

编辑:好的,我下载了Mono C#编译器,看看是否有可能使其递增。我认为这并不难。基本上它执行以下步骤:1)解析文件2)编译3)创建程序集。在编译类型并保存到某种中间文件之后,可以在某个地方挂接。然后只重新编译更改的。所以这是可能的,但对于Mono团队来说,这似乎不是一个优先考虑的问题

编辑2:我找到了人们讨论Mono C#编译器增量编译的地方。它相当古老,但关键的解释可能仍然有效:

词法分析和语法分析通常非常重要 速度快,仅取决于 正在分析的代码。语义的 分析通常是最重要的 使用步骤作为加载引用 在巨大的 用于解析符号和类型的元数据 是编译器的核心, 此外,还提供了新的“编译”代码 “附加”到此元数据/AST什么 增加了解析的复杂性 符号随着时间的推移。代码的发布是 先在内存中完成,所以速度很快。 保存到磁盘很慢,但取决于 发出的代码大小

对于增量编译,缓存 元数据,将使一切变得非常简单 快,通常很少 从一个编译更改为 其他的。但GMC必须这样做 仅使部分内容无效 metadata/AST,没有构建什么 对于

编辑3:C#编译器在v1.0和v1.1中有
/incremental
选项,但它是:

C#编译器1.0和1.1版本中的/incremental标志现在被认为已经过时

编辑4:Miguel de Icaza给出了明确的答案(,)为什么Mono编译器不会是增量的:

还有很多很多地方 GMCS的设计目的并不是为了 “编辑并继续”场景

如果有人想让这成为他们的 论文题目,我没问题, 但变化的数量太大了 在太多的区域中使用过大。我不知道 甚至想费心去列举它们

我没有列出事情的原因是 因为它们将遍布世界各地 编译器。我肯定你会遇到的 一旦您尝试它们,就立即使用它们;-)


因此,他认为这是一项比一个人的论文更艰巨的任务。Mono的任务更加突出和实际。

可能是因为没有人真正需要它?在asp project中的.cs文件中添加空格字符。击中构建。在生成完成之前等待184秒。@mcintyre321获取SSD。严肃地说。解决方案:1)硬件升级,或2)将项目重构为小型HAVE SSD/i5/8GB RAM,公司正在花时间重构,这仍然是一个问题,这些都不是我问题的答案。程序集如何防止逐类增量编译?在我看来,限制来自工具链的设计-csc.exe输出完成的程序集,因此没有单独的链接器。除了所做的努力之外,还有什么东西阻止某人编写一个C#编译器来生成对象文件,然后这些文件必须使用单独的链接器打包到程序集中吗?@Sean U实际上有一个:al.exe(),但C#编译器不使用它。当然,但正如您所说,VisualStudio附带的编译器中没有一个真正依赖它;它们直接编译成程序集。我的问题是,csc.exe有什么理由必须输出完整的程序集吗?这是一个很好的答案,但我会在接受之前等待,因为我真的想知道Mono compiler-as-a-service功能是否允许this@mcintyre321编译器作为服务可以处理它,因为它可以在较小的块中构建代码。问题是a)您必须维护所有引用并自行解决b)它不适合构建整个应用程序。