C#是部分解释还是真正编译?

Joh*_*n V 65 c# compiled interpreted-language

关于这一点有很多矛盾的信息.虽然有人说C#被编译(因为它被编译成IL然后在运行时被编译为本机代码),但是其他人说它被解释为它需要.NET.EN Wiki说:

许多解释语言首先被编译为某种形式的虚拟机代码,然后在运行时将其解释或编译为本机代码.

所以我很困惑.任何人都可以清楚解释这个

Sim*_*mon 66

C#编译器将C#编译成IL.

然后,根据需要将此IL实时编译(JIT)到主机的本机汇编语言中.但是,可以编写一个解释IL的.NET运行时.即使这样做了,我仍然认为c#是一种编译语言.

  • JIT编译!=解释 (19认同)
  • 就个人而言,我从未听过有人称C#为解释性语言. (13认同)
  • 也许他们只是错误或误解.或许我错了:-) (8认同)
  • 但是为什么它被许多程序员认为是解释语言呢? (4认同)
  • @JoSmo csc.exe是构建c#的命令行工具.它代表C-Sharp _Compiler_ (3认同)
  • 为什么你会说 c# 是一种编译语言?你能详细说明一下吗? (2认同)
  • 在C ++中,一个知识渊博的程序员可以执行诸如选择模板而不是虚拟方法之类的事情来影响所生成代码的效率。在C#中,这并不是真正的事情。程序员和未真正编译的代码之间有太多层。而且,不需要附带C ++代码的VM运行时。使用C#,您仍然需要某种解释器。它不是真的编译。 (2认同)

Jon*_*nna 38

纯编译语言有一些优点.速度通常和工作集大小一样.纯粹的解释语言有一些优点.不需要显式编译阶段的灵活性,允许我们进行适当的编辑,并且通常更容易移植.

在这种情况下,jitted语言适合中间地带.

这就是为什么我们可能会认为,根据我们关心的指标取决于哪个位置,以及我们对一个或另一个的偏见,我们可能会认为一个jitted语言是编译的还是解释的.

C#也可以在第一次运行时编译,就像在ASP.NET中一样,这使得它在这种情况下接近解释(虽然它仍然被编译为IL然后在这种情况下进行jitted).当然,它具有在这种情况下解释的所有优点(与经典ASP中使用的VBScript或JScript相比),以及编译的许多优点.

严格来说,没有任何语言可以使用语言进行搜索,解释或编译.我们可以将C#转换为本机代码(尽管如果它像动态加载程序集那样仍然会使用IL和jitting).我们可以为C或C++编写一个内部版本(有几个人已经这样做了).在最常见的用例中,C#被编译为IL,然后进行jitted,这不是解释的经典定义,也不是编译的经典定义.


Joh*_*ser 15

基于观点的语义和语句太多.

首先:C#不是解释性语言; CLR和JVM被认为是"运行时"或"中间件",但同样的名称适用于像Perl这样的东西.这在与名字有关的人之间造成了很多混乱.

引用运行时的术语"解释器"通常意味着现有代码解释一些非本机代码.有两种大范例:解析读取原始源代码并采取逻辑操作; 字节码执行首先将代码编译为非本机二进制表示,这需要更少的CPU周期来解释.

Java最初编译为字节码,然后通过解释器; 现在,JVM读取字节码并及时将其编译为本机代码.CIL也这样做:CLR使用即时编译到本机代码.

考虑运行源代码,运行字节码,编译到本机,即时编译,通过编译器运行源代码到实时原生等的所有组合,等等.语言是否被编译或解释的语义变得毫无意义.

例如:许多解释语言使用即时字节码编译.C#编译为CIL,JIT编译为本机; 相比之下,Perl立即将脚本编译为字节码,然后通过解释器运行此字节码.您只能以CIL字节码格式运行C#程序集; 您只能以原始源代码格式运行Perl脚本.

即时编译器还运行许多外部和内部仪器.运行时跟踪各种函数的执行,然后调整代码布局以优化其特定执行流的分支和代码组织.这意味着JIT代码可以比本机编译的代码运行得更快(例如C++,或者像C#通过IL2CPP运行),因为JIT在运行时将其优化策略调整为代码的实际执行情况.

欢迎来到计算机编程世界.我们决定使它非常复杂,然后将非描述性名称附加到所有内容上.目的是在没有实际意义的词语定义上创造火焰战争.


psu*_*sur 12

看这里:http://msdn.microsoft.com/library/z1zx9t92

用C#编写的源代码被编译成符合CLI规范的中间语言(IL).

(......)

执行C#程序时,程序集将加载到CLR中,CLR可能会根据清单中的信息执行各种操作.然后,如果满足安全性要求,则CLR执行即时(JIT)编译以将IL代码转换为本机机器指令.


小智 11

如果您感觉,学习或者是老上学,那么编译的EXE将从源代码转换为机器代码,然后解释C#.如果您认为编译意味着将源代码转换为其他代码(如字节代码),则转换为是.对我来说,解释了任何需要运行时处理才能在其构建的操作系统中工作的东西.

  • 我们不是在征求意见,而"对我来说"是一种意见.这不是一个论坛. (2认同)
  • 不幸的是,问题的性质是一个观点。 (2认同)

Phi*_*lip 7

首先让我们了解解释和编译的定义。

“编译”(指代码时)意味着将代码从一种语言翻译成另一种语言。通常从人类可读的源代码到目标处理器可以......处理的机器代码。

“解释”(指代码时)也意味着将代码从一种语言翻译成另一种语言。但这一次它通常用于将人类可读的源代码转换为中间代码,然后由虚拟机将其解释为机器代码。

只是要清楚
源代码 -> 编译器 -> 机器代码
源代码 -> 编译器 -> 字节码 -> 解释器 -> 机器代码

理论上,任何语言都可以被解释编译。通常 Java 被编译成字节码,字节码由 Java 虚拟机解释成机器码。C# 通常被解释为字节码,由 CLR、公共语言运行时、另一个虚拟机编译。

到目前为止,整件事都是营销噱头。添加了术语“解释”(或至少增加了使用)以帮助展示即时编译是多么简洁。但他们可以只使用“编译”。区别更多是对英语语言和商业趋势的研究,而不是任何技术性质的研究。

  • 在解释器中,运行时不生成机器代码,只执行现有的机器代码。根据该标准,将公共语言运行时称为解释器是完全错误的。 (7认同)