В чем разница между Управляемым / Байтовым кодом и неуправляемым / машинным кодом?

StackOverflow https://stackoverflow.com/questions/252014

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Итак...

Как бы вы описали разницу между управляемым кодом (или байтовым кодом Java) и неуправляемым / машинным кодом для непрограммиста?

Это было полезно?

Решение

Управляемый код == «Особняк со всем персоналом или дворецкими, горничными, поварами и садовниками, чтобы поддерживать порядок в этом месте»

Неуправляемый код == «Где я жил в университете»

Другие советы

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

Это пространство эквивалентно ресурсам компьютера, таким как ОЗУ, жесткий диск и т. д.

Управляемый код позволяет системе автоматически выбирать, когда и что очищать.Неуправляемый код делает процесс «ручным» — программисту необходимо сообщить системе, когда и что очищать.

Я поражен тем, что вытекает из этой дискуссии (ну, не совсем, а риторически).Позвольте мне кое-что добавить, даже если я опоздаю.

Виртуальные машины (VMS) и сборка мусора (GC) им несколько десятилетий и две отдельные концепции.Скомпилированные языки с нативным кодом, собирающим мусор, существуют, даже если они существуют десятилетиями (канонический пример: Общий Язык ANSI Lisp;что ж, есть, по крайней мере, время компиляции собранный мусор декларативный язык, Mercury - но, очевидно, массы кричат на языках, похожих на Prolog).

Внезапно виртуальные машины, основанные на GCed байт-коде, стали панацеей от всех ИТ-болезней. "Песочница" существующих двоичных файлов (другие примеры здесь, здесь и здесь)? Принцип наименьшего авторитета (POLA)/безопасность, основанная на возможностях? Тонкие двоичные файлы (или его современный вариант Безопасность)? Вывод о регионе?Нет, сэр:Microsoft & Sun не уполномочивает нас даже только думать о таких извращениях.Нет, лучше перепишите весь наш программный стек для этого замечательного (???) нового (???) языка §/API.Как говорит один из наших ведущих, это Огонь и Движение все сначала.

§ Не говори глупостей.:Я знаю, что C # - не единственный язык, предназначенный для .Net / Mono, это гипербола.

Редактировать: особенно поучительно взглянуть на комментарии к этому ответу автор С.Лотт в свете альтернативных методов управления памятью / безопасностью / мобильностью кода, на которые я указал.

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

С другой стороны, если маркетинг Microsoft / Sun произвел на них впечатление, необходимо объяснить им, что их обманывают - виртуальные машины на основе GCed с байтовым кодом не являются такой новинкой, как они утверждают, они не решают волшебным образом каждую ИТ-проблему, и существуют альтернативы этим методам внедрения (некоторые из них лучше).

Правка 2: Сборка мусора - это метод управления памятью, и, как и любой метод реализации, его необходимо понимать, чтобы правильно использовать.Посмотрите, как это делается, в ITA Software, они обходят GC для получения хорошей производительности:

4 - Поскольку у нас есть около 2 гигабайт статических данных, к которым нам нужен быстрый доступ, мы используем код на C ++ для сопоставления огромных объемов памяти файлы, содержащие бессмысленный Структуры C (рейсов, тарифов и т.д.), А затем получить к ним доступ из Common Lisp, используя доступ к внешним данным.Поле структуры access компилируется в две или три инструкции, так что на самом деле нет никакой производительности.штраф за доступ к объектам C, а не Lisp.Делая это, мы не позволяем сборщику мусора Lisp просматривать данные (для Lisp каждый указатель на объект C является просто фиксированным числом, хотя мы часто временно оборачиваем эти указатели в Объекты Lisp для улучшения возможности отладки).Наши образы на Лиспе следовательно, имеют размер всего около 250 мегабайт "рабочих" структур данных и кода.

...

9 - Мы можем выполнить 10 секунд вычислений на лиспе на блоке с частотой 800 МГц и минусами объем данных составляет менее 5 КБ.Это происходит потому, что мы предварительно выделяем все структуры данных, которые нам нужны, и умираем при запросах, которые превышают их.Это может заставить многих программистов Lisp съежиться, но с объемом изображения 250 мегабайт и ограничениями в реальном времени, мы не можем позволить себе генерировать мусор.Для Например, вместо использования cons мы используем "cons!", который извлекает ячейки из предварительно выделенного нами массива из 10 000 000 ячеек и который сбрасывается при каждом запросе.

Правка 3: (чтобы избежать недоразумений) лучше ли GC, чем возиться непосредственно с указателями?В большинстве случаев, конечно, но есть альтернативы и то , и другое.Есть ли необходимость беспокоиться Пользователи с такими подробностями?Я не вижу никаких доказательств того, что это так, за исключением развеивания некоторой маркетинговой шумихи, когда это необходимо.

Я почти уверен, что основная интерпретация такова:

  • Удалось = очистка ресурса, управляемая средой выполнения (т. е.Вывоз мусора)
  • Неуправляемый = убирать за собой (т.е. malloc & free)

Возможно, сравните это с инвестированием в фондовый рынок.

Вы можете покупать и продавать акции самостоятельно, пытаясь стать экспертом в том, что дает наилучший риск/награду, или вы можете инвестировать в фонд, которым управляет «эксперт», который сделает это за вас – за ваш счет. потеря некоторого контроля и, возможно, некоторой комиссии.(Признаюсь, я больше поклонник трекер-фондов, а «эксперты» фондового рынка в последнее время не очень-то добились блестящих результатов, но…)

Вот мой ответ:

Управляемый (.NET) или байт-код (Java) сэкономит вам время и деньги.

Теперь давайте сравним эти две вещи:

Неуправляемый или собственный код

Вам необходимо выполнить собственное распределение и очистку ресурсов (ОЗУ/памяти).Если вы что-то забудете, произойдет так называемая «утечка памяти», которая может привести к сбою компьютера.Утечка памяти — это термин, обозначающий ситуацию, когда приложение начинает использовать (съедать) оперативную память/память, но не отпускает ее, чтобы компьютер мог использовать ее для других приложений;в конечном итоге это приводит к сбою компьютера.

Чтобы запустить приложение в разных операционных системах (Mac OSX, Windows и т. д.), вам необходимо скомпилировать код специально для каждой операционной системы и, возможно, изменить множество кода, специфичного для конкретной операционной системы, чтобы он работал в каждой операционной системе.

Управляемый код .NET или байт-код Java

Все распределение и очистка ресурсов (ОЗУ/памяти) выполняются за вас, а риск создания «утечек памяти» сводится к минимуму.Это дает больше времени на кодирование функций вместо того, чтобы тратить его на управление ресурсами.

Чтобы запустить приложение в разных операционных системах (Mac OSX, Windows и т. д.), вы просто компилируете его один раз, и оно будет работать в каждой из них, если они поддерживают данную платформу, поверх которой вы запускаете приложение (.NET Framework). / Мононуклеоз или Ява).

Суммируя

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

Кроме того, прежде чем кто-либо укажет, что .NET Framework не поддерживает несколько операционных систем, я должен отметить, что технически Windows 98, 32-разрядная версия WinXP, 64-разрядная версия WinXP, 32-разрядная версия WinVista, 64-разрядная версия WinVista и Windows На всех серверах используются разные операционные системы, но на каждой из них будет работать одно и то же приложение .NET.И еще есть Монопроект это переносит .NET в Linux и Mac OSX.

Неуправляемый код — это список инструкций, которым должен следовать компьютер.Управляемый код — это список задач для компьютера, которые компьютер может самостоятельно интерпретировать, как их выполнить.

Большая разница заключается в управлении памятью.При использовании машинного кода вам придется управлять памятью самостоятельно.Это может быть сложно и является причиной множества ошибок и большого количества времени, потраченного на их отслеживание.С управляемым кодом проблемы по-прежнему возникают, но их гораздо меньше, и их легче отследить.Обычно это означает меньшее количество ошибок в программном обеспечении и меньшее время разработки.

Есть и другие различия, но управление памятью, вероятно, самое большое.

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

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

Или используйте футбол со стенками вместо боковых и лицевых линий, или бейсбол без упора, или хоккей без сетки за воротами, или NASCAR без барьеров, или футбол без шлемов...)

«Конкретный термин «управляемый код» особенно распространен в мире Microsoft».

Поскольку я работаю в мире MacOS и Linux, я не использую этот термин и не сталкиваюсь с ним.

Брэд Абрамс»Что такое управляемый кодВ сообщении блога есть определение, в котором говорится что-то вроде «Среда общеязыкового выполнения .NET Framework».

Моя точка зрения такова:возможно, вообще нецелесообразно объяснять эти термины.Если это ошибка, взлом или обходной путь, это не очень важно.Конечно, это не настолько важно, чтобы составить сложное описание для непрофессионалов.Он может исчезнуть со следующим выпуском какой-либо партии продуктов MS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top