Почему разработчики Microsoft решили сделать .NET машиной на основе стека? - PullRequest
19 голосов
/ 09 мая 2011

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

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

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

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

и

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

РЕДАКТИРОВАТЬ: Я только что нашел статью в блоге @ EricLippert, отвечая на вопрос и подтверждая ответ @ Аарона

Ответы [ 3 ]

15 голосов
/ 09 мая 2011

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

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

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

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

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

0 голосов
/ 09 мая 2011

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

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

0 голосов
/ 09 мая 2011

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

...