什么是原生代码?

时间:2008-09-30 06:17:19

标签: c# asp.net visual-studio-2008

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

4 个答案:

答案 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中的目标代码。