C# 什么是本机代码?

C# 什么是本机代码?,c#,asp.net,visual-studio-2008,C#,Asp.net,Visual Studio 2008,该项目的Web部分(在VS2008的项目属性下)有一个调试器列表:ASP.NET、本机代码、SQL Server。什么是本机代码?本机代码是CPU直接执行的机器代码。这与.NET字节码不同,后者由.NET虚拟机解释 一个很好的MSDN提示:本机代码不在公共语言运行库(CLR)上运行。一个例子是非托管C++应用程序。本机代码本质上是内存中的数据,计算机中的中央处理芯片可以直接读取和执行。想象一下CPU吸入数据,数据通过时翻转开关,关闭和打开: [ CPU ] ==============

该项目的Web部分(在VS2008的项目属性下)有一个调试器列表:ASP.NET、本机代码、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时,它们会翻转CPU中的开关。重要的是,这是在硬件上:它几乎以光速发生在电线/电路上。但是有很多开关需要翻转。因此,每一条进入机器的“本机指令”都以机器的“时钟速度”执行(在现代PC上大约每秒25亿次)。实际上,它有点复杂,有些指令需要更长的时间,有些指令是同时完成的,等等

现在,与之相反,虚拟机运行非本机代码(通常称为字节码),实际上是在一台虚拟的伪机器上运行的。说到语言,虚拟机是一个运行另一个程序的程序,而不是直接在硬件中运行的程序。因此,当上面的程序加载数据、添加数据并将结果存储在三条本机指令中时,虚拟程序可能会执行类似的操作(免责声明:这是生锈的伪汇编代码):

等等。这只是一个以非本机方式处理上述一条本机指令的示例:大约10条指令(取决于实现),而不是第一条、一条本机指令,并且我忽略了重要的细节,例如取消数据绑定!关键是,在平均大约20-30条指令之后,您将完成与上面本机代码中的一行相同的事情

现在。综上所述,好的虚拟机有一个JIT,它可以在执行时或在执行之前将其中的一些代码转换为本机代码。但是有很多东西,比如盒装类型,它们不能直接转换,因为虚拟机的全部意义在于它不能以低级别、电路友好的方式工作,而本机代码就是这样。虚拟机更容易编程,但速度要慢得多


虚拟机的另一个巨大缺点是,它们通常有很大的内存开销,如果您想同时在内存中对数百万项数据进行编码,这使得它们非常无用。在这种情况下,虚拟机虽然旨在提高代码的级别和可读性,但它可以迫使您执行比本机代码更低级、更糟糕的操作,因为好处开始变成缺点。

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

因此,我在Mozilla的开发人员网络上阅读了JavaScript的XMLHttpRequest——onreadystatechange函数有一个警告,警告不要将其用于本机代码。。。这是否意味着在某些情况下,JavaScript可以直接由CPU执行,而不是通过浏览器执行?我想这很愚蠢,但我从来没有想到会发生这种事。如果是真的,有人有这样的例子吗?在这个链接中:作者建议本机代码不是在CLR中运行的,而是直接在机器上运行的,因此JIT IL的输出也可以被认为是本机代码,但由于已通过CLR,因此也得到了有效管理
   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