Что такое "управляемый" код?
Я пишу код на C / C++ уже почти двадцать лет, и я знаю Perl, Python, PHP и некоторые Java, а также учу себя JavaScript. Но я никогда не делал ничего .NET, VB или C#. Что именно делает управлял код означает?
Википедия описывает его просто так
код, который выполняется под управлением виртуальной машины
и в нем конкретно говорится, что Java (обычно) управляется код, так
- почему этот термин применяется только к C# / .NET?
- можно ли скомпилировать C# в a .exe, который также содержит виртуальную машину, или вам нужно упаковать ее и передать другому .exe (а-ля java)?
в том же духе,
- это .NET a язык или рамки, и что именно "каркас" означает здесь?
хорошо, так что это больше, чем один вопрос, но для кого-то, кто был в отрасли так долго, как у меня, я чувствую себя довольно N00B-ish прямо сейчас...
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-это не фреймворк. Это платформа.