C#/ VS没有像Java / Eclipse这样的自动构建功能的原因是什么?

时间:2010-09-11 19:29:36

标签: c# java compiler-construction

我是一名C#/ .Net开发人员刚开始使用Android进行Java开发,并且使用Eclipse时我注意到它会随着你的编译进行编译,所以你不必等待程序构建。这看起来非常惊人,除非有些事情我不明白。

我想知道为什么C#和Visual Studio IDE不提供此功能?有原因吗?

5 个答案:

答案 0 :(得分:18)

这与Java没有任何关系。它更像是Eclipse的一个特性。特别是,增量后台编译是所有Smalltalk IDE的标准功能,至少从1978年左右开始,甚至比Lisp IDE更长。

Eclipse 最初是,是一个用Smalltalk编写的Smalltalk IDE,至今仍由IBM的Smalltalk部门维护。因此,当IBM的Smalltalk部门开发自己的Java编译器时,他们自然会将其编写为增量和重入,就像他们的Smalltalk编译器一样。这个名为 Jikes 的编译器与Eclipse一起开源,并成为 ecj(Eclipse编译器for Java),支持所有增量动态编译, Eclipse JDT的语法突出显示,代码完成,类型推断和重构功能。

绝对没有理由认为C#也不可能。它工作的原因是因为编译器不支持它,特别是编译器不是增量的。但这不是.NET或C#或Visual Studio的固有限制,这是C#编译器维护者的想象力的限制:传统上,Microsoft的所有编译器都是由C ++编译器团队用C ++编写的,而那些人根本就没有听说过渐进式编译。不是因为它们很愚蠢,而是因为在C ++社区中没有人关心它。

但是,例如,VB社区确实关心这些东西,因为他们习惯于使用VB Classic。因此,VB.NET编译器实际上支持增量构建,编辑和继续,IntelliSense,类型推断和重构。

当然,C#插件也支持很多东西,但它们不使用实际的C#编译器来做到这一点。相反,他们基本上不得不重新实现Visual Studio插件的一半编译器才能工作,但他们没有实现实际的代码生成后端,所以虽然插件的一部分“编译器”可以< / em>进行增量解析,语法突出显示,重构和编辑并继续,实际上不能编译

然而,C#的情况将会发生变化:编译器的责任被重新分配给相应的语言团队,C#团队目前正在重新实现编译器 in C#团队中的C#和。其中一个经常被讨论的重写结果将是编译器即服务功能,它允许您即时编译C#和/或表达式树的小片段,例如也可以经常演示C#REPL和C#脚本编写功能。

鉴于为了使REPL正常工作,编译器需要能够编译代码代码的小的单个代码段,新的编译器应该是在Visual Studio C#插件中用来替换当前的一堆IntelliSense和语法高亮黑客,在Visual Studio中进行渐进式编译应该不会太难。

答案 1 :(得分:7)

在Java中,每个类都被编译成一个单独的类文件,因此在每次保存时编译小的代码单元非常容易。在.net中,您将一堆类编译成单个DLL,这在编译过程中速度较慢且需要更多逻辑。

BTW,这不是一种语言功能,它是一种IDE功能。并非所有的Java IDE都可以进行自动编译,如果你愿意,也可以在eclipse中禁用它。我相信Visual Studio有自动构建工具..

答案 2 :(得分:1)

Resharper for VS的插件可以动态地为您提供编译错误,但不会为您提供自动构建器

答案 3 :(得分:0)

除了最简单的应用程序之外的其他任何内容都会导致大量的延迟,因为每次按键都会编译和链接。

VS确实具有智能感知和大量的动态语法和健全性检查,它可以为您提供autobuild的大部分优势而不会出现延迟。 (据说在VS2010中看起来似乎非常热情......)

答案 4 :(得分:0)

我知道,不是自动构建器,但使用telerikJustCode是一种远远超出VS即时语法检查的产品,它提供了解决方案范围的代码分析。我不认为我是世界上唯一一个曾经尝试构建的开发人员,以此来检查我是否已经包含了构建代码所需的所有内容。使用JustCode,您可以获得很多视觉帮助,而无需等待编译器告诉您错过了某些内容。