~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ AE8AD4978B42E3448ADBC144D6391967__1715751660 ✰
Заголовок документа оригинал.:
✰ Stack machine - Wikipedia ✰
Заголовок документа перевод.:
✰ Штабелируемая машина — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Stack_machine ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/ae/67/ae8ad4978b42e3448adbc144d6391967.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/ae/67/ae8ad4978b42e3448adbc144d6391967__translat.html ✰
Дата и время сохранения документа:
✰ 20.06.2024 18:02:43 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 15 May 2024, at 08:41 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Штабелируемая машина — Википедия Jump to content

Штабелируемая машина

Из Википедии, бесплатной энциклопедии

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

Дизайн [ править ]

Большинство или все инструкции стековой машины предполагают, что операнды будут из стека, а результаты помещены в стек. Стек легко вмещает более двух входных данных или более одного результата, поэтому можно вычислить богатый набор операций. В стековом машинном коде (иногда называемом p-кодом ) инструкции часто имеют только код операции , управляющий операцией, без дополнительных полей, идентифицирующих константу, регистр или ячейку памяти, что известно как формат нулевого адреса . [1] Говорят, что компьютер, который работает таким образом, что большинство его инструкций не содержит явных адресов, использует инструкции с нулевым адресом. [2] Это значительно упрощает декодирование инструкций. Ветви, немедленная загрузка и инструкции загрузки/сохранения требуют поля аргумента, но стековые машины часто устраивают так, что частые случаи из них по-прежнему помещаются вместе с кодом операции в компактную группу битов . Выбор операндов из предыдущих результатов осуществляется неявно путем упорядочивания инструкций. Некоторые наборы команд стековой машины предназначены для интерпретирующего выполнения виртуальной машины, а не для непосредственного управления оборудованием.

Целочисленные константные операнды передаются Push или Load Immediateинструкции. Доступ к памяти часто осуществляется отдельными Load или Storeинструкции, содержащие адрес памяти или вычисляющие адрес из значений в стеке. Все практические стековые машины имеют варианты кодов операций загрузки-сохранения для доступа к локальным переменным и формальным параметрам без явного вычисления адреса. Это может быть смещение от текущего адреса вершины стека или смещение от стабильного базового регистра кадра.

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

Дерево двоичного синтаксиса для выражения A *( B - C ) + ( D + E )

Например, рассмотрим выражение A *( B - C )+( D + E ), записанное в обратной польской записи как A B C - * D E + +. Компиляция и запуск этого на простой воображаемой стековой машине будет выглядеть так:

# содержимое стека (крайний левый = верхний = самый последний):
  нажми А#А
  нажми Б#БА
  нажмите C # CBA
  вычесть # BC A
  умножить # A*(BC)
  нажмите D # DA*(BC)
  нажмите E # EDA*(BC)
  добавить # D+EA*(BC)
  добавить # A*(BC)+(D+E)
 

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

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

Оптимизация скомпилированного кода стека вполне возможна. Было продемонстрировано, что внутренняя оптимизация вывода компилятора значительно улучшает код. [3] [4] и потенциально производительность, в то время как глобальная оптимизация внутри самого компилятора обеспечивает дальнейший выигрыш. [5]

Хранилище стека [ править ]

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

Учитывать X+1. Он компилируется в Load X; Load 1; Add. Когда стек полностью хранится в оперативной памяти, это выполняет неявную запись и чтение стека в памяти:

  • Загрузите X, нажмите в память
  • Загрузите 1, нажмите в память
  • Извлечь 2 значения из памяти, добавить и отправить результат в память

всего 5 ссылок на кэш данных.

Следующим шагом вперед является стековая машина или интерпретатор с одним регистром вершины стека. Затем приведенный выше код выполняет:

  • Загрузите X в пустой регистр TOS (если аппаратная машина) или запишите регистр TOS в память, загрузите X в регистр TOS (если интерпретатор)
  • Поместите регистр TOS в память, загрузите 1 в регистр TOS.
  • Вытащить левый операнд из памяти, добавить в регистр TOS и оставить там

всего 3 ссылки на кэш данных, в худшем случае. Обычно интерпретаторы не отслеживают пустоту, потому что в этом нет необходимости: все, что находится ниже указателя стека, является непустым значением, а регистр кэша TOS всегда остается горячим. Однако типичные интерпретаторы Java не буферизуют верхнюю часть стека таким образом, поскольку программа и стек содержат как короткие, так и широкие значения данных.

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

История и реализации [ править ]

Описание такого метода, требующего одновременного хранения в регистрах только двух значений с ограниченным набором заранее определенных операндов, которые можно было расширить путем определения дальнейших операндов, функций и подпрограмм, было впервые представлено на конференции Робертом С. Бартон в 1961 году. [6] [7]

Коммерческие штабелёры [ править ]

Примеры наборов команд стека, непосредственно выполняемых аппаратно, включают:

Виртуальные стековые машины [ править ]

Примеры машин виртуального стека, интерпретируемых в программном обеспечении:

Гибридные машины [ править ]

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

Другой распространенный гибрид — начать с архитектуры регистровой машины и добавить еще один режим адреса памяти, который имитирует операции push или pop стековых машин: 'memaddress = reg; reg += instr.displ'. Впервые он был использован в PDP миникомпьютере DEC -11 . [26] Эта функция была реализована в VAX компьютерах и микропроцессорах Motorola 6800 и M68000 . Это позволило использовать более простые методы стека в ранних компиляторах. Он также эффективно поддерживал виртуальные машины с использованием интерпретаторов стека или многопоточного кода . Однако эта функция не помогла собственному коду регистровой машины стать таким же компактным, как чистый машинный код стека. Также скорость выполнения была меньше, чем при хорошей компиляции в регистровую архитектуру. Быстрее изменять указатель вершины стека лишь изредка (один раз за вызов или возврат), чем постоянно перемещать его вверх и вниз в каждом операторе программы, и еще быстрее полностью избегать обращений к памяти.

Совсем недавно так называемые стековые машины второго поколения приняли специальный набор регистров в качестве адресных регистров, разгружая задачу адресации памяти со стека данных. Например, MuP21 использует регистр под названием «A», тогда как более поздние процессоры GreenArrays используют два регистра: A и B. [23]

Семейство микропроцессоров Intel x86 имеет набор инструкций в виде регистра (аккумулятора) для большинства операций, но для x87 использует инструкции стека , арифметику с плавающей запятой Intel 8087 , восходящую к сопроцессору iAPX87 (8087) для 8086 и 8088. То есть, нет доступных для программиста регистров с плавающей запятой, а есть только 80-битный 8-уровневый стек. Процессор x87 в значительной степени зависит от процессора x86 при выполнении своих операций.

использующие стеки вызовов и стека Компьютеры , фреймы

Most current computers (of any instruction set style) and most compilers use a large call-return stack in memory to organize the short-lived local variables and return links for all currently active procedures or functions. Each nested call creates a new stack frame in memory, which persists until that call completes. This call-return stack may be entirely managed by the hardware via specialized address registers and special address modes in the instructions. Or it may be merely a set of conventions followed by the compilers, using generic registers and register+offset address modes. Or it may be something in between.

Since this technique is now nearly universal, even on register machines, it is not helpful to refer to all these machines as stack machines. That term is commonly reserved for machines which also use an expression stack and stack-only arithmetic instructions to evaluate the pieces of a single statement.

Computers commonly provide direct, efficient access to the program's global variables and to the local variables of only the current innermost procedure or function, the topmost stack frame. 'Up level' addressing of the contents of callers' stack frames is usually not needed and not supported as directly by the hardware. If needed, compilers support this by passing in frame pointers as additional, hidden parameters.

Some Burroughs stack machines do support up-level refs directly in the hardware, with specialized address modes and a special 'display' register file holding the frame addresses of all outer scopes. Currently, only MCST Elbrus has done this in hardware. When Niklaus Wirth developed the first Pascal compiler for the CDC 6000, he found that it was faster overall to pass in the frame pointers as a chain, rather than constantly updating complete arrays of frame pointers. This software method also adds no overhead for common languages like C which lack up-level refs.

The same Burroughs machines also supported nesting of tasks or threads. The task and its creator share the stack frames that existed at the time of task creation, but not the creator's subsequent frames nor the task's own frames. This was supported by a cactus stack, whose layout diagram resembled the trunk and arms of a Saguaro cactus. Each task had its own memory segment holding its stack and the frames that it owns. The base of this stack is linked to the middle of its creator's stack. In machines with a conventional flat address space, the creator stack and task stacks would be separate heap objects in one heap.

In some programming languages, the outer-scope data environments are not always nested in time. These languages organize their procedure 'activation records' as separate heap objects rather than as stack frames appended to a linear stack.

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

Сравнение с регистровыми машинами [ править ]

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

Инструкция [ править ]

Стековые машины имеют более высокую плотность кода . В отличие от обычных машинных команд стека, которые легко умещаются в 6 бит или меньше, регистровым машинам требуется два или три поля номера регистра на инструкцию ALU для выбора операндов; машины с самыми плотными регистрами имеют в среднем около 16 бит на инструкцию плюс операнды. Регистровые машины также используют более широкое поле смещения для кодов операций загрузки и сохранения. Компактный код стековой машины естественным образом помещает в кэш больше инструкций и, следовательно, может обеспечить более высокую эффективность кэша , снижая затраты на память или позволяя использовать более быстрые системы памяти при заданной стоимости. Кроме того, большинство инструкций стековой машины очень просты и состоят только из одного поля кода операции или одного поля операнда. Таким образом, стековым машинам требуется очень мало электронных ресурсов для декодирования каждой инструкции.

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

Большинство интерпретаторов регистров указывают свои регистры по номерам. Но к регистрам хост-машины нельзя получить доступ в индексированном массиве, поэтому для виртуальных регистров выделяется массив памяти. Следовательно, инструкции интерпретатора регистров должны использовать память для передачи сгенерированных данных следующей инструкции. Это заставляет интерпретаторы регистров работать намного медленнее на микропроцессорах, созданных с использованием правил точного процесса (т. е. более быстрых транзисторов без увеличения скорости схемы, таких как Haswell x86). Им требуется несколько тактов для доступа к памяти, но только один такт для доступа к регистру. В случае стековой машины со схемой пересылки данных вместо файла регистров интерпретаторы стека могут выделять регистры главной машины для нескольких верхних операндов стека вместо памяти главной машины.

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

Временные/локальные значения [ править ]

Некоторые представители отрасли полагают, что стековые машины выполняют больше циклов кэширования данных для временных значений и локальных переменных, чем регистровые машины. [29]

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

На регистровых машинах, использующих оптимизирующие компиляторы, наиболее часто используемые локальные переменные остаются в регистрах, а не в ячейках памяти кадра стека. Это исключает большинство циклов кэширования данных для чтения и записи этих значений. Разработка «стекового планирования» для выполнения анализа переменных в реальном времени и, таким образом, сохранения ключевых переменных в стеке в течение продолжительных периодов времени помогает решить эту проблему. [3] [4] [5]

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

Общие подвыражения [ править ]

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

Напротив, в стековых машинах результаты могут сохраняться одним из двух способов. Во-первых, результаты можно сохранить с помощью временной переменной в памяти. Хранение и последующее извлечение требуют дополнительных инструкций и дополнительных циклов кэширования данных. Это будет выигрышем только в том случае, если вычисление подвыражения требует больше времени, чем выборка из памяти, что в большинстве процессоров со стеком происходит почти всегда. Это никогда не имеет смысла для простых переменных и выборок указателей, потому что они уже имеют одинаковую стоимость одного цикла кэширования данных за доступ. Это лишь незначительно полезно для таких выражений, как X+1. Эти более простые выражения составляют большинство избыточных, оптимизируемых выражений в программах, написанных на языках, отличных от конкатенативных языков . Оптимизирующий компилятор может выиграть только от избыточности, которой программист мог бы избежать в исходном коде. [ нужна цитата ]

Второй способ оставляет вычисленное значение в стеке данных, дублируя его по мере необходимости. При этом используются операции для копирования записей стека. Стек должен иметь достаточную глубину для доступных инструкций копирования ЦП. Написанный вручную стек-код часто использует этот подход и достигает скорости, сравнимой с регистровыми машинами общего назначения. [30] [9] К сожалению, алгоритмы оптимального «стекового планирования» не получили широкого распространения в языках программирования.

Конвейерная обработка [ править ]

В современных машинах время выборки переменной из кэша данных часто в несколько раз превышает время, необходимое для основных операций ALU. Программа работает быстрее без зависаний, если загрузка ее памяти может быть запущена за несколько циклов до команды, которой нужна эта переменная. Сложные машины могут сделать это с помощью глубокого конвейера и «выполнения вне очереди», который проверяет и выполняет множество инструкций одновременно. Регистровые машины могут сделать это даже с гораздо более простым «правильным» оборудованием, неглубоким конвейером и немного более умными компиляторами. Шаг загрузки становится отдельной инструкцией, и эта инструкция статически запланирована гораздо раньше в последовательности кода. Компилятор помещает между ними независимые шаги.

Для планирования доступа к памяти требуются явные резервные регистры. На стековых машинах это невозможно без раскрытия программисту некоторых аспектов микроархитектуры. Для выражения AB - B должно быть вычислено и введено непосредственно перед шагом «Минус». Без перестановки стека или аппаратной многопоточности во время ожидания завершения загрузки B между ними можно разместить относительно мало полезного кода. Стековые машины могут обойти задержку памяти, либо имея глубокий конвейер выполнения с нарушением порядка, охватывающий множество инструкций одновременно, либо, что более вероятно, они могут переставить стек так, чтобы они могли работать над другими рабочими нагрузками, пока загрузка завершается, или они может чередовать выполнение разных потоков программы, как в системе Unisys A9. [31] Однако сегодняшние все более параллельные вычислительные нагрузки позволяют предположить, что это, возможно, не тот недостаток, которым его считали в прошлом.

Стековые машины могут пропускать этап выборки операндов в регистровой машине. [30] Например, в микропроцессоре Java Optimized Processor (JOP) два верхних операнда стека напрямую входят в схему пересылки данных, которая работает быстрее, чем файл регистров. [32]

Исполнение вне очереди [ править ]

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

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

Одна из проблем, поднятая в ходе исследования, заключалась в том, что для выполнения работы одной инструкции на машине с архитектурой загрузки и хранения требуется около 1,88 машинных инструкций стека. [ нужна цитата ] Таким образом, конкурирующие машины с вышедшим из строя штабелем требуют примерно вдвое больше электронных ресурсов для отслеживания инструкций («станций выдачи»). Это может быть компенсировано экономией в кэше инструкций и памяти, а также за счет схем декодирования инструкций.

Скрывает внутри более быструю регистрационную машину [ править ]

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

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

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

Еще одним примером являются трансляторы объектного кода для HP 3000 и Tandem T/16. [34] [35] Они перевели последовательности стекового кода в эквивалентные последовательности RISC-кода. Незначительные «локальные» оптимизации устранили большую часть накладных расходов стековой архитектуры. Запасные регистры использовались для исключения повторяющихся вычислений адреса. Переведенный код по-прежнему содержал много накладных расходов на эмуляцию из-за несоответствия между исходной и целевой машинами. Несмотря на это бремя, эффективность цикла транслируемого кода соответствовала эффективности цикла исходного кода стека. А когда исходный код перекомпилировался напрямую в регистровую машину с помощью оптимизирующих компиляторов, эффективность возросла вдвое. Это показывает, что стековая архитектура и ее неоптимизирующие компиляторы тратили более половины мощности базового оборудования.

Файлы регистров являются хорошими инструментами для вычислений, поскольку они имеют высокую пропускную способность и очень низкую задержку по сравнению с обращениями к памяти через кэши данных. В простой машине файл регистров позволяет читать два независимых регистра и записывать третий, и все это за один цикл ALU с задержкой в ​​один цикл или меньше. В то время как соответствующий кэш данных может запускать только одно чтение или одну запись (не обе) за цикл, а задержка чтения обычно составляет два цикла ALU. Это одна треть пропускной способности при удвоенной задержке конвейера. В сложной машине, такой как Athlon , которая выполняет две или более инструкций за цикл, файл регистров позволяет считывать четыре или более независимых регистров и записывать два других, и все это за один цикл ALU с задержкой в ​​один цикл. В то время как соответствующий двухпортовый кэш данных может запускать только два чтения или записи за цикл с несколькими циклами задержки. Опять же, это треть пропускной способности регистров. Создание кэша с дополнительными портами обходится очень дорого.

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

Прерывания [ править ]

Реакция на прерывание включает сохранение регистров в стек, а затем переход к коду обработчика прерывания. Часто стековые машины быстрее реагируют на прерывания, поскольку большинство параметров уже находятся в стеке и помещать их туда нет необходимости. Некоторые регистровые машины решают эту проблему, имея несколько файлов регистров, которые можно мгновенно поменять местами. [36] но это увеличивает затраты и замедляет работу файла реестра.

Переводчики [ править ]

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

Интерпретаторы для виртуальных машин стека часто работают медленнее, чем интерпретаторы для других стилей виртуальных машин. [37] Это замедление наиболее сильно проявляется при работе на хост-компьютерах с глубокими конвейерами выполнения, таких как современные чипы x86.

В некоторых интерпретаторах интерпретатор должен выполнить переход по N-стороннему переключателю, чтобы декодировать следующий код операции и перейти к его шагам для этого конкретного кода операции. Другой метод выбора опкодов — потоковый код . Механизмы предварительной выборки хост-машины не могут предсказать и получить цель этого индексированного или косвенного перехода. Таким образом, конвейер выполнения хост-машины должен перезапускаться каждый раз, когда размещенный интерпретатор декодирует другую виртуальную инструкцию. Это происходит чаще с виртуальными стековыми машинами, чем с другими типами виртуальных машин. [38]

Одним из примеров является язык программирования Java . Его каноническая виртуальная машина указана как 8-битная стековая машина. Однако виртуальная машина Dalvik для Java, используемая на Android смартфонах , представляет собой 16-битную машину с виртуальным регистром — выбор сделан по соображениям эффективности. Арифметические инструкции напрямую извлекают или сохраняют локальные переменные через 4-битные (или более) поля инструкций. [39] Аналогичным образом, версия 5.0 Lua заменила виртуальную машину стека более быстрой машиной виртуальных регистров. [40] [41]

С тех пор, как виртуальная машина Java стала популярной, микропроцессоры стали использовать усовершенствованные средства прогнозирования ветвей для непрямых переходов. [42] Это усовершенствование позволяет избежать большинства перезапусков конвейера из-за N-путевых переходов и устраняет большую часть затрат на подсчет команд, которые влияют на интерпретаторы стека.

См. также [ править ]

Ссылки [ править ]

  1. ^ Борода, Боб (осень 1997 г.). «Компьютер KDF9 — 30 лет спустя» . Компьютерное ВОСКРЕСЕНИЕ .
  2. ^ Хейс, Джон П. (1978). Компьютерная архитектура и организация . Международная книжная компания McGraw-Hill. п. 164. ИСБН  0-07-027363-4 .
  3. ^ Перейти обратно: а б Купман-младший, Филип Джон (1994). «Предварительное исследование оптимизированной генерации стекового кода» (PDF) . Журнал Форт-приложений и исследований . 6 (3).
  4. ^ Перейти обратно: а б Бейли, Крис (2000). «Межграничное планирование операндов стека: предварительное исследование» (PDF) . Материалы конференции Euroforth 2000 .
  5. ^ Перейти обратно: а б Шеннон, Марк; Бейли, Крис (2006). «Глобальное распределение стека: распределение регистров для стековых машин» (PDF) . Материалы конференции Euroforth 2006 .
  6. ^ Бартон, Роберт С. (9 мая 1961 г.). «Новый подход к функциональному проектированию цифрового компьютера» . Доклады, представленные на Западной совместной компьютерной конференции IRE-AIEE-ACM 9–11 мая 1961 г. 1961 Западная совместная компьютерная конференция IRE-AIEE-ACM. стр. 393–396. дои : 10.1145/1460690.1460736 . ISBN  978-1-45037872-7 . S2CID   29044652 .
  7. ^ Бартон, Роберт С. (1987). «Новый подход к функциональному проектированию цифрового компьютера» . IEEE Анналы истории вычислений . 9 :11–15. дои : 10.1109/MAHC.1987.10002 .
  8. ^ Блаау, Геррит Энн ; Брукс-младший, Фредерик Филлипс (1997). Компьютерная архитектура: концепции и эволюция . Бостон, Массачусетс, США: Addison-Wesley Longman Publishing Co., Inc.
  9. ^ Перейти обратно: а б ЛаФорест, Чарльз Эрик (апрель 2007 г.). «2.1 Лукасевич и первое поколение: 2.1.2 Германия: Конрад Цузе (1910–1995); 2.2 Первое поколение стековых компьютеров: 2.2.1 Zuse Z4». Стековая компьютерная архитектура второго поколения (PDF) (диссертация). Ватерлоо, Канада: Университет Ватерлоо . п. 8, 11 и т. д. Архивировано (PDF) из оригинала 20 января 2022 г. Проверено 2 июля 2022 г. (178 страниц) [1]
  10. ^ Греве, Дэвид А.; Уайлдинг, Мэтью М. (12 января 1998 г.). «Первый в мире Java-процессор» . Время электронной инженерии .
  11. ^ «Принципы работы процессора Mesa» . Компьютерный музей DigiBarn . Ксерокс. Архивировано из оригинала 14 мая 2024 г. Проверено 20 сентября 2023 г.
  12. ^ «DigiBarn: Xerox Star 8010 «Одуванчик» » . Компьютерный музей DigiBarn. Архивировано из оригинала 3 мая 2024 г. Проверено 20 сентября 2023 г.
  13. ^ «Набор команд для однокристального 32-битного процессора» . Журнал Hewlett-Packard . 34 (8). Hewlett Packard. Август 1983 года . Проверено 5 февраля 2024 г.
  14. ^ Руководство программиста 4-битных микроконтроллеров MARC4 (PDF) . Атмел .
  15. ^ «Форт фишки» . Colorforth.com . Архивировано из оригинала 15 февраля 2006 г. Проверено 8 октября 2017 г.
  16. ^ «Обзор микропроцессора F21» . Ультратехнология.com . Проверено 8 октября 2017 г.
  17. ^ «ФортФрик вики» . GitHub.com . 25 августа 2017 г. Проверено 8 октября 2017 г.
  18. ^ «Чип Java доступен — прямо сейчас!» . Разработчик.com . 8 апреля 1999 г. Проверено 7 июля 2022 г.
  19. ^ «4-стековый процессор» . bernd-paysan.de . Проверено 8 октября 2017 г.
  20. ^ «Портирование компилятора GNU C на микропроцессор Thor» (PDF) . 04.12.1995. Архивировано из оригинала (PDF) 20 августа 2011 г. Проверено 30 марта 2011 г.
  21. ^ «ZPU — самый маленький в мире 32-битный процессор с набором инструментов GCC: обзор» . opencores.org . Проверено 7 февраля 2015 г.
  22. ^ Перейти обратно: а б «Документы» . ГринАррайс, Инк . Технология F18A . Проверено 7 июля 2022 г.
  23. ^ Перейти обратно: а б «Инструкции colorForth» . Colorforth.com . Архивировано из оригинала 10 марта 2016 г. Проверено 8 октября 2017 г. (Набор инструкций ядер F18A, по историческим причинам названный colorForth.)
  24. ^ «ГринАррайс, Инк» . Greenarraychips.com . Проверено 8 октября 2017 г.
  25. ^ Рэнделл, Брайан ; Рассел, Лоуфорд Джон (1964). Реализация Алгола 60 (PDF) . Лондон, Великобритания: Academic Press . ISBN  0-12-578150-4 .
  26. ^ Дункан, Фрейзер Джордж (1 мая 1977 г.). «Разработка стековых машин: Австралия, Великобритания и Европа» (PDF) . Компьютер . Том. 10, нет. 5. Бристольский университет, Бристоль, Вирджиния, США. стр. 50–52. дои : 10.1109/MC.1977.315873 . eISSN   1558-0814 . ISSN   0018-9162 . S2CID   17013010 . КОДЕН   CPTRB4 . Архивировано из оригинала (PDF) 15 октября 2023 г. Проверено 15 октября 2023 г. (3 страницы)
  27. ^ Ши, Юнхэ; Грегг, Дэвид; Битти, Эндрю; Эртл, М. Антон (2005). «Разборка виртуальных машин: стек против регистров». Материалы 1-й международной конференции ACM/USENIX по виртуальным средам исполнения . стр. 153–163. дои : 10.1145/1064979.1065001 . ISBN  1595930477 . S2CID   811512 .
  28. ^ Хайд, Рэндалл (2004). Напишите отличный код, Том. 2. Мышление на низком уровне, письмо на высоком уровне . Том. 2. Пресс без крахмала . п. 391. ИСБН  978-1-59327-065-0 . Проверено 30 июня 2021 г.
  29. ^ «Компьютерная архитектура: количественный подход», Джон Л. Хеннесси , Дэвид Эндрю Паттерсон ; См. обсуждение стековых машин.
  30. ^ Перейти обратно: а б Купман-младший, Филип Джон. «Стековые компьютеры: новая волна» . Ece.cmu.edu . Проверено 8 октября 2017 г.
  31. ^ Введение в системы серии A (PDF) . Корпорация Берроуз . Апрель 1986 года . Проверено 20 сентября 2023 г.
  32. ^ «Проектирование и внедрение эффективной штабелёрной машины» (PDF) . Jopdesign.com . Проверено 8 октября 2017 г.
  33. ^ Синха, Стив; Чаттерджи, Сатраджит; Равиндран, Кошик. «BOOST: Неисправный стек в Беркли» . Исследовательские ворота . Проверено 11 ноября 2023 г.
  34. ^ Берг, Арндт; Кейлман, Кейт; Магенхаймер, Дэниел; Миллер, Джеймс (декабрь 1987 г.). «Эмуляция HP3000 на компьютерах с архитектурой HP Precision» (PDF) . Журнал Hewlett-Packard . Хьюлетт-Паккард : 87–89 . Проверено 20 сентября 2023 г.
  35. ^ Кристи Эндрюс; Дуэйн Сэнд (октябрь 1992 г.). «Миграция семейства компьютеров CISC на RISC посредством трансляции объектного кода». Труды АСПЛОС-V .
  36. ^ Руководство по процессору 8051, Intel, 1980 г.
  37. ^ Ши, Юнхэ; Грегг, Дэвид; Битти, Эндрю; Эртле, М. Антон. «Разборка виртуальных машин: стек против регистровой машины» (PDF) . Usenix.org . Проверено 8 октября 2017 г.
  38. ^ Дэвис, Брайан; Битти, Эндрю; Кейси, Кевин; Грегг, Дэвид; Уолдрон, Джон. «Аргументы в пользу машин с виртуальными регистрами» (PDF) . Scss.tcd.ie. ​ Проверено 20 сентября 2023 г.
  39. ^ Борнштейн, Дэн (29 мая 2008 г.). «Презентация внутренних компонентов Dalvik VM» (PDF) . п. 22 . Проверено 16 августа 2010 г.
  40. ^ «Реализация Lua 5.0» (PDF) . Луа.орг . Проверено 8 октября 2017 г.
  41. ^ «Виртуальная машина Lua 5.0» (PDF) . Инф.puc-rio.br . Проверено 8 октября 2017 г.
  42. ^ «Прогнозирование ветвей и работа переводчиков - не доверяйте фольклору» . Hal.inria.fr . Проверено 20 сентября 2023 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: AE8AD4978B42E3448ADBC144D6391967__1715751660
URL1:https://en.wikipedia.org/wiki/Stack_machine
Заголовок, (Title) документа по адресу, URL1:
Stack machine - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)