Разница между «управляемым» и «неуправляемым»

139

Я иногда слышу / читаю об этом, когда говорю о .NET, например, об «управляемом коде» и «неуправляемом коде», но я понятия не имею, что это такое и в чем их различия. В чем их отличие по определению? Каковы последствия использования любого из них? Это различие существует только в .NET / Windows?

Луи Рис
источник

Ответы:

191

Управляемый код

Управляемый код - это то, что создают компиляторы Visual Basic .NET и C #. Он работает в среде CLR (Common Language Runtime), которая, помимо прочего, предлагает такие услуги, как сборка мусора, проверка типов во время выполнения и проверка ссылок. Думайте об этом так: «Мой код управляется средой CLR».

Visual Basic и C # могут создавать только управляемый код, поэтому, если вы пишете приложение на одном из этих языков, вы пишете приложение, управляемое CLR. Если вы пишете приложение на Visual C ++ .NET, вы можете создавать управляемый код, если хотите, но это необязательно.

Неуправляемый код

Неуправляемый код компилируется прямо в машинный код. Таким образом, согласно этому определению весь код, скомпилированный традиционными компиляторами C / C ++, является «неуправляемым кодом». Кроме того, поскольку он компилируется в машинный код, а не в промежуточный язык, он не переносится.

Никакого управления свободной памятью или чего-либо еще, что предоставляет CLR.

Поскольку вы не можете создать неуправляемый код с помощью Visual Basic или C #, в Visual Studio весь неуправляемый код написан на C / C ++.

Смешивание двух

Поскольку Visual C ++ может быть скомпилирован как в управляемый, так и в неуправляемый код, их можно смешивать в одном приложении. Это стирает грань между ними и усложняет определение, но об этом стоит упомянуть, чтобы вы знали, что у вас все еще могут быть утечки памяти, если, например, вы используете стороннюю библиотеку с каким-то плохо написанным неуправляемым кодом.

Вот пример, который я нашел в Google :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}
куригэ
источник
11
«Поскольку вы не можете создать неуправляемый код с помощью Visual Basic или C #, весь неуправляемый код написан на C / C ++»? Вы знаете, есть и другие языки, кроме C, C ++, C # и VB. Я использую Delphi для написания неуправляемого кода. Кроме того, одно довольно заметное различие между управляемым (.NET) и неуправляемым (Win32) кодом заключается в том, что первый может использовать все функции .NET, тогда как второй использует собственный Windows API.
Андреас Рейбранд
22
Термины «управляемый» и «неуправляемый» были придуманы, чтобы отличать машинный код от IR. Таким образом, они действительно имеют значение только в контексте .NET . Ядро linux также компилируется в неуправляемый код, но это не совсем актуально для обсуждения, не так ли?
kurige
6
Это становится не по теме, но я хочу сказать, что у вас нет возможности писать управляемый код в Delphi, поэтому утверждение, что вы пишете неуправляемый код в Delphi, в значительной степени избыточно. Во всяком случае, к оскорбительному приговору я добавил «в визуальной студии». Также спасибо за предупреждение об опечатке. Как-то пропустил даже при повторном чтении.
kurige
Чтобы быть педандом, можно написать неуправляемый код на C # ( известный как «небезопасный» код )
Basic
2
@JacksonTale Java не находится в контексте .NET, поэтому концепция управления или неуправляемости неприменима. См. Stackoverflow.com/questions/1326071/… для объяснения того, как компилируется Java.
Эван Фриш
85

Это более общий подход, чем .NET и Windows. Управляемая - это среда, в которой есть автоматическое управление памятью, сборка мусора, безопасность типов, ... неуправляемая - это все остальное. Так, например, .NET - это управляемая среда, а C / C ++ - неуправляемая.

Дарин Димитров
источник
Согласно этому определению, JavaScript тоже будет неуправляемым кодом, верно?
Хэмптон Терри,
@HamptonTerry Javascript имеет автоматическое управление памятью, сборку мусора и безопасность типов ... Так что нет. Javascript управляется.
Sancarn
13

Управляемый код - это дифференциация, разработанная Microsoft для определения кода компьютерной программы, который требует и будет выполняться только под «управлением» виртуальной машины Common Language Runtime (что приводит к байт-коду).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm

Роберт Питт
источник
1
Да. Чтобы добавить к этому ответу, управляемый код - это код, который вы обычно пишете в .NET (например, на C #) с использованием функций .NET. С другой стороны, собственные приложения Windows, использующие собственный Windows API (написанные на любом языке, например C), являются «неуправляемыми».
Андреас Рейбранд,