2009-05-13 3 views
43

Например, при поиске на сайте профилировщика GlowCode он говорит:Разница между родным и управляемым кодом?

«GlowCode 6,2 и профиль 64 нативный, управляемый, и смешанные C++, C#, .NET код»

Что они означают?

+0

см. Также http://stackoverflow.com/questions/3434202/what-is-the-difference-between-native-code-machine-code-and-assembly-code –

ответ

64

Исходный код - это код, память которого не «управляется», как и в, память не освобождена для вас (например, C++ «delete» и «C»), без учета ссылок, без сбора мусора. Управляемый код, как вы догадались, это код, чья память свободна и выделена для вас, сборка мусора и другие лакомства.

Смешанный код - это когда вы управляете кодом, который вызывает неуправляемый уровень. Обычно, когда у вас есть чистая неуправляемая C++ DLL, и вы вызываете ее из .NET с помощью P/invoke.

+2

Компилятор C++/CLI позволяет управлять кодом (скомпилирован с '/ clr' и выводится как MSIL) для размещения собственных объектов в нативной куче (без сбора мусора). Кроме того, сборщик мусора (рабочий стол) .NET не использует подсчет ссылок (который имеет проблемы с циклами). –

+0

Я нашел этот ответ от Бинга. Гораздо лучше объяснил, чем веб-сайт MS. – toddwz

+2

Native * не означает управление памятью. Родной означает, что это приложение Windows или dll. .Net тоже не создается. Он использует то же расширение файла, что и родные приложения, но содержимое этих exe и dll не является окнами exe и dll. Вот почему вы не можете использовать .ll «dll» с родным приложением Windows, потому что это не DLL Windows. –

39

Собственный код скомпилирован для работы непосредственно с ОС. Управляемый код, однако, предварительно скомпилирован (байт-код в Java-говорить), но затем обрабатывается компилятором Just In Time в собственный код во время выполнения. Управляемый код имеет интересный побочный эффект наличия возможности работы в разных операционных системах, поскольку машинный код не создается до тех пор, пока виртуальная виртуальная машина фактически не использует его. Таким образом, вы можете запускать .NET-приложения в Windows, а также запускать их на Linux или Mac, на которых установлена ​​среда исполнения Mono. Переносимость в настоящее время не такая чистая, как Java (из-за естественной закрытой архитектуры Microsoft), но концепция остается.

Если вы используете неуправляемое приложение, код был скомпилирован для выполнения для указанной ОС/оборудования. Любая переносимость другого набора OS/команд теряется и должна быть перекомпилирована для выполнения.

+0

Пожалуйста, объясните, почему «из-за естественной закрытой архитектуры Microsoft» «переносимость в настоящее время не такая чистая, как Java». Я не понимаю, почему естественная закрытая архитектура Microsoft ограничивает способность .NET быть такой же портативной, как Java. – Pacerier

+3

@pacerier Мой ответ на ваш вопрос сегодня будет отличаться от того, который я дал шесть лет назад. Шесть лет назад .NET не был открытым исходным кодом, например. Но это заявление, данное довольно недавно, изменяет все в этом отношении, не так ли? :) –

+0

Также важно отметить, что неродные не могут интегрироваться с native. Например, вы не можете создать приложение isapi с .net, потому что оно не создает оконные библиотеки Windows, или вы не можете создавать плагины для собственных приложений с использованием .net, потому что вещи .net make не являются файлами ОС. –

25

Собственный код написан на «родном» языке машины на компьютере, на котором он запущен, и выполняется непосредственно процессором.

Управляемый код написан на специальном языке, который требует выполнения другой программы (то есть ее управления). Эта другая программа часто называется интерпретатором, поскольку она интерпретирует специальный язык.

Программы на C и C++ являются родными.

Управляется Java и C# (и все языки .NET).

Managed C++ - специальная форма C++, которая работает в интерпретаторе .NET.

Смешанная программа - это программа, которая использует код, который является как родным, так и управляемым.

+3

Я просто хотел указать, что существует различие между понятием интерпретируемого языка, таким как Ruby, Python, Lisp и т. Д., И управляемым языком VM, который использует компиляцию JIT, такую ​​как Java и C#. Последнему часто не нужно использовать интерпретатор и, в конце концов, скомпилировать его до собственного машинного кода. Подробнее здесь: http://en.wikipedia.org/wiki/Interpreted_language –

+0

@dodgy_coder, вы уверены, что Java компилируется на собственный машинный код? Нет, он компилируется до байт-кода, который является ** не родным ** машинным кодом. То же самое касается языков CLR, таких как C#. – Pacerier

+0

Java и C# включают компонент времени выполнения, который JIT компилирует байт-код в собственный код. –

5

Код, который запускается под управлением среды общего языка (CLR), известен как управляемый код. Код, который не запускается в среде CLR, известен как собственный код.

Смежные вопросы