【问题标题】:Visual Basic .NET compiled or interpreted?Visual Basic .NET 编译还是解释?
【发布时间】:2011-05-14 15:51:55
【问题描述】:

Visual Basic 2010 是编译型语言还是解释型语言? vb程序可以反汇编吗?

【问题讨论】:

  • 我知道几乎所有使用 .NET 创建的程序集都可以使用 VS 提供的 ildasm 轻松反汇编。

标签: .net vb.net visual-studio-2010


【解决方案1】:

它被编译为IL code,通常是JITted。可以使用Ngen 之类的工具创建原生图像。

反汇编 .NET 程序集非常容易。有许多可用的工具(免费和商业)可以做到这一点。

【讨论】:

【解决方案2】:

取决于执行环境。但是一般都是编译的。两次,首先从源代码到 IL(中间语言)。再次在运行时通过即时编译器从 IL 到机器代码。除了使用 IL 解释器的 .NET Micro Framework 之外。中间形式允许相当不错的反编译,Reflector 是最好的工具。

【讨论】:

    【解决方案3】:

    两者兼而有之。它被编译成 IL,然后在运行时“及时编译”(JITed)成机器代码。

    【讨论】:

    • 虽然它可以被解释(Mono 对此有一个模式),但在 Microsoft .NET 实现中它始终是 JIT 编译的。
    • IL 不被解释,它被即时编译为本机代码。
    【解决方案4】:

    两者兼而有之。它被编译为 CIL(通用中间语言:http://en.wikipedia.org/wiki/Common_Intermediate_Language)。此 CIL 是由 CLR(公共语言运行时)编译为本地代码的 JIT(即时)。

    由于 CIL 代码保持完整,因此将 CIL 反编译为 C#、VB .NET 或其他 .NET 变体相当简单。有几种产品可以做到这一点(Reflector、dotPeek)。为了防止源代码被盗,您可以使用混淆器(例如 Dotfuscator)来确保任何将 CIL 反编译为 C#/VB .NET 的尝试都会导致乱码。

    【讨论】:

    • 你说它是两者的混合,大概意味着你相信它被解释了。在 Microsoft .NET 实现的正常操作中,你能说你认为它何时被解释了吗?
    • 解释语言是一种在运行时由解释程序 (en.wikipedia.org/wiki/Interpreted_language) 解释的语言。在 .NET 中,该解释程序是 CLR。​​
    • @JeffN825:我认为这是对“解释”的非常广义解释,因为在第一次通过后,不再需要 IL。我不认为有一个黑白的“编译”与“解释”观点真的有意义,其中包括 JIT 编译为“解释”。假设您有一个系统,其中“可执行”格式只是 C 源代码,在运行之前立即编译(由系统)......在您看来,这算作“解释”吗?毕竟系统的input是source。
    • 如果您不喜欢它的运行时方面(对于 GC 等),您是否会认为 Mono 的 AOT 编译器仍处于“解释”状态?如果运行时在运行任何代码之前将所有程序集的全部编译为本机代码,而不是即时执行会怎样?很难看出这些场景如何算作“解释”IL IMO。
    • @JeffN825:考虑一个已经运行了一年而没有重新启动的服务器。自从运行的第一个小时以来,IL 就没有被使用过——从那时起,一切都完全是原生的。为什么考虑“解释”是有用的?我认为“解释”代码意味着每次都检查它并执行“它意味着什么” - 所以如果你有一个循环,解释器系统将不得不解释代码的每次迭代环形。当然,这就是它变慢的原因。
    【解决方案5】:

    这很复杂。

    与 Java 一样,.Net 语言(包括 C# 和 VB)被编译成一种类似字节码的语言,称为 IL(中间语言)。该 IL 是随后分发给其他计算机的内容。

    但是,它并不止于此。 IL 在实际执行之前由 JIT(即时)编译器编译为本机代码。是的,vb 和所有语言一样,可以反汇编。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 2011-07-01
      • 2014-04-05
      • 2011-08-05
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多