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


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

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

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

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

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

в том же духе,

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

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

15 51

15 ответов:

при компиляции кода C# в a .exe, он компилируется в байт-код общего промежуточного языка(CIL). Всякий раз, когда вы запускаете исполняемый файл CIL, он выполняется на виртуальной машине Microsofts Common Language Runtime(CLR). Так что нет, невозможно включить виртуальную машину в свой исполняемый файл .NET. Среда выполнения .NET должна быть установлена на всех клиентских компьютерах, на которых будет работать ваша программа.

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

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

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

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

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

Я не думаю, что вы одиноки в заблуждении о том, что такое .Net. Есть уже другие ответы, которые должны были бы вас охватить, но я выброшу этот лакомый кусочек информации для других.

чтобы узнать, что такое .Net "на самом деле", просто перейдите c:\Windows\Microsoft.Net\Framework

там вы увидите папки, которые являются специфическими для версии(ов), которую вы установили. Идти в В2.0.XXXXX папка, если она установлена, например.

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

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

создание программы очень просто. Бросьте следующий код в привет.cs-файл.

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

затем в командной строке введите> КБК привет.cs

что будет генерировать вам .файл EXE. Запустите его, и он выплюнет "hello world", очевидно.

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

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

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

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

Я надеюсь, что помогает.

-Кит

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

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

неуправляемый код был бы материалом C++, к которому вы привыкли. Динамическое выделение памяти и явное освобождение памяти. Среда выполнения .NET не управляет памятью для вас, следовательно, "неуправляемая".

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

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

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

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

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

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

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

термин управлял обычно применяется только к .NET, потому что Microsoft использует этот термин. Как правило, корпорация Майкрософт не использует термин "виртуальная машина" со ссылкой на .Чистая управляемой среде выполнения.

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

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

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

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

или по-другому, что бы вы предпочли использовать:

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

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

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

в аналогичном ключе, является ли .NET языком или фреймворком, и что именно здесь означает "фреймворк"?

.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.

.NET-это фреймворк. Среда CLR выполняет код Microsoft Intermediate Language (MSIL), который создается при компиляции решения (т. е. он не компилируется в машинный код). Вы не можете содержать API в exe, и вы не хотите, так как он довольно большой. Основным преимуществом здесь является управление памятью (среди некоторых других преимуществ безопасности и, возможно, других, о которых я не знаю.)

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

.NET-это фреймворк. Его можно использовать от много языков (VB.NET, C#, IronPython, boo и т. д.)

.NET всегда выполняется как интерпретируется, и нет вы не можете включить 'VM' внутри .исполняемый. Любой пользователь, желающий запустить приложение .NET, должен иметь установленную платформу.

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

Я думаю, что это позволяет такие вещи, как сбор мусора и проверка границ массива.

лично я думаю, что слово "рамки" - это немного неправильно.

.NET-это "платформа", состоящая из среды выполнения (виртуальной машины среды CLR) и набора библиотек. Это точно аналогично Java или Perl или Python (ни один из которых никогда не упоминается как "фреймворки").

в большинстве случаев слово "фреймворк" используется для таких проектов, как Spring или Struts или QT, которые сидят поверх платформы (т. е. не обеспечивают собственной среды выполнения), например библиотека.

но в отличие от" библиотеки", фреймворк стремится переопределить основные операции базовой платформы. (Инъекция зависимостей Spring бросает вызов логике вызова конструктора обычного кода Java. Реализация сигналов и слотов QT бросает вызов обычному коду C++.)

Я знаю, что я просто педантичный ублюдок, но для меня .NET-это не фреймворк. Это платформа.

управляемого кода MSIL и ил и управляемого кода же.Когда мы строим наше приложение .dll или .exe-файлы создаются в папке Bin.Эти файлы называются управляемым кодом.Позже эти файлы передаются в CLR для генерации собственного кода, который будет понятен ОС.