Visual Basic .NET是编译还是解释?

10

Visual Basic 2010是一种编译型语言还是解释型语言?VB程序是否可以被反汇编?


1
我知道几乎所有用.NET创建的汇编代码都可以使用VS提供的ildasm轻松反编译。 - atoMerz
5个回答

15

这段内容涉及到it技术,它被编译成IL代码,通常是采用JIT编译。可以使用像Ngen这样的工具创建本机映像。

.NET程序集的反编译非常容易,有许多免费和商业的工具可供使用。


1
在这个问题中,有关工具的良好讨论可在以下链接找到:https://dev59.com/LnE85IYBdhLWcg3wtV71 - James Skemp

3

这有点两者兼备。它被编译成中间语言(IL),然后在运行时进行“即时编译”(JIT),转换为机器码。


3
在微软 .NET 实现中,它总是进行 JIT 编译,尽管它可以被解释(Mono 有一种模式可以实现这一点)。 - Jon Skeet
IL并不是解释性的,而是即时编译成本地代码。 - driis

3

这取决于执行环境。但通常会进行编译,分为两步:首先将源代码编译成中间语言(IL),然后在运行时通过即时编译器将IL转换为机器码。但是在像.NET Micro Framework这样的环境中,会使用IL解释器。中间形式允许相当不错的反编译,Reflector是最好的工具。


0

这是一种混合编译方式。代码被编译成CIL(通用中间语言: http://en.wikipedia.org/wiki/Common_Intermediate_Language)。CLR (公共语言运行时) JIT(即时) 编译该CIL为本机代码。

由于CIL代码保持不变,因此将CIL反编译为C#、VB .NET或另一个.NET变体相对简单。有几种产品可以实现这一点(Reflector、dotPeek)。为了防止源代码被盗,您可以使用混淆器(例如Dotfuscator)来确保将CIL反编译为C#/VB .NET的任何尝试都会产生无意义的结果。


1
你说它是两者的混合体,大概意思是你认为它是解释执行的。在 Microsoft .NET 实现的正常操作中,你能否说出你认为它是何时被解释执行的? - Jon Skeet
解释性语言是指在运行时由解释程序(http://en.wikipedia.org/wiki/Interpreted_language)进行解释的一种语言。在.NET中,这个解释程序就是CLR。 - Jeff
@JeffN825:如果在第一次通过后,IL不再需要,那么我认为这是对“解释”非常宽泛的解释。我认为将JIT编译视为“解释”,并将其包括在“编译”与“解释”的黑白观点中,这并不是很合理的。假设您有一个系统,其中“可执行”格式只是C源代码,在运行之前立即被系统编译...在您看来,这算是“解释”吗?毕竟,系统的输入是源代码。 - Jon Skeet
如果您不喜欢它的运行时方面(例如GC等),您是否认为Mono的AOT编译器仍然是“解释”的?如果运行时在运行任何代码之前将所有程序集的全部编译为本机代码,而不是仅在需要时进行编译,那会怎样呢?我很难看出这些情况如何算作“解释”IL。 - Jon Skeet
我不认为Mono的AOT编译器算是“解释执行”...我也不认为ngen'd程序集是“解释执行”的...但在更常见的情况下,你将程序集保留在CIL格式中,并进行JIT编译...是的,我会认为那是解释执行。你的评论很公正,但我不认为这是一个非黑即白的情况,我不一定是错的。 - Jeff
3
考虑一个服务器,已经连续运行了一年没有重启。自首个小时开始运行以来,IL从未被使用过-自那以后,一切都是完全本地的。为什么考虑它是“解释性”的有用之处?我认为“解释”代码意味着每次都要检查并执行“它的意思”,所以如果你有一个循环,解释器系统将不得不在每次循环迭代时解释代码。这正是使它变慢的原因。 - Jon Skeet

0

这很复杂。

与Java类似,.Net语言(包括C#和VB)被编译成一种名为IL(Intermediate Language)的字节码语言。然后将此IL分发到其他计算机。

但是,事情并没有就此结束。在实际执行之前,JIT(即时)编译器将IL编译为本地代码。是的,像所有语言一样,VB也可以被反汇编。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接