C#部分解释或真正编译?
有很多矛盾的信息。 虽然有人说C#编译(因为它被编译成IL,然后运行时本地代码),其他人说,它的解释,因为它需要.NET。 EN维基说:
许多解释型语言首先被编译成某种forms的虚拟机代码,然后在运行时解释或编译为本机代码。
所以我很困惑。 谁能解释清楚吗?
非常感谢
C#被编译成IL,由C#编译器编译。
然后,IL根据需要即时编译(JIT)到主机的本机汇编语言中。 虽然可以编写一个.NET运行库来解释IL。 即使这样做了,我仍然认为c#是一种编译语言。
纯粹编译的语言有一些优点。 速度通常和工作集大小一样。 纯粹的解释语言有一些优点。 灵活性不需要一个明确的编译阶段,允许我们编辑到位,而且往往更容易移植。
在这种情况下,一个乱七八糟的语言适合中间地带。
单凭这个原因,我们可能会认为一个被抽象的语言是编译的,或者是被解释的,取决于我们关心的是哪一个度量标准,以及我们对这个或那个的偏见。
C#也可以在第一次运行时编译,就像在ASP.NET中发生的那样,在这种情况下它可以接近解释(尽pipe它仍然编译为IL,然后在这种情况下进行parsing)。 当然,它具有几乎所有在这种情况下解释的优点(与传统ASP中使用的VBScript或JScript相比),以及编译的许多优点。
严格来说,没有任何一种语言会被理解,解释或汇编成语言。 我们可以将C#编译为本机代码(尽pipe如果它像dynamic加载程序集一样,仍然会使用IL和jitting)。 我们可以为C或C ++编写一个intepretter(有几个人这么做)。 然而在最常见的用例中,C#被编译为IL,然后被parsing,这不是经典的解释和编译的定义。
看看这里: http : //msdn.microsoft.com/library/z1zx9t92
用C#编写的源代码被编译成符合CLI规范的中间语言(IL)。
(……)
当C#程序执行时,程序集被加载到CLR中,CLR可能会根据清单中的信息采取各种操作。 然后,如果安全要求得到满足,CLR执行即时(JIT)编译将IL代码转换为本地机器指令。
如果你觉得,学习,或者是旧的,编译EXE是从源代码到机器代码,然后解释C#。 如果您认为编译意味着将源代码转换为其他代码,如字节代码,那么是转换。 对于我来说,任何需要运行时处理才能在其构build的操作系统中工作的东西都会被解释。
太多的语义和基于意见的陈述。
首先:C#不是一种解释型语言, CLR和JVM被认为是“运行时”或“中间件”,但同样的名字适用于像Perl这样的东西。 这在与名字有关的人中造成了很多混乱。
引用运行时的术语“解释器”通常意味着现有代码解释一些非本地代码。 有两个大范例:parsing读取原始源代码并采取逻辑操作; 字节码执行首先将代码编译为非本地二进制表示,这需要更less的CPU周期来解释。
Java最初编译成字节码,然后通过翻译; 现在,JVM读取字节码,并及时将其编译为本地代码。 CIL也是这样做的:CLR使用即时编译来编译本地代码。
考虑运行源代码,运行字节码,编译本地,即时编译,通过编译器运行源代码到即时本地等等的所有组合。 语言是编译还是解释的语义变得毫无意义。
举一个例子:许多解释型语言使用即时字节码编译。 C#编译为CIL,JIT编译为本机; 相比之下,Perl立即将脚本编译为字节码,然后通过解释器运行该字节码。 您只能以CIL字节码格式运行C#程序集; 您只能以原始源代码格式运行Perl脚本。
即时编译器还运行了大量的外部和内部仪器。 运行时跟踪各种function的执行情况,然后调整代码布局以优化其特定执行stream程的分支和代码组织。 这意味着JIT代码可以比本机编译的代码运行得更快(就像C ++一样,或者像C#通过IL2CPP运行一样),因为JIT将其优化策略调整为运行代码的实际执行情况。
欢迎来到计算机编程的世界。 我们决定把它变得非常复杂,然后给所有的东西都附上非描述性的名字。 目的是为了定义没有实际意义的单词而制造火焰。
首先让我们来理解解释和编译的定义。
“编译”(指代码时)是指将代码从一种语言翻译成另一种语言。 通常从人类可读的源代码到目标处理器可以处理的机器代码。
“解释”(指代码时)也意味着将代码从一种语言翻译成另一种语言。 但是这次它通常用来从人类可读的源代码转换成由虚拟机将其解释为机器代码的中间代码。
只是要清楚
源代码 – >编译器 – >机器代码
源代码 – >编译器 – >字节码 – >解释器 – >机器码
任何语言在理论上都可以被解释或编译 。 通常Java被编译成由Java虚拟机解释为机器码的字节码。 通常将C#解释为由CLR(公共语言运行库,另一个虚拟机)编译的字节码。
整个事情到头来都是营销噱头。 “解释”一词被join(或者至less在使用中增加了),以帮助展示如何准确地进行即时编译 。 但他们本来可以用“编译”的。 这个区别更多的是对英语和商业趋势的研究,而不是技术上的任何事情。
C#在其生命周期中都被解释和编译。 C#被编译成由VM解释的虚拟语言。
混淆源于“编译语言”的模糊概念。
“编译语言”在某种意义上是一种误用,因为编译或解释不是语言的属性,而是运行时的属性。
例如,你可以写一个C解释器,但是人们通常把它称为“编译语言”,因为C实现编译为机器代码,并且编译语言时考虑到了编译。
我相信这是一个很老的话题。
从我的angular度来看,解释代码将经过一个解释器,逐行翻译并同时执行。 像javascript这样的例子,它是一个解释的代码,当一行javascript遇到错误时,脚本就会中断。
编译代码时,它将通过编译器,将所有代码一次转换为另一种代码,而不先执行。 执行是在另一个上下文中。
C#是可编译的语言。
大概我可以重复一下,因为我也遇到过这样的观点,有人认为有C#语言的解释器的事实是由于类似的项目
C#解释器控制台
或者,例如,着名的
LinqPAD
在那里你可以只写代码行并执行它们,这就使得Python就像语言一样,这是不正确的 。 它编译这些行并执行它们,就像一个普通的可编译的编程语言(从工作stream的angular度来看)。
像Java一样,C#有一个混合语言处理器。 混合处理器执行解释和编译工作。
由于计算机只能执行二进制代码,所以任何语言都会导致二进制代码的产生。 问题是:语言是否让你用二进制代码生成一个程序? 如果是,那么它就是一种编译语言:按照定义,“编译语言”中的“编译”是指编译成二进制代码,而不是转换成一些中间代码。 如果语言导致为程序生成这样的中间代码,则需要一个额外的软件来从这个代码执行二进制编译:它是一种解释型语言。 C#编译的程序是否可以直接在机器上执行,而不需要在本机上安装任何其他软件? 如果不是,那么这是一种解释性的语言。 对于一种解释型语言来说,它是一种解释器,它将在大部分时间以dynamic的方式生成底层的二进制代码,因为这种机制是这种语言灵活性的基础。 REM。 :有时看起来并不明显,因为解释器被捆绑到操作系统中
如果我们同意口译员的定义« 在计算机科学中,口译员是一种计算机程序,它直接执行(即执行)以编程或脚本语言编写的指令,而不需要它们以前被编译成机器语言程序。 毫无疑问:C#不是一种解释型语言。
维基百科上的翻译