stringtranslate.com

Машина для укладки штабеля

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

Дизайн

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

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

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

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

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

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

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

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

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

Стековое хранение

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

Рассмотрим X+1. Он компилируется в Load X; Load 1; Add. При полностью сохраненном в оперативной памяти стеке выполняются неявные записи и чтения стека в памяти:

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

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

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

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

История и внедрения

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

Коммерческие штабелирующие машины

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

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

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

Гибридные машины

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

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

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

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

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

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

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

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

Некоторые стековые машины Burroughs поддерживают ссылки верхнего уровня непосредственно в оборудовании, со специализированными режимами адресов и специальным файлом регистров «дисплея», содержащим адреса кадров всех внешних областей. В настоящее время только MCST Elbrus сделал это в оборудовании. Когда Никлаус Вирт разработал первый компилятор Pascal для CDC 6000 , он обнаружил, что в целом быстрее передавать указатели кадров как цепочку, а не постоянно обновлять полные массивы указателей кадров. Этот программный метод также не добавляет накладных расходов для распространенных языков, таких как C, в которых отсутствуют ссылки верхнего уровня.

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

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

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

Сравнение с регистровыми машинами

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

Инструкции

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

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

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

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

Временные/локальные значения

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

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

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

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

Общие подвыражения

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

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

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

Конвейеризация

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

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

Стековые машины могут пропускать стадию выборки операндов регистровой машины. [30] Например, в микропроцессоре Java Optimized Processor (JOP) верхние 2 операнда стека напрямую входят в схему пересылки данных, которая быстрее, чем регистровый файл. [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 International Book Company. стр. 164. ISBN 0-07-027363-4.
  3. ^ ab Koopman, Jr., Philip John (1994). "Предварительное исследование оптимизированной генерации стекового кода" (PDF) . Журнал Forth Applications and Research . 6 (3).
  4. ^ ab Бейли, Крис (2000). "Межграничное планирование стековых операндов: предварительное исследование" (PDF) . Труды конференции Euroforth 2000 .
  5. ^ ab Шеннон, Марк; Бейли, Крис (2006). "Глобальное распределение стека: распределение регистров для стековых машин" (PDF) . Труды конференции Euroforth 2006 .
  6. ^ Бартон, Роберт С. (1961-05-09). "Новый подход к функциональному проектированию цифрового компьютера". Доклады, представленные на 9–11 мая 1961 г., Western Joint IRE-AIEE-ACM Computer Conference . 1961 Western Joint IRE-AIEE-ACM Computer Conference. стр. 393–396. doi :10.1145/1460690.1460736. ISBN 978-1-45037872-7. S2CID  29044652.
  7. ^ Бартон, Роберт С. (1987). «Новый подход к функциональному проектированию цифрового компьютера». IEEE Annals of the History of Computing . 9 : 11–15. doi :10.1109/MAHC.1987.10002.
  8. ^ Блаау, Геррит Энн ; Брукс, младший, Фредерик Филлипс (1997). Архитектура компьютера: концепции и эволюция . Бостон, Массачусетс, США: Addison-Wesley Longman Publishing Co., Inc.
  9. ^ ab LaForest, Charles Eric (апрель 2007 г.). "2.1 Лукасевич и первое поколение: 2.1.2 Германия: Конрад Цузе (1910–1995); 2.2 Первое поколение стековых компьютеров: 2.2.1 Цузе Z4". Архитектура стековых компьютеров второго поколения (PDF) (диссертация). Ватерлоо, Канада: Университет Ватерлоо . стр. 8, 11 и т. д. Архивировано (PDF) из оригинала 20.01.2022 . Получено 02.07.2022 .(178 страниц) [1]
  10. ^ Греве, Дэвид А.; Уайлдинг, Мэтью М. (1998-01-12). «Первый в мире процессор Java». Electronic Engineering Times .
  11. ^ "Mesa Processor Principles of Operation". Музей компьютеров DigiBarn . Xerox. Архивировано из оригинала 2024-05-14 . Получено 2023-09-20 .
  12. ^ "DigiBarn: Xerox Star 8010 "Dandelion"". Музей компьютеров DigiBarn. Архивировано из оригинала 2024-05-03 . Получено 2023-09-20 .
  13. ^ "Набор инструкций для однокристального 32-разрядного процессора". Hewlett-Packard Journal . 34 (8). Hewlett-Packard. Август 1983. Получено 2024-02-05 .
  14. ^ MARC4 4-битные микроконтроллеры. Руководство программиста (PDF) . Atmel .
  15. ^ "Forth chips". Colorforth.com . Архивировано из оригинала 2006-02-15 . Получено 2017-10-08 .
  16. ^ "Обзор микропроцессора F21". Ultratechnology.com . Получено 2017-10-08 .
  17. ^ "ForthFreak wiki". GitHub.com . 2017-08-25 . Получено 2017-10-08 .
  18. ^ "Java chip available -- now!". Developer.com . 1999-04-08 . Получено 2022-07-07 .
  19. ^ "4stack Processor". bernd-paysan.de . Получено 2017-10-08 .
  20. ^ "Перенос компилятора GNU C на микропроцессор Thor" (PDF) . 1995-12-04. Архивировано из оригинала (PDF) 2011-08-20 . Получено 30-03-2011 .
  21. ^ "ZPU - самый маленький в мире 32-битный процессор с набором инструментов GCC: Обзор". opencores.org . Получено 2015-02-07 .
  22. ^ ab "Документы". GreenArrays, Inc. Технология F18A . Получено 2022-07-07 .
  23. ^ ab "colorForth Instructions". Colorforth.com . Архивировано из оригинала 2016-03-10 . Получено 2017-10-08 .(Набор инструкций ядер F18A, названный colorForth по историческим причинам.)
  24. ^ "GreenArrays, Inc". Greenarraychips.com . Получено 2017-10-08 .
  25. ^ Рэнделл, Брайан ; Рассел, Лоуфорд Джон (1964). Реализация Algol 60 (PDF) . Лондон, Великобритания: Academic Press . ISBN 0-12-578150-4.
  26. ^ Дункан, Фрейзер Джордж (1977-05-01). "Разработка стековых машин: Австралия, Великобритания и Европа" (PDF) . Компьютер . Том 10, № 5. Университет Бристоля, Бристоль, Вирджиния, США. стр. 50–52. doi :10.1109/MC.1977.315873. eISSN  1558-0814. ISSN  0018-9162. S2CID  17013010. КОДЕН  CPTRB4. Архивировано из оригинала (PDF) 2023-10-15 . Получено 2023-10-15 .(3 страницы)
  27. ^ Ши, Юньхэ; Грегг, Дэвид; Битти, Эндрю; Эртл, М. Антон (2005). «Столкновение виртуальных машин: стек против регистров». Труды 1-й международной конференции ACM/USENIX по виртуальным средам выполнения . С. 153–163. doi :10.1145/1064979.1065001. ISBN 1595930477. S2CID  811512.
  28. ^ Хайд, Рэндалл (2004). Write Great Code, Vol. 2: Thinking Low-Level, Writing High-Level. Vol. 2. No Starch Press . стр. 391. ISBN 978-1-59327-065-0. Получено 2021-06-30 .
  29. ^ «Архитектура компьютера: количественный подход», Джон Л. Хеннесси , Дэвид Эндрю Паттерсон ; См. обсуждение стековых машин.
  30. ^ ab Koopman, Jr., Philip John. "Stack Computers: the new wave". Ece.cmu.edu . Получено 2017-10-08 .
  31. ^ Введение в системы серии A (PDF) . Burroughs Corporation . Апрель 1986. Получено 20 сентября 2023 г.
  32. ^ "Проектирование и реализация эффективной стековой машины" (PDF) . Jopdesign.com . Получено 2017-10-08 .
  33. ^ Синха, Стив; Чаттерджи, Сатраджит; Равиндран, Каушик. "BOOST: Berkeley's Out of Order Stack Thingy". Research Gate . Получено 11 ноября 2023 г.
  34. ^ Берг, Арндт; Кейлман, Кейт; Магенхаймер, Дэниел; Миллер, Джеймс (декабрь 1987 г.). «Эмуляция HP3000 на компьютерах с прецизионной архитектурой HP» (PDF) . Журнал Hewlett-Packard . Hewlett-Packard : 87–89 . Получено 20 сентября 2023 г. .
  35. ^ Кристи Эндрюс; Дуэйн Сэнд (октябрь 1992 г.). «Переход семейства компьютеров CISC на RISC посредством трансляции объектного кода». Труды ASPLOS-V .
  36. ^ Руководство по процессору 8051, Intel, 1980
  37. ^ Ши, Юньхэ; Грегг, Дэвид; Битти, Эндрю; Эртл, М. Антон. «Virtual Machine Showdown: Stack vs. Register Machine» (PDF) . Usenix.org . Получено 08.10.2017 .
  38. ^ Дэвис, Брайан; Битти, Эндрю; Кейси, Кевин; Грегг, Дэвид; Уолдрон, Джон. «Дело в пользу виртуальных регистровых машин» (PDF) . Scss.tcd.ie . Получено 20 сентября 2023 г.
  39. ^ Борнштейн, Дэн (29.05.2008). "Презентация внутренних компонентов Dalvik VM" (PDF) . стр. 22. Получено 16.08.2010 .
  40. ^ "Реализация Lua 5.0" (PDF) . Lua.org . Получено 2017-10-08 .
  41. ^ "Виртуальная машина Lua 5.0" (PDF) . Inf.puc-rio.br . Получено 2017-10-08 .
  42. ^ «Предсказание ветвей и эффективность интерпретаторов — не доверяйте фольклору». Hal.inria.fr . Получено 2023-09-20 .

Внешние ссылки