В чем разница между управляемым / байт-кодом и неуправляемым / собственным кодом? - PullRequest
3 голосов
/ 31 октября 2008

Иногда трудно описать некоторые вещи, которые «американские программисты» могут считать простыми для непрограммистов и типов управления.

Итак ...

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

Ответы [ 10 ]

11 голосов
/ 31 октября 2008

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

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

3 голосов
/ 19 октября 2009

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

Виртуальные машины (VM) и сборщик мусора (GC) имеют десятилетия и две отдельные концепции . Существуют языки, скомпилированные с помощью сборщика мусора, даже эти десятилетия (канонический пример: ANSI Common Lisp ; ну, по крайней мере, время компиляции сборщик мусора декларативный язык, Меркурий - но, очевидно, массы кричат ​​на прологоподобные языки).

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

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

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

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

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

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

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

...

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

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

3 голосов
/ 31 октября 2008

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

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

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

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

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

2 голосов
/ 31 октября 2008

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

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

1 голос
/ 31 октября 2008

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

1 голос
/ 31 октября 2008

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

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

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

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

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

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

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

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

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

Короче

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

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

0 голосов
/ 31 октября 2008

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

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

0 голосов
/ 31 октября 2008

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

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

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

0 голосов
/ 31 октября 2008

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

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

В блоге Брэда Абрамса " Что такое управляемый код " есть определение, в котором говорится что-то вроде ".NET Framework Common Language Runtime".

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

...