【发布时间】:2025-12-30 02:15:09
【问题描述】:
我是一名 C#/.Net 开发人员,刚开始为 Android 开发 Java,使用 Eclipse 我注意到它可以随时编译,因此您无需等待程序构建。这看起来很神奇,除非发生了我不明白的事情。
我想知道为什么 C# 和 Visual Studio IDE 不提供此功能?有什么原因吗?
【问题讨论】:
标签: c# java compiler-construction
我是一名 C#/.Net 开发人员,刚开始为 Android 开发 Java,使用 Eclipse 我注意到它可以随时编译,因此您无需等待程序构建。这看起来很神奇,除非发生了我不明白的事情。
我想知道为什么 C# 和 Visual Studio IDE 不提供此功能?有什么原因吗?
【问题讨论】:
标签: c# java compiler-construction
这实际上与 Java 没有任何关系。它更像是 Eclipse 的一个特性。特别是,增量后台编译是所有 Smalltalk IDE 至少从 1978 年左右开始的标准功能,甚至比 Lisp IDE 中的时间更长。
Eclipse是最初是一个 Smalltalk IDE,用 Smalltalk 编写,至今仍由 IBM 的 Smalltalk 部门维护。因此,当 IBM 的 Smalltalk 部门开发自己的 Java 编译器时,他们很自然地将其编写为增量和可重入的,就像他们的 Smalltalk 编译器一样。而这个名为 Jikes 的编译器与 Eclipse 一起开源,并成为支持所有增量动态编译的 ecj(Java 的 Eclipse 编译器), Eclipse JDT 的语法高亮、代码完成、类型推断和重构功能。
绝对没有理由不能让 C# 也能做到这一点。它不起作用的原因是编译器不支持它,特别是编译器不是增量的。但这并不是 .NET 或 C# 或 Visual Studio 的固有限制,而是 C# 编译器维护者的想象力限制:传统上,微软的所有编译器都是由 C++ 编译器团队用 C++ 编写的,而那些人根本就没有听说过增量编译。不是因为他们愚蠢,而是因为在 C++ 社区中没有人关心这一点。
但是,例如,VB 社区确实关心这些东西,因为他们已经习惯了 VB Classic。因此,VB.NET 编译器实际上支持增量构建、编辑并继续、IntelliSense、类型推断和重构。
当然,C# 插件也支持很多这样的东西,但他们不使用实际的 C# 编译器来执行此操作。相反,他们基本上必须重新实现一半的编译器才能让 Visual Studio 插件工作,但他们没有实现实际的代码生成后端,所以虽然作为插件一部分的“编译器”可以 进行增量解析、语法突出显示、重构和编辑并继续,它不能实际上,你知道,编译。
然而,C# 的情况将发生变化:编译器的责任已重新分配给各自的语言团队,而 C# 团队目前正在重新实现编译器in C# 和在 C# 团队中。这种重写的一个经常被谈论的结果将是编译器即服务特性,它允许您即时编译 C# 和/或表达式树的小型 sn-ps,例如还经常展示 C# REPL 和 C# 脚本功能。
鉴于为了使 REPL 工作,编译器需要能够编译小的单个 sn-ps 代码无论如何,并且新编译器应该是要在 Visual Studio C# 插件中使用来替换当前一堆 IntelliSense 和语法高亮 hack,在 Visual Studio 中进行增量编译应该不会太难。
【讨论】:
在 Java 中,每个类都被编译成一个单独的类文件,因此每次保存时都可以很容易地编译小单元代码。在 .net 中,您将一堆类编译到一个 DLL 中,这比较慢并且在编译过程中需要更多的逻辑。
顺便说一句,这不是语言功能,而是 IDE 功能。并不是所有的 java IDE 都会自动编译,如果你愿意,你也可以在 eclipse 中禁用它。而且我确信 Visual Studio 有自动构建工具..
【讨论】:
Resharper 为 VS 提供插件会给你即时编译错误,但不会自动生成器
【讨论】:
自动构建除了最微不足道的应用程序之外的任何应用程序都会导致大量延迟,因为它会在您每次按下某个键时进行编译和链接。
VS 确实具有智能感知和大量动态语法和健全性检查,这为您提供了自动构建的大部分优势而不会出现延迟。 (话说它在VS2010中似乎很烦人……)
【讨论】: