什么是本地代码?

Project的Web部分(在VS2008中的项目属性下)有一个调试器列表:ASP.NET,Native Code,SQL Server。 什么是本地代码?

本机代码是由CPU直接执行的机器代码。 这与.NET字节码形成对比,后者由.NET虚拟机解释。

一个不错的MSDN命中: 调试本机代码

本机代码不能在公共语言运行时(CLR)上运行。 一个例子是非托管C ++应用程序。

本机代码本质上是存储器中的数据,计算机中的中央处理芯片可以直接读取和执行。 想想CPU吮吸数据,并且数据在切换时切换,关闭和打开:

[ CPU ] ==================================== [ RAM ] ^^^^^ | | LOAD _memoryAddress12, D1 ; tells the CPU to get data from slot 12 ; in RAM, and put it in register D1 inside the CPU ^^^^^ | | ADD D1, 24 ; tells the CPU to do an internal calculation ^^^^^ | | STORE R0, _memoryAddress23 ; tells the CPU to put the answer into slot 23 in ram 

您可以想到打卡或者那些音乐钢琴卷的说明,它们会在CPU进入时翻转开关。重要的是这是在硬件中:它实际上发生在电线/电路上,几乎以速度光 但是有很多开关需要翻转。 因此,进入机器的每个“本机指令”都以机器的“时钟速度”执行(在现代PC上每秒约25亿次)。 实际上,它有点复杂,一些指令需要更长时间,一些指令同时完成,等等。

现在,相比之下,虚拟机运行非本机代码(通常称为字节码),实际上是虚拟虚假机器。 在语言方面,虚拟机是运行另一个程序的程序,而不是直接在硬件中运行的程序。 因此,在上述程序加载数据,添加数据并将结果存储在三个本机指令中的情况下,虚拟程序可能会执行更多这样的操作(免责声明:这是生锈的伪汇编代码):

  load _firstInstruction, D1 if_equal D1, 12 jump _itsAnAddInstructionHandleIt if_equal D1, 13 jump _itsASubstractInstructionHandleIt if_equal D1, 14 jump _itsAMultiplyInstructionHandleIt if_equal D1, 15 jump _itsADivideInstructionHandleIt if_equal D1, 16 jump _itsALoadInstructionHandleIt ... _itsALoadInstructionHandleIt: load D1, D2 add 4, D2 load D2, D3 return 

等等。 这只是以非本机方式处理上述本机指令之一的示例:大约10条指令(取决于实现)而不是第一条单一本机指令,而且我遗漏了重要的细节,比如取消装箱数据! 关键是,可能在以后的平均约20-30条指令中,您将完成与上面的本机代码中的一行相同的操作。

现在。 总而言之,GOOD虚拟机有一个JIT,它可以在执行时将其中的一部分转换为本机代码,或者在执行它们之前。 但是有很多东西,比如Boxed类型,它们无法直接转换,因为虚拟机的重点在于它不能以低级,电路友好的方式工作,本机代码会。 虚拟机更容易编程,但速度要慢得多。

虚拟机的另一个巨大缺点是它们通常具有很大的内存开销,如果你想同时在内存中编写数百万项数据,它们就会变得毫无用处。 在这种情况下,VM虽然旨在使代码更高级别和更易读,但可能会迫使您执行比本机代码更低级,更糟糕的事情,因为这些好处开始变得弊端。

对于初学者来说,本机代码只是一种适合在特定程序集上运行的中级语言。 它类似于其他HLL中的目标代码。