Что такое "управляемый" код?
Я пишу код C/С++ почти двадцать лет, и я знаю Perl, Python, PHP и некоторую Java, а также я учу себя JavaScript. Но я никогда не делал никаких .NET, VB или С#. Что означает управляемый код?
Wikipedia описывает это просто как
Код, который выполняется под управлением виртуальной машины
и в нем говорится, что Java (обычно) управляемый код, поэтому
- почему этот термин, похоже, применим только к С#/.NET?
- Можете ли вы скомпилировать С# в .exe, который также содержит виртуальную машину, или вам нужно ее упаковать и передать ее другому .exe(a la java)?
В аналогичном ключе
- - это .NET язык или фреймворк, и что именно здесь означает "фреймворк"?
ОК, так что более одного вопроса, но для тех, кто был в отрасли до тех пор, пока у меня есть, я чувствую себя скорее N00B-ish прямо сейчас...
Ответы
Ответ 1
Когда вы скомпилируете код С# в .exe, он скомпилирован байт-кодом Common Intermediate Language (CIL). Всякий раз, когда вы запускаете исполняемый файл CIL, он выполняется на виртуальной машине Common Language Runtime (CLR) Microsoft. Таким образом, нет возможности включить виртуальную машину в исполняемый файл .NET. У вас должна быть установлена среда выполнения .NET на любых клиентских компьютерах, на которых будет работать ваша программа.
Чтобы ответить на ваш второй вопрос,.NET является основой, поскольку он представляет собой набор библиотек, компиляторов и виртуальных машин, которые не являются языковыми. Таким образом, вы можете кодировать .NET Framework в С#, VB, С++ и любых других языках, на которых есть компилятор .NET.
https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages
На приведенной выше странице есть список языков, на которых есть версии .NET, а также ссылки на их страницы.
Ответ 2
Я не думаю, что вы одиноки в том, что меня путают. Уже есть другие ответы, которые вы должны были охватить, но я выкину эту информацию для других.
Чтобы узнать, что .Net "действительно", просто перейдите к c:\Windows\Microsoft.Net\Framework
Там вы увидите папки, которые соответствуют установленной вами версиям (-ам). Перейдите в папку v2.0.xxxxx, если вы его установили, например.
В этой папке находится фреймворк. В основном вы увидите кучу файлов .exe и DLL файлов. Все DLL файлы, которые начинаются с System. *. Dll, по сути являются .Net framework.
Файлы .exe, которые вы увидите в этой папке, являются утилитами для разработчиков, а также для компиляторов. Вы упомянули С#. Найдите файл csc.exe. Это ваш компилятор С#.
Построение программы очень просто. Добавьте следующий код в файл 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. С# - это язык, и это лишь один из многих языков, которые можно использовать для написания кода поверх платформы .Net. Тот же метод Console.WriteLine() может быть вызван из С#, VB.Net, Pascal, С++, Ruby, Python, F # и любого другого языка, который был создан для работы поверх платформы .NET.
Я надеюсь, что это поможет.
-Keith
Ответ 3
В основном он используется для описания .NET, потому что термин Microsoft решил дифференцировать .NET с C/С++ и других более старых языков. Microsoft выбрала это, потому что это не был термин, который обычно ассоциировался с Java, потому что они не хотели подчеркивать сходства между С#/.NET и Java (в отличие от вызова его как "кода виртуальной машины", звук гораздо больше похож на Java). В принципе, использование "управляемого кода" управляется маркетингом, а не с технической точки зрения, терминологией.
Ответ 4
В основном это относится к тому, что все ваши распределения памяти "управляются" для вас. Если вы используете управляемый код, вам не нужно беспокоиться о том, чтобы освободить ваши объекты, когда вы закончите с ними. Просто позволить им выйти из области видимости будет означать, что виртуальная машина в конечном итоге признает, что больше нет ссылок на них, и будет ли мусор собирать их, возвращая память в систему.
Неуправляемый код, с другой стороны, просто "просачивается", если вы явно не освободите свои указатели, прежде чем отказаться от ссылок.
Ответ 5
В .NET и Visual С++ вы можете иметь как неуправляемый, так и управляемый код. Термины относятся к тому, как распределяется память и "управляется".
Неуправляемый код будет материалом С++, к которому вы привыкли. Динамическое распределение памяти и явное освобождение памяти. Среда выполнения .NET не управляет памятью для вас, поэтому "неуправляемая".
Управляемый код, с другой стороны, управляется IS во время выполнения. Вы выделяете память там, где это необходимо (путем объявления переменных, а не пространства памяти), и сборщик мусора времени выполнения определяет, когда он больше не нужен и очищает все. Сборщик мусора также будет перемещать память для повышения эффективности. Время выполнения "управляет" всем для вас.
Как я уже упоминал выше, можно написать код, который управляется и неуправляем.
неуправляемых:
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 в неуправляемом классе. Поскольку сборщик мусора может перемещать память вокруг, в следующий раз, когда вы попытаетесь разыменовать окно изображения, его не найти. Время выполнения не сообщает вашему неуправляемому коде об изменениях памяти.
Поэтому вам нужно привязать управляемый объект в памяти, чтобы ваш неуправляемый код отслеживал его. Тогда есть unboxing и всевозможные другие причуды, которые позволяют вам смешивать два. Сложность кода огромна!
Официально управляемый/неуправляемый может сводиться к тому, как код выполняется в стеке .NET. Однако, если вы исходите из С++-фона, я надеюсь, что это будет немного более актуальным для вас.
Ответ 6
Термин управляемый обычно применяется только к .NET, потому что Microsoft использует этот термин. Microsoft обычно не использует термин "виртуальная машина" в отношении среды выполнения, управляемой .NET.
.NET "bytecode" (IL) несколько отличается от байт-кода Java тем, что он был явно сконструирован для компиляции в собственный код до выполнения в управляемой среде, тогда как Java был предназначен для интерпретации, но концепция платформы -независимый код схож.
".NET Framework" - это в основном огромный набор библиотек, предоставляемых Microsoft, содержащий тысячи классов, которые могут быть использованы для разработки приложений.
Скомпилированный С#.exe содержит независимый от платформы код, который может быть запущен в любой среде, совместимой с .NET, включая Mono. Однако среда выполнения обычно распределяется отдельно от приложений, которые ее используют.
Ответ 7
Управляемый означает, что код не скомпилирован в собственный код и, таким образом, выполняется под эгидой виртуальной машины. Java компилируется в промежуточный формат, называемый bytecode, который Java VM знает, как интерпретировать и выполнять. Все языки .NET выполняют аналогичную задачу, компилируя IL (промежуточный язык), который интерпретирует среда выполнения .NET. Это немного сбивает с толку, потому что у .NET IL есть окончания .dll и .exe.
Ответ 8
С риском оскорбления некоторых, я подозреваю, что используемое слово было использовано, чтобы они могли использовать слово неуправляемое, а не скомпилированное. В то время как управление может означать больше, реальность заключается в том, что она используется для различения в основном между тем, что в значительной степени выполняется во время компиляции (в качестве замены того, что было однажды интерпретировано или pcode), и собственного скомпилированного кода.
Или введите другой способ, который вы предпочитаете использовать:
a) Неуправляемый код, который может делать неконтролируемые вещи в системе.
b) Собственный скомпилированный код, который является быстрым, надежным и близок к ОС.
Конечно, они на самом деле одно и то же.
Ответ 9
В том же ключе,.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.
Ответ 10
.NET - это основа. Common Language Runtime (CLR) выполняет код промежуточного языка Microsoft (MSIL), который генерируется при компиляции решения (т.е. Он не компилируется для машинного кода). Вы не можете содержать API в exe и не хотите, так как он довольно большой. Основное преимущество здесь - управление памятью (среди некоторых других преимуществ безопасности и, возможно, других, о которых я не знаю).
Ответ 11
Я могу ответить на вопрос о структуре..NET - это среда, С#, VB.NET и т.д. - это языки. В основном .NET предоставляет общую платформу библиотек для вызова (All the System.... dll), которую может вызывать любой язык с использованием .NET. Все языки .NET скомпилированы в MSIL (Microsoft Intermediate Language, более известный как IL), который затем может быть запущен на любом ПК с установленной платформой .NET.
Ответ 12
.NET - это основа.
Он может использоваться на многих языках (VB.NET, С#, IronPython, boo и т.д.)
.NET всегда выполняется как интерпретируемый, и вы не можете включить "VM" внутри .exe. Любой пользователь, желающий запустить ваше приложение .NET, должен иметь установленную инфраструктуру.
Ответ 13
Он может ссылаться на любой код, выполняемый виртуальной машиной, а не непосредственно на CPU.
Я думаю, что это позволяет такие вещи, как сбор мусора и проверка границ массива.
Ответ 14
Лично я считаю, что слово "каркас" является немного неправильным.
.NET - это "платформа", состоящая из среды выполнения (виртуальная машина CLR) и набора библиотек. Это точно аналогично Java или Perl или Python (ни один из которых никогда не упоминается как "рамки" ).
В большинстве случаев слово "каркас" используется для таких проектов, как Spring или Struts или QT, которые расположены поверх платформы (т.е. не создают среду исполнения), как библиотека.
Но в отличие от "библиотеки", структура стремится переопределить основные операции базовой платформы. (Spring инъекция зависимостей игнорирует конструктор-логическую схему обычного Java-кода. Реализация QT-сигналов и слотов бросает вызов обычному С++-коду.)
Я знаю, что я просто педантичный ублюдок, но для меня .NET не является основой. Это платформа.
Ответ 15
Управляемый код - MSIL и IL и управляемый код такие же. Когда мы создаем наше приложение, файлы .dll или .exe создаются в папке Bin. Эти файлы вызывается как управляемый код. Заполните эти файлы для CLR для генерации собственного кода, который будет понят ОС.