Почему код не был «управлялся» с самого начала? [закрыто

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

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

Я знаю, что это все равно, что спросить: «Почему первая модель T Ford не поставлялся с подушками безопасности и ремнями сидений?». Актуальность этого вопроса все еще стоит, несмотря на это, потому что в пределах человеческой природы все вновь защищает, снова известные опасности. Например, первый T-Ford не прошел достаточно быстро, чтобы мотивировать исследование подушек безопасности. Люди не стали достаточно быстро допускать смертельные осуждающие ошибки, что это мотивирует ремень безопасности как закон и стандарт во многих странах.

В компьютерной эволюции это почти наоборот. Мы начали с Assembler, эквивалент управления T-Ford на 200 миль в час с помощью ослабления. Я имел удовольствие поговорить с несколькими старыми дальнобойщиками из этой эпохи, услышав эти истории о кодексе сборки ручной работы, отладчиках человека, гриллионе кода и т. Д. Если мы сделаем действительно неприятную ошибку в C, мы можем в конечном итоге с блюзовым экраном. Десятилетия назад вы можете получить поврежденное оборудование, и Бог знает что. Но для меня это загадка - столько десятилетий, и все, что мы делали, чтобы сделать крах менее болезненным, было блюзовым экраном (извините за использование MS в качестве архетипа для чего -либо).

Не только в человеческой природе защищать от известных опасностей, Также в природе любого программиста автоматизировать и систематизировать общие средства, как проверка ошибок, диагностика памяти, фреймворки журнала, поддержание резервного копирования и т. Д.

Почему программисты/люди не начали автоматизировать задачу обеспечения того, чтобы код, который они подают в систему, не повредит системе?. Да, конечно, производительность. Анкет Но эй, это было задолго до того, как какой -либо серьезно проникающий аппаратный стандарт. Почему материнские платы не были разработаны с помощью автобусных архитектур и дополнительных процессоров для облегчения «управляемого кода»?

Есть ли какая -то метафора, чтобы моделировать Форды, которые не достаточно быстрые, которые я пропускаю?

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

Решение

Давайте подумаем об этом с первых принципов.

Управляемая платформа обеспечивает относительно песочничную область для запуска программного кода, которая создается от языка высокого уровня до формы, более подходящей для выполнения платформы (IL Bytecodes). Есть также функции утилиты, такие как сборы мусора и загрузка модулей.

Теперь подумайте о нативном приложении - ОС предоставляет относительно песочничную область (процесс) для запуска программного кода, который создается от языка высокого уровня в форму, более подходящую для выполнения платформы (x86 Opcodes). В есть также функции утилиты, такие как управление виртуальной памятью и загрузка модулей.

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

В конечном счете, они могли бы поместить все эти управляемые функции в набор собственных DLL и отменили идею промежуточного байт -кода, JIT, компилирующего вместо этого нативного кода. «Управляемые» функции, такие как GC, легко возможны на собственных кучах - см. Пример Boehm C ++.

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

Итак, почему мы не получили управляемый код с самого начала - потому что все, что вы упоминаете как часть «управляемого» кода, являются собственным кодом. Управляемые платформы, которые у нас есть сегодня, являются просто дополнительной абстракцией поверх уже абстрактной платформы. На языках высокого уровня было добавлено больше функций, чтобы защитить вас от себя, переполнения буферов ушли в прошлое, но нет никаких причин, по которым они не могли быть реализованы в C, когда C был впервые изобретен. Просто они не были. Возможно, задним числом, похоже, что эти функции отсутствуют, но я уверен, что через 10 лет мы спросим: «Почему C# не реализовал явно полезную функцию xyz, как у нас сегодня»

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

Управляемый код, встроенный в безопасность и т. Д., существует уже давно.

На оригинальной платформе для ПК просто не было места, и это никогда не было добавлено позже.

Достопочтенный IBM мэйнфрейм обладает защищенной адресацией, неприкасаемыми библиотеками Kernal, безопасности на основе ролей и т. Д. И т. Д. С 70 -х годов. Плюс весь этот код ассемблера управлял сложной (для времени) системы управления изменениями. (Univac, Burroughs и т. Д. Были что -то подобное.)

У UNIX была встроена довольно приличная безопасность с самого начала (и он не сильно изменился за эти годы).

Так что я думаю, что это очень проблема Windows/Web Space.

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

Внутренняя система IBM Mail действительно проходила первое «троян»!

На самом деле, управляемый код существует уже очень долго. Рассмотреть возможность:

  • LISP
  • Болтовня
  • Базовый (оригинальный аромат)

Все предоставили среды, похожие на операционную систему, которые защищали использование от памяти и других проблем управления ресурсами. И все были относительными неудачами (базовые действительно добились успеха, когда были введены такие функции, как Peek & Poke, которые позволили вам связываться с базовой системой).

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

Первый компьютер, который я использовал, был Sinclair ZX Spectrum в 1982 году. Он имел меньше оперативной памяти (16 тыс.), чем размер шрифта с одним Windows. И это было относительно недавно, в домашнем компьютерном возрасте. До середины 1970-х годов идея иметь компьютер в вашем доме была немыслимой.

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

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

Итак, первые машины были в безопасности в несчастных случаях, потому что они были медленными. Первые компьютеры были в безопасности, потому что они не были сетевыми.

Теперь автомобили становятся безопаснее через ремни сиденья, подушки безопасности, пресс, антиколлиений и так далее. Компьютеры становятся безопасными с помощью дополнительных методов, хотя вы все еще не можете превзойти отключение сетевого кабеля.

Это упрощение, но я думаю, что оно становится в основе этого. Нам не понадобился этот материал тогда, потому что компьютеры не были подключены к сети.

Та же причина, по которой не было поездов 300 лет назад. Та же причина, по которой не было мобильных телефонов 30 лет назад. Та же причина, по которой у нас до сих пор нет машины телепортации.

Технология развивается со временем, это называется эволюцией.

Компьютеры тогда не были достаточно мощными. Запуск коллекционера мусора на заднем плане убьет вас.

Говоря о вашем вопросе о том, почему компьютеры не имели механизмов защиты на уровне управляемого кода, а не о том, почему виртуальные машины не могли работать на медленном оборудовании (уже объясненное в других сообщениях). Короткий ответ в том, что это было. ЦП были разработаны, чтобы сделать исключение, когда произошел плохой код, чтобы не повредить систему. Windows обрабатывает это, как известно, плохо, но есть и другие OSS. UNIX передает его в виде сигналов, чтобы программы прекращались, не сбивая систему. На самом деле, независимо от того, используете ли вы управляемый код или нет, исключение NULL POINTER приведет к тому же образом - при прекращении программы. Виртуальная память гарантирует, что программы не связываются с другим кодом, поэтому все, что они могут сделать, это повредить себе.

Что подводит меня ко второму пункту. Все это не нужно, если вы знаете, что делаете. Если я хочу сохранить свою мебель в чистоте, я просто не бросаю на нее еду. Мне не нужно покрывать свой дом пластиком, я просто должен быть осторожным. Если вы неаккуратный кодер, лучшая виртуальная машина в мире не спасет вас, это просто позволит вам запустить неаккуратный код без какого -либо шума. Кроме того, код порта прост, если вы используете правильную инкапсуляцию. Когда вы хороший кодер, управляемый код не помогает. Вот почему не все используют это. Это просто вопрос предпочтения, не лучше / хуже.

Что касается безопасности времени выполнения, то нет ничего, что компилятор P-Code не может предсказать, что машина не может, и ничто не может справиться с интерпретатором управляемого кода, что ОС уже не может (или нет). Материнские платы с дополнительными автобусами, процессорами и наборами инструкций стоят намного больше денег - это все о соотношении затрат/производительности.

В 1970 году стоимость памяти была около 1 доллара/бит (без инфляции). Вы не можете позволить себе роскошную сборку мусора с такими расходами.

Я думаю, как большинство вопросов: «Почему у нас не было X в программировании Y много лет назад». Ответ - распределение скорости/ресурсов. С ограниченными ресурсами им нужно было управлять как можно более эффективным. Тип управления общего назначения, связанный с управляемым кодом, был бы слишком потребляющим ресурсы, чтобы получить выгоду в критических приложениях того времени. Это также является частью того, почему сегодняшний критический код производительности все еще написан в C, Fortran или Assembler.

Почему мы просто построили самолеты и космические корабли одновременно, вместо того, чтобы пронзать с лошадью и ходьбой и всем этим утомительным?

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

  1. Интерпретация времени выполнения, которая будет иметь существенный штраф за производительность (широко переменная-occasyally 2x или меньше, но иногда 100x или более)
  2. Сделанный компилятор, который потребует дополнительной оперативной памяти, которая добавит задержку примерно пропорционально размеру программы, а не количество выполненных операторов

Одна вещь, которая изменилась за эти годы, это то, что многие программы запускают наиболее широко используемые части их режима гораздо больше, чем раньше. Предположим, что первый раз, когда какое -либо конкретное заявление будет выполнено, будет нести штраф в 1000 раз дольше последующих казней. Каким будет эффект этого штрафа в программе, в которой каждое утверждение будет выполнено в среднем в 100 раз? Каким будет влияние этого штрафа на программу, в которой каждое заявление будет выполнено в среднем в 1 000 000 раз?

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

Ответ становится более ясным - люди не были созданы для написания программ. Машины должны делать это и позволить нам расслабиться, играя в Pacman.

Что бы это ни стоило, я прочитал пару документов для моего класса вычислительных языков (один по автомобилю, а другой - Николасом Вирт), защищающих именно это еще в 60 -х и 70 -х годах, среди прочего.

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

Хоаре упоминает идею «Компилятора проверки». Насколько я могу судить, это, по сути, компилятор, который проводит статический анализ. Для него это была популярная техника, которая потерпела неудачу (или, по крайней мере, не решила столько проблем, сколько было предназначено для решения). Решение для него состояло в том, чтобы сделать языки программирования более безопасными, создав управляемый код (или, по крайней мере, именно так он выразил бы его в современных терминах).

Я полагаю, что однажды C (и позже C ++) завоевал популярность, идея управляемого кода была по сути мертва. Дело не в том, что C был плохим языком, просто он должен был быть языком ассамблеи, а не языком приложений.

Если у вас есть шанс, вы можете прочитать Намекает на дизайн языка программирования. Анкет Это довольно хорошее чтение, если вы заинтересованы в таких вещах.

Лучший ответ на этот вопрос: Имхо, ни у кого не было представления о управляемом коде в то время. Знание на самом деле развивается со временем. По сравнению с такими областями, как архитектура или сельское хозяйство, компьютерная наука является очень молодой областью. Таким образом, коллективные знания об этой области также молоды и со временем будут развиваться. Возможно, через несколько лет мы сталкиваемся с каким -то новым явлением, и кто -то задаст тот же вопрос: «Почему кто -то не думал о XYZ Beofore?».

Я бы сказал, что это в значительной степени было изменением сопротивления в сочетании с ложным восприятием неэффективности сбора мусора, которая задерживает принятие GC и связанные с ними методы. Конечно, сегментированная модель памяти Brain Dead на Intel 8086 не совсем помогла продвинуть управление памятью в стиле здравого средства на ПК.

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