Разница между "управляемыми" и "неуправляемыми" - программирование

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

#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;
}

Ответ 2

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

Ответ 3

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

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

Ответ 4

Управляемый код - это код, который записывается для таргетинга сервисов среды выполнения управляемой среды выполнения, такой как время выполнения Common Language Runtime в .Net Technology.

Управляемый код, работающий под управлением Common Language Runtime, не может быть доступен за пределами среды выполнения, а также не может вызывать непосредственно извне среды выполнения. Это относится к договору о сотрудничестве между исполняемым кодом и временем выполнения. Он предлагает такие услуги, как сбор мусора, проверка типа времени выполнения, проверка ссылок и т.д. Используя управляемый код, вы можете избежать многих типичных ошибок программирования, которые приводят к нарушениям безопасности и нестабильным приложениям, также автоматически заботятся многие непроизводительные задачи программирования, такие как проверка безопасности типов, управление памятью, уничтожение неиспользуемых объектов и т.д.

Что такое неуправляемый код?

Неуправляемый код компилируется прямо в машинный код и непосредственно выполняется операционной системой. Сгенерированный код выполняется изначально на главном процессоре, и процессор непосредственно выполняет код, сгенерированный компилятором. Он всегда скомпилирован для ориентации на определенную архитектуру и будет работать только на предполагаемой платформе. Итак, если вы хотите запустить тот же код в другой архитектуре, вам придется перекомпилировать код с использованием этой конкретной архитектуры.

Неуправляемые исполняемые файлы в основном представляют собой двоичное изображение, x86-код, непосредственно загружаемый в память. Такой подход обычно приводит к быстрому выполнению кода, но диагностика и восстановление от ошибок могут быть сложными и трудоемкими в большинстве случаев. Программисту необходимо позаботиться о распределении памяти, типе безопасности, безопасности и т.д., И это приведет к неуправляемому коду, подверженному утечкам памяти, таким как переполнение буфера, переопределение указателей и т.д.

Весь код, составленный традиционными компиляторами C/С++, является неуправляемым кодом. Компоненты COM, интерфейсы ActiveX и функции API Win32 являются примерами неуправляемого кода. Управляемый код - это код, написанный на многих языках программирования высокого уровня, которые доступны для использования с Microsoft.NET Framework, включая VB.NET, С#, J #, JScript.NET и т.д. Так как Visual С++ может быть скомпилирован как с управляемым, так и с неуправляемым кодом можно смешать два в одном приложении.