Что такое «управляемый» код? - PullRequest
52 голосов
/ 12 сентября 2008

Я пишу код на C / C ++ почти двадцать лет, и я знаю Perl, Python, PHP и немного Java, и я учу себя JavaScript. Но я никогда не делал ничего .NET, VB или C #. Что именно означает управляемый код?

Википедия описывает это просто как

Код, который выполняется под управлением виртуальной машины

и в нем конкретно говорится, что Java - это (обычно) управляемый код, поэтому

  • почему этот термин относится только к C # / .NET?
  • Можете ли вы скомпилировать C # в .exe-файл, который также содержит виртуальную машину, или вам нужно упаковать его и передать другому .exe-файлу (по-Java)?

В том же духе,

  • является .NET языком или framework , и что именно здесь означает "framework"?

Хорошо, так что это больше, чем один вопрос, но для тех, кто работает в отрасли так долго, как я, я сейчас чувствую скорее N00B-иш ...

Ответы [ 15 ]

35 голосов
/ 12 сентября 2008

Когда вы компилируете код C # в .exe, он компилируется в байт-код Common Intermediate Language (CIL). Всякий раз, когда вы запускаете исполняемый файл CIL, он запускается на виртуальной машине Microsoft CLR. Поэтому нет, невозможно включить виртуальную машину в ваш исполняемый файл .NET. На всех клиентских компьютерах, где будет работать ваша программа, должна быть установлена ​​среда выполнения .NET.

Чтобы ответить на ваш второй вопрос, .NET - это фреймворк, поскольку он представляет собой набор библиотек, компиляторов и виртуальных машин, которые не зависят от языка. Таким образом, вы можете кодировать на .NET Framework на C #, VB, C ++ и любых других языках, имеющих компилятор .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

На этой странице представлен список языков с версиями .NET, а также ссылки на их страницы.

10 голосов
/ 20 сентября 2008

Не думаю, что вы одиноки в том, что запутались в том, что такое .Net Уже есть другие ответы, о которых вы должны рассказать, но я выложу эту информацию для других.

Чтобы увидеть, что «на самом деле» .Net просто перейдите по адресу c: \ Windows \ Microsoft.Net \ Framework

Там вы увидите папки, которые соответствуют версиям, которые вы установили. Перейдите в папку v2.0.xxxxx, если она установлена, например.

В этой папке есть рамки. Вы в основном увидите кучу файлов .exe и .dll. Все DLL-файлы, которые начинаются с System. *. Dll, по сути являются платформой .Net.

.exe-файлы, которые вы увидите в этой папке, являются утилитами как для разработчиков, так и для компиляторов. Вы упомянули C #. Найдите файл csc.exe. Это твой компилятор C #.

Создать программу действительно просто. Добавьте следующий код в файл hello.cs.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

Затем введите в командной строке> csc hello.cs

Это сгенерирует вам файл .exe. Запустите его, и он, очевидно, выплюнет «Привет, мир».

Строка с сообщением Console.WriteLine () вызывает в Framework. Консоль - это объект, который находится в пространстве имен System, а WriteLine () - статический метод.

Это дизассемблированный код для этого метода Console.WriteLine ():

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

Когда люди говорят что-то вроде: «Должен ли я использовать PHP или .Net?» Или «Должен ли я использовать Python или .Net», вы начинаете понимать, как это неправильно обсуждать. Они явно сравнивают язык с Framework. C # - это язык, и это всего лишь один из многих языков, которые можно использовать для написания кода поверх платформы .Net. Тот же метод Console.WriteLine () может быть вызван из C #, VB.Net, Pascal, C ++, Ruby, Python, F # и любого другого языка, который был создан для работы поверх платформы .Net.

Надеюсь, это поможет.

-Keith

10 голосов
/ 12 сентября 2008

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

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

9 голосов
/ 12 сентября 2008

Он в основном используется для описания .NET, потому что именно этот термин Microsoft выбрал для дифференциации .NET от C / C ++ и других более старых языков. Microsoft выбрала его, потому что это не был термин, который обычно ассоциировался с Java, потому что они не хотели подчеркивать сходство между C # /. NET и Java (вместо того, чтобы называть его чем-то вроде «кода виртуальной машины», что сделало бы его звучит намного больше как Java) По сути, использование «управляемого кода» основано на маркетинге, а не на технической терминологии.

6 голосов
/ 20 сентября 2008

В частности, в .NET и Visual C ++ вы можете иметь как неуправляемый, так и управляемый код. Термины относятся к способу, которым память распределяется и «управляется».

Неуправляемый код - это то, к чему вы привыкли. Динамическое выделение памяти и явное освобождение памяти. .NET Runtime не управляет памятью для вас, поэтому «неуправляемый».

С другой стороны, управляемый код управляется средой выполнения. Вы выделяете память там, где это необходимо (путем объявления переменных, а не пространства памяти), и сборщик мусора во время выполнения определяет, когда он больше не нужен, и очищает все это. Сборщик мусора также перемещает память для повышения эффективности. Во время выполнения вам все это «удается».

Как я упоминал выше, можно написать код, который является как управляемым, так и неуправляемым.

неуправляемый:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

Управляется:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

Заметили ссылку? Это в значительной степени обозначает управляемый класс. Однако, когда вы смешиваете два вида кода, это очень запутанно. Например, вы хотите сохранить указатель ссылки (^) управляемого эквивалента указателя в элемент управления Picture Box в вашем неуправляемом классе. Поскольку сборщик мусора может перемещать память, в следующий раз, когда вы попытаетесь разыменовать графический блок, он не будет найден. Во время выполнения ваш неуправляемый код не сообщает об изменениях памяти.

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

Официально управляемый / неуправляемый может сводиться к тому, как код выполняется в стеке .NET. Тем не менее, если вы работаете с c ++, я надеюсь, что это будет для вас более актуально.

3 голосов
/ 12 сентября 2008

Управляемый означает, что код не скомпилирован в собственный код и, следовательно, выполняется под эгидой виртуальной машины. Java компилируется в промежуточный формат, называемый байт-кодом, который Java VM знает, как интерпретировать и выполнять. Все языки .NET делают схожую вещь, компилируя в IL (промежуточный язык), который интерпретирует среда выполнения .NET. Это немного сбивает с толку, потому что .NET IL имеет окончания файлов .dll и .exe.

3 голосов
/ 12 сентября 2008

Термин управляемый обычно применяется только к .NET, потому что Microsoft использует этот термин. Обычно Microsoft не использует термин «виртуальная машина» в отношении среды управляемого исполнения .NET.

.NET «байт-код» (IL) несколько отличается от байт-кода Java тем, что он был явно разработан для компиляции в нативный код перед выполнением в управляемой среде, тогда как Java была разработана для интерпретации, но концепция платформы -независимый код похож.

.NET Framework - это в основном огромный набор библиотек, предоставляемых Microsoft, содержащий тысячи классов, которые можно использовать для разработки приложений.

Скомпилированный C # .exe содержит независимый от платформы код, который можно запустить в любой .NET-совместимой среде, включая Mono. Однако среда выполнения обычно распространяется отдельно от приложений, которые ее используют.

2 голосов
/ 20 сентября 2008

Аналогичным образом .NET - это язык или фреймворк, и что именно здесь означает "фреймворк"? << </p>

.NET - это текущая корпоративная программная платформа Microsoft. Он состоит из:

• Единый универсальный интерфейс для доступа к функциональности Windows:

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

• Единый универсальный язык и среда выполнения для выполнения приложений .NET:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

• Выбор нескольких языков для разработки приложений .NET:

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.
2 голосов
/ 12 сентября 2008

Риск оскорбить некоторых, я подозреваю, что использовалось слово управляемый, чтобы они могли использовать слово неуправляемый вместо скомпилированного. В то время как управляемый может означать больше, реальность такова, что, по-видимому, он используется для того, чтобы различать в основном то, что в значительной степени просто во время компиляции (в качестве замены того, что было когда-то интерпретировано или pcode), и нативный скомпилированный код.

Или укажите другой способ, который вы бы предпочли использовать:

a) Неуправляемый код, который может выполнять неуправляемые действия в системе.

b) Собственный скомпилированный код, быстрый, надежный и близкий к ОС.

Конечно, на самом деле это одно и то же.

1 голос
/ 12 сентября 2008

Я могу ответить на базовый вопрос. .NET - это фреймворк, C #, VB.NET и т. Д. - языки. По сути .NET предоставляет общую платформу библиотек для вызова (Вся система .... DLL), которую может вызывать любой язык с использованием .NET. Все языки .NET скомпилированы в MSIL (Microsoft Intermediate Language, более известный как просто IL), который затем можно запустить на любом ПК с установленной соответствующей платформой .NET.

...