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

Почему разработчики Microsoft решили сделать платформу .NET на основе стека?

Сегодня я нашел Disassembler IL между инструментами, предоставляемыми VS2008. Я попытался разобрать программу и посмотреть на результат. Коды не были так трудно понять, но меня удивило одно:.NET на основе стека?! Чтение "Напишите отличный код, том II". У меня не было хорошей картины стековых машин, потому что они довольно медленные. Их легко реализовать, но я не думаю, что разработчики MS выбрали этот подход из-за его простоты, ведь весь код должен быть переведен в настоящий машинный код, чтобы они просто переместили проблему. Может ли кто-нибудь из вас объяснить этот странный выбор?

PS:
Я размещаю здесь то, что я читал об этой теме:

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

  • инструкции часто меньше (каждый потребляя меньше байтов), чем те найденных в других архитектурах, потому что инструкции обычно не имеют для указания каких-либо операндов.
  • как правило, проще писать компиляторы для архитектур стека, чем для других машин, поскольку преобразование арифметики выражения для последовательности стека операции очень просты.
  • Временные переменные редко необходимо в архитектуре стека, потому что сам стек служит тому Цель.
К сожалению, стек машины также страдают от некоторых серьезных Недостатки:
  • Почти каждый память команд на современных машинах работает медленно). Хоть кэши могут помочь смягчить эту проблему, производительность памяти по-прежнему проблема на машинах стека.
  • Даже если преобразование из HLL к стековой машине очень легко, там меньше возможностей для оптимизации чем есть с другими архитектуры.
  • Потому что стек машины постоянно обращаются к те же элементы данных (то есть данные по верхняя часть стека), конвейерная обработка и инструкция parallelism сложна для достижения (см. "Создать отличный код", Том 1 для получения подробной информации о конвейерной и инструкция parallelism).
A stack - это структура данных, которая позволяет операции только на нескольких ограниченных элементы стека (часто называемые вершина стека и следующая на стеке). С помощью стека вы обычно делаете один из три вещи: нажмите новые данные на стек, данные pop из стека или работать с данными, которые в настоящее время сидя на вершине стека (и возможно, данные сразу ниже Это).

и

13.1.1.5 Статические машины реального мира
Большое преимущество стека архитектура заключается в том, что напишите компилятор для такой машины. Его также очень легко написать эмулятор для машины на основе стека. По этим причинам архитектуры стека популярны в виртуальных машинах (виртуальных машинах) таких как виртуальная машина Java и Microsoft Visual Basic p-code переводчик. Несколько реальных основанные на стеках процессоры, такие как аппаратная реализация Java VM; однако они не очень популярны из-за ограничений производительности доступа к памяти. Тем не менее, понимание основ стека архитектура важна, потому что многие компиляторы переводят исходный код HLL в форму на основе стека до перевод на фактический машинный код. Действительно, в худшем случае (хотя редко), компиляторы вынуждены испускать код, который эмулирует стековый машина при компиляции комплекса арифметические выражения.

EDIT: Я только что нашел статью в блоге @EricLippert, отвечая на вопрос и подтверждая ответ @Aaron

4b9b3361

Ответ 1

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

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

Представьте себе, решили ли они использовать теоретическую систему на основе регистров в качестве промежуточной формы. Сколько регистров они должны выбрать? 8? 16? 64? Если у вашего целевого процессора больше фактических регистров, чем у промежуточной формы, вы проиграли возможные оптимизации. Если ваша цель имеет меньше фактических регистров, чем промежуточная, то ваши оптимизации являются контрпродуктивными, так как эти регистры покраснели в память.

Даже на текущих процессорах у вас есть большая разница в компиляции вплоть до x86 против x64 - не говоря уже об альтернативных архитектурах (ARM) или будущих архитектурах.

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

Ответ 2

Вам нужно будет спросить разработчиков Microsoft. Но я бы предположил, что проблема с производительностью не была их проблемой №1. Большинство приложений Windows не ограничены ЦП или даже действительно ограничены I/O, так как они проводят большую часть своего времени, ожидая, пока пользователь нажмет кнопку. Однако, архитектура, которая позволила им реализовать новые языки, вероятно, была приоритетом.

Ответ 3

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

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