Подтвердить что ты не робот

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

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

Wikipedia описывает это просто как

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

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

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

В аналогичном ключе

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

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

4b9b3361

Ответ 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 для генерации собственного кода, который будет понят ОС.