Что такое "управляемый" код?
Я пишу код на C / C++ почти двадцать лет, и я знаю Perl, Python, PHP, а также некоторые Java, и я учу себя JavaScript. Но я никогда не делал ничего .NET, VB или C#. Что именно делает управлял код означает?
Википедия описывает его просто так
код, который выполняется под управлением виртуальной машины
и он конкретно говорит, что Java (обычно) управляется код, так
- почему этот термин применяется только к C# / .NET?
- можете ли вы скомпилировать C# в a .exe, который также содержит виртуальную машину, или вам нужно упаковать ее и передать другому .exe-файла (а-ля Ява)?
в том же духе,
- является .NET a язык или рамки, и что именно "каркас" означает здесь?
хорошо, это больше, чем один вопрос, но для того, кто был в отрасли так долго, как я, я чувствую себя довольно N00B-ish прямо сейчас...
15 ответов
при компиляции кода C# в a .exe, он компилируется в общий байт-код промежуточного языка(CIL). Всякий раз, когда вы запускаете исполняемый файл CIL, он выполняется на виртуальной машине Microsofts Common Language Runtime(CLR). Поэтому нет, невозможно включить виртуальную машину в исполняемый файл .NET. Среда выполнения .NET должна быть установлена на всех клиентских компьютерах, на которых будет запущена программа.
чтобы ответить на ваш второй вопрос, .NET-это фреймворк, в котором он представляет собой набор библиотеки, компиляторы и VM, которые не являются языковыми. Таким образом, вы можете кодировать .NET framework на C#, VB, C++ и любых других языках, имеющих компилятор .NET.
https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages
на приведенной выше странице есть список языков, которые имеют версии .NET, а также ссылки на их страницы.
в основном это относится к тому, что все ваши выделения памяти "управляются" для вас. Если вы используете управляемый код, вам не нужно беспокоиться об освобождении объектов, когда вы закончите с ними. Простое разрешение им выйти из области действия будет означать, что виртуальная машина в конечном итоге признает, что на них больше нет ссылок, и будет собирать мусор, возвращая память в систему.
неуправляемый код с другой стороны просто "утечка", если вы явно освободите указатели, прежде чем отбрасывать ссылки.
Я не думаю, что вы одиноки в путанице о том, что такое .Net. Есть уже другие ответы, которые должны вас охватить, но я выброшу этот лакомый кусочек информации для других.
чтобы увидеть, что .Net "действительно", просто перейдите к c:\Windows\Microsoft.Net\Framework
там вы увидите папки, которые являются specfic для версии(ов), которые вы установили. Идите в v2.0.папка xxxxx, если она установлена, например.
в этой папке есть рамки. Вы в основном увидите кучу .EXE файлы и .DLL-файл. Все DLL файлы, которые начинаются с System.*.dll по существу является .NET framework.
The .exe-файлы, которые вы увидите в этой папке, являются утилитами для разработчиков, а также компиляторов. Вы упомянули в C#. Найдите csc.файл EXE. Это ваш компилятор C#.
создание программы очень просто. Бросьте следующий код в hello.cs файл.
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello world");
}
}
затем в командной строке введите> csc Здравствуйте.cs
это будет генерировать вас .файл EXE. Запустите его, и он выплюнет "hello world", очевидно.
в строку консоли.WriteLine () вызывает фреймворк. Консоль-это объект, который живет в пространстве имен 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 не управляет памятью для вас, следовательно, "неуправляемая".
управляемый код, с другой стороны, управляется временем выполнения. Вы выделяете память, где это необходимо (by объявление переменных, а не пространства памяти), и сборщик мусора во время выполнения определяет, когда он больше не нужен, и очищает его. Сборщик мусора также будет перемещать память, чтобы повысить эффективность. Время выполнения "управляет" всем этим для вас.
Как я уже упоминал выше, можно написать код, который управляется и неуправляемый.
неуправляемый:
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++, я надеюсь, что это будет немного более актуально для вас.
Managed означает, что код не компилируется в собственный код и, таким образом, выполняется под эгидой виртуальной машины. Java компилируется в промежуточный формат, называемый байт-кодом, который Java VM знает, как интерпретировать и выполнять. Все языки .NET делают аналогичную вещь, компилируя в IL (промежуточный язык), который интерпретирует среда выполнения .NET. Это немного запутанно, потому что .NET IL есть .dll и .exe окончания файлов.
термин управлял обычно применяется только к .NET, потому что Microsoft использует этот термин. Microsoft обычно не использует термин "виртуальная машина" в отношении среды управляемого выполнения .NET.
"байт-код" .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, более известный как Just IL), который затем может быть запущен на любом ПК с установленной .NET framework.
.NET-это фреймворк. Его можно использовать из многих языков (VB.NET, C#, IronPython, boo и т. д.)
.NET всегда выполняется как интерпретируется, и нет, вы не можете включить " VM " внутри .исполняемый. Любой пользователь, желающий запустить приложение .NET, должен иметь установленную платформу.
Он может ссылаться на любой код, выполняемый виртуальной машиной, а не непосредственно процессором.
Я думаю, что это позволяет такие вещи, как сбор мусора и проверка границ массива.
лично я думаю, что слово "рамки" немного неправильно.
.NET-это "платформа", состоящая из среды выполнения (виртуальной машины CLR) и набора библиотек. Это точно аналогично Java или Perl или Python (ни один из которых никогда не упоминается как "фреймворки").
в большинстве случаев слово "framework" используется для таких проектов, как Spring или Struts или QT, которые сидят поверх платформы (т. е. не предоставляют собственной среды выполнения), как библиотека.
но в отличие от" библиотеки", фреймворк стремится переопределить основные операции базовой платформы. (Инъекция зависимостей Spring бросает вызов логике вызова конструктора обычного кода Java. Реализация сигналов и слотов QT бросает вызов обычному коду c++.)
Я знаю, что я просто педантичный ублюдок, но для меня .NET не является фреймворком. Это платформа.
управляемый код--MSIL и IL и управляемый код одинаковы.Когда мы строим наше приложение .dll или .exe файлы создаются в папке Bin.Эти файлы называются управляемым кодом.Позже эти файлы передаются CLR для генерации собственного кода, который будет понят ОС.