JVM нигде не упоминает о существовании регистров. С ее точки зрения, память существует только в нескольких местах, таких как стек для каждого потока, область метода, пулы постоянных времени выполнения и т. Д. При этом, если вы хотите реализовать физическое устройство, которое подключено к JVM, вы ' Почти наверняка нужны регистры для хранения некоторых временных значений, сгенерированных при выполнении определенных байт-кодов, или для хранения дополнительной дополнительной информации о стороне. Например, попробуйте поискать инструкцию multianewarray
и посмотреть, сможете ли вы реализовать ее без регистров. : -)
Одна параллель, которую вы можете найти в настоящих ЦП в эти дни, состоит в том, что, хотя для программистов есть выделенный набор регистров, большинство ЦП имеют существенно больше регистров, которые используются внутри для различных целей. Например, большинство микросхем MIPS имеют огромное количество регистров, используемых для конвейерной обработки. Они содержат такие вещи, как биты управления из предыдущих инструкций. Я бы сдулся, если бы x86 был другим.
Следует помнить, что регистры не определяют, как работает машина, основанная на регистрах, а не машина, основанная на стеке. В большинстве архитектур у вас есть O (1) регистров, которые предназначены для внутреннего использования. Даже у JVM есть такие - у каждого метода есть «массив локальных переменных», который изначально содержит параметры функции, но может также использоваться в качестве промежуточного пространства, если это необходимо. Более важной частью стековых машин, которая отличает их от других машин, является то, как работает расширяемая память. В большинстве компьютеров память имеет произвольный доступ, и вы можете в любое время читать из любого места. То есть с n ячейками памяти вы можете в любой момент прочитать O (n) памяти. На машинах, основанных на стеке, у вас есть доступ только к нескольким верхним точкам стека, поэтому у вас есть только O (1) областей памяти, которые можно прочитать одновременно.
Теоретически, поскольку JVM должна представлять собой полноценную виртуальную машину, у вас может быть компьютер, который загрузился и просто запустил JVM без какой-либо ОС (точнее, JVM будет ОС и вашими «программами»). было бы просто байт-кодами Java и файлами классов).
Есть несколько других стековых языков, из которых первым, что приходит на ум, является Forth . Я упоминаю Forth, потому что это явно язык на основе стека; все, что вы делаете, выражается в терминах манипулирования стеком операндов. Что здорово в этом вопросе относительно вашего первоначального вопроса, так это то, что Форт был чрезвычайно популярен среди любителей, потому что вы могли действительно легко перенести его на встроенные устройства. Чтобы получить полноценный интерпретатор Forth, вам не нужна действительно мощная ОС - вам просто нужен командный интерпретатор. Сегодня Forth не так популярен, но все равно это действительно крутой язык.
Другим широко используемым языком на основе стека является PostScript , который потерял значительную часть работы с PDF, но все еще широко используется в средах, где требуется визуализировать масштабируемую графику на различных платформах. Технически это язык программирования, полный по Тьюрингу, хотя мало кто его использует.