Різниця між "керованим" та "некерованим"


138

Я чую / читаю про це іноді, коли говорять про .NET, наприклад, "керований код" та "некерований код", але я поняття не маю, що вони таке і в чому їх відмінності. У чому їх відмінність за визначенням? Які наслідки використання будь-якого з них? Чи існує це відмінність лише у .NET / Windows?


Відповіді:


190

Керований код

Керований код - це те, що створюють компілятори 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 ++ може бути скомпільований як керованим, так і некерованим кодом, їх можна змішати в одній програмі. Це розмиває межу між двома і ускладнює визначення, але варто згадати лише те, що ви знаєте, що ви все ще можете мати витоки пам’яті, якщо, наприклад, ви використовуєте сторонні бібліотеки з погано написаним некерованим кодом.

Ось приклад, який я знайшов 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;
}

11
"Оскільки ви не можете створити некерований код за допомогою Visual Basic або C #, весь некерований код записується в C / C ++." Знаєте, існують інші мови, крім C, C ++, C # та VB. Я використовую Delphi для написання некерованого коду. Крім того, одна досить помітна різниця між керованим (.NET) та некерованим кодом (Win32) кодом полягає в тому, що перший може використовувати всі функції .NET, тоді як другий використовує вбудований API Windows.
Андреас Рейбранд

22
Терміни "керований" та "некерований" були винайдені для відмежування машинного коду від ІЧ. Отже, вони мають дійсне значення лише в контексті .NET . Ядро Linux також компілюється в некерований код, але це не дуже важливо для обговорення, чи не так?
куріж

6
Це стає поза темою, але моя думка полягає в тому, що ви не маєте можливості писати керований код у Delphi, тому заявляючи, що ви пишете некерований код у Delphi, дуже зайвим. У будь-якому випадку, я додав "у візуальну студію" до кривдного вироку. Крім того, дякую за голову над друком. Я якось пропустив це навіть при другому читанні.
kurige

Щоб бути педандом, можна писати некерований код на C # ( відомий як "небезпечний" код )
Basic

2
@JacksonTale Java не перебуває в контексті .NET, тому концепція керованого або некерованого управління не застосовується. Дивіться stackoverflow.com/questions/1326071/… для пояснення того, як компілюється Java.
Еван Фріш

84

Це більш загально, ніж .NET та Windows. Кероване - це середовище, де у вас є автоматичне управління пам’яттю, збирання сміття, безпека типу, ... некерованим є все інше. Так, наприклад .NET є керованим середовищем, а C / C ++ - некерований.


За цим визначенням, JavaScript також буде некерованим кодом, правильно?
Хемптон Террі

@HamptonTerry Javascript має автоматичне управління пам’яттю, збирання сміття та безпеку типу ... Так, ні. Javascript управляється.
Санкарн

13

Керований код - це диференціація, запроваджена корпорацією Майкрософт для ідентифікації програмного коду комп'ютера, який вимагає і виконуватиметься лише під "управлінням" віртуальної машини загальної мови виконання (в результаті виходить байт-код).

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, що використовують рідний API Windows (написаний будь-якою мовою, можливо, C), з іншого боку, "не керований".
Андреас Рейбранд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.