Что такое нативный код? - PullRequest
       36

Что такое нативный код?

16 голосов
/ 30 сентября 2008

Веб-раздел проекта (в свойствах проекта в VS2008) содержит список отладчиков: ASP.NET, собственный код, SQL Server. Что такое собственный код?

Ответы [ 4 ]

20 голосов
/ 30 сентября 2008

Нативный код - это машинный код, исполняемый непосредственно ЦПУ. Это отличается от байт-кода .NET, который интерпретируется виртуальной машиной .NET.

Хороший MSDN-хит: Отладка собственного кода

4 голосов
/ 30 сентября 2008

Собственный код не запускается в среде CLR. Примером может служить неуправляемое приложение C ++.

1 голос
/ 20 мая 2013

Собственный код - это, по сути, данные в памяти, которые центральный процессор в компьютере может считывать и выполнять напрямую. Подумайте о том, как процессор всасывает данные, и что переключение данных переключается по мере прохождения, выключая и включая:

   [  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

Вы можете думать о таких инструкциях, как перфокарты или музыкальные пианино, которые переключаются в процессоре по мере их включения. Важная часть заключается в том, что это в аппаратном обеспечении: это буквально происходит на проводах / схемах, почти со скоростью света. Но много переключателей для переключения. Таким образом, каждая из этих «нативных инструкций», поступающих в машину, выполняется на «тактовой частоте» машины (около 2,5 миллиардов раз в секунду на современном ПК). На самом деле все немного сложнее: некоторые инструкции занимают немного больше времени, некоторые выполняются одновременно и т. Д.

В отличие от этого, виртуальные машины, напротив, запускают не собственный код (часто называемый байт-кодом), буквально на виртуальной , поддельной машине. Когда дело доходит до языков, виртуальная машина - это программа, которая запускает ДРУГУЮ программу, а не программу, работающую непосредственно на аппаратном уровне. Таким образом, если вышеприведенная программа загружает данные, добавляет к ним и сохраняет результат только в трех собственных инструкциях, виртуальная программа может сделать что-то более похожее на это (Отказ от ответственности: это ржавый код псевдо-сборки):

   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 инструкций вы выполните то же самое, что и ОДНА строка из нативного кода выше.

СЕЙЧАС. Все это говорит о том, что ХОРОШИЕ виртуальные машины имеют JIT, который может преобразовывать НЕКОТОРЫЕ из них в собственный код по мере их выполнения или непосредственно перед их выполнением. Но есть много вещей, таких как типы в штучной упаковке, которые не могут быть преобразованы напрямую, потому что вся суть виртуальной машины в том, что она не работает низкоуровневым, дружественным к схемам способом, что нативный код мог бы , Виртуальные машины легче программировать, но гораздо медленнее.

Другим огромным недостатком виртуальных машин является то, что они часто имеют большие накладные расходы памяти, что делает их довольно бесполезными, если вы хотите одновременно кодировать миллионы элементов данных в памяти. В такие моменты виртуальная машина, хотя и предназначена для того, чтобы сделать код более высокого уровня и более читабельным, может вынудить вас делать вещи более низкого уровня, чем нативный код, потому что преимущества начинают становиться недостатками.

0 голосов
/ 23 октября 2015

Для начала нативный код - это просто промежуточный язык, предназначенный для работы в конкретной сборке. Он похож на объектный код, как и в других HLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...