Что такое родной код?

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

Ответы

Ответ 1

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

Хороший хит MSDN: отладка нативного кода

Ответ 2

Исходный код не запускается в среде Common Language Runtime (CLR). Примером может служить не управляемое приложение С++.

Ответ 3

Родной код - это по существу данные в памяти, которые центральный процессор в компьютере может читать и выполнять напрямую. Подумайте о том, что 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 по мере их входа. Важная часть заключается в том, что это в ОБОРУДОВАНИИ: буквально происходит на проводах/схемах, почти со скоростью света. Но есть много переключателей для переключения. Таким образом, каждая из этих "нативных инструкций", идущих в машину, выполняется на "тактовой частоте" машины (около 2,5 миллиарда раз в секунду на современном ПК). На самом деле это немного сложнее, некоторые инструкции занимают немного больше времени, некоторые выполняются одновременно и т.д.

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

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

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

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

Ответ 4

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