Project的Web部分(在VS2008中的项目属性下)有一个调试器列表:ASP.NET,Native Code,SQL Server。什么是本地代码?
答案 0 :(得分:20)
本机代码是由CPU直接执行的机器代码。这与.NET字节码形成对比,后者由.NET虚拟机解释。
一个不错的MSDN点击:Debugging Native Code
答案 1 :(得分:4)
本机代码不能在公共语言运行时(CLR)上运行。一个例子是非托管C ++应用程序。
答案 2 :(得分:1)
本机代码本质上是内存中的数据,计算机中的中央处理芯片可以直接读取和执行。想想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
等等。这只是以非本机方式处理上述本机指令的 ONE 的示例:大约10条指令(取决于实现)而不是第一条单一本机指令,而我遗漏了重要内容详细信息,如拆箱数据!关键是,可能在以后的平均约20-30条指令中,您将完成与上述本机代码中的一行相同的操作。
现在。总而言之,GOOD虚拟机有一个JIT,它可以在执行时将其中的一部分转换为本机代码,或者在执行它们之前。但是有很多东西,比如Boxed类型,它们无法直接转换,因为虚拟机的重点在于它不能以低级别,电路友好的方式工作,本机代码会。虚拟机更容易编程,但速度要慢得多。
虚拟机的另一个巨大缺点是它们通常会有很大的内存开销,如果你想同时在内存中编写数百万项数据,它们就会变得毫无用处。在这种情况下,VM虽然旨在使代码更高级别和更具可读性,但可能会迫使您执行比本机代码更低级,更糟糕的事情,因为这些优点开始成为缺点。
答案 3 :(得分:0)
首先,本机代码只是一种适合在特定程序集上运行的中间语言。它类似于其他HLL中的目标代码。