Фирма Sun Microelectronics недавно выпустила первый Java-процессор - PicoJava I. Этот процессор разработан специально для наиболее эффективного выполнения байт-кодов языка Java. Очевидно, что прямое выполнение Java-команд устранит некоторые недостатки, присущие этой технологии.
До недавнего времени Java-программы запускались только на специальных интерпретаторах или компиляторах. В первом случае выполнение программы сильно замедляется, так как универсальный процессор тратит время на преобразование Java-программ в свой собственный код. В случае же компилирования “на лету” (Just In Time - JIT) увеличивается размер программы (раза в три или больше). Если компьютер имеет ограниченный объем памяти, то исполнение Java-программ может привести к серьезным проблемам.
Архитектура JavaChip, разработанная Sun Microelectronics, позволяет проектировать процессоры, оптимизированные для быстрого выполнения Java-программ в небольшом объеме памяти. Процессор PicoJava I использует систему команд, определенную спецификацией виртуальной Java-машины. Поскольку коды Java можно выполнять на новом процессоре без их предварительной обработки, то это позволяет избежать интерпретации или компиляции Java-программ.
Виртуальная Java-машина
Виртуальная Java-машина - основной механизм, определенный фирмой Sun, для управления Java-программами. Спецификация Java-машины полностью определяет систему команд Java, типы данных, обрабатываемых Java-машиной, и ее регистры. Поскольку большинство команд Java умещаются в один байт, то их часто называют байт-кодом. Для Java-машины определены следующие типы данных: byte - байт, short - двухбайтовые целые числа, integer - четырехбайтовые целые числа, long - восьмибайтовые целые числа, float - четырехбайтовые вещественные числа, double - восьмибайтовые вещественные числа, char - двухбайтовые символы, object - четырехбайтовая ссылка на объект, returnAddress - четырехбайтовый адрес возврата из метода,
а также следующие регистры: pc - счетчик команд, vars - регистр для доступа к локальным переменным, optop - указатель на стек операндов, frame - указатель на структуру окружения времени выполнения.
Байт-коды языка Java разрабатывались для обеспечения компактности программ. Это достигается с помощью небольшого количества регистров и использования указателей. Средняя команда для Java имеет длину всего 1,8 байта, а команды обычных RISC-процессоров - около 4 байт. Java-машина имеет стековую архитектуру, так как операнды передаются через регистр процессора “стек операндов”. Таким образом уменьшается длина команды, так как она занимает всего один байт, сопровождаемый (если необходимо) номером операнда - 0, 1, 2, 3 и т. д.
RISC-архитектура Java-процессора
При создании процессора, который эффективно реализует “в железе” виртуальную Java-машину, конструкторы PicoJava I использовали RISC-технологию, успешно применяемую специалистами фирмы Sun Microsystems в течение последних 15 лет. Процессор можно легко настроить на различную длину кэша команд и данных, а также включить или выключить вещественный вычислитель.
В ядре PicoJava I используется конвейерный принцип обработки команд. Процессор выполняет команду за три такта, зато одновременно могут обрабатываться сразу несколько команд. Однако PicoJava I выполняет за три такта не все команды, специфицированные в Java-машине. Некоторые из них реализованы как макрокоды или выражены через другие команды. Такая иерархия выполнения обеспечивает эффективную работу программ при сохранении компактности кода.
Во время работы процессора байт-коды Java сначала записываются в кэш команд, размер которого может меняться от нуля до 16 Кб. Хотя командный кэш в PicoJava I и меньше по размеру, чем в других RISC-процессорах, но общий эффект остается примерно таким же, так как в среднем Java-команда короче. Затем байт-коды передаются в буфер команд, который имеет размер 12 байт. Одновременно в него может быть записано не более 4 байт, а прочитано - 5 байт. Поскольку средняя длина команд составляет 1,8 байта, то за один такт в процессор может быть загружено сразу несколько команд. Пять начальных байт буфера команд могут быть декодированы и переданы на следующую стадию конвейера для дальнейшей обработки.
В процессоре есть стековый кэш, используемый для доступа к операндам и данным. Он является аналогом набора регистров, используемых в большинстве RISC-процессоров. Этот стек необходим для эффективной реализации Java-машины. Он может содержать указатели, целочисленные и вещественные данные, но получить доступ к его содержимому можно только в определенных точках.
В PicoJava I, как и в виртуальной Java-машине, все вычисления выполняются в стеке. Поэтому часто возникает ситуация, когда данные загружаются в стек непосредственно перед выполнением команды. Конвейер процессора отслеживает такую ситуацию и выполняет операции так, как будто данные ранее уже были загружены в стек. Это существенно ускоряет вычисления, так как команды записи данных в стек - самые распространенные.
PicoJava I имеет отдельный двухуровневый кэш данных, длина которого также может меняться от нуля до 16 Кб. В нем хранятся наиболее часто используемые данные. Все общение с внешними устройствами процессор выполняет через единый интерфейс ввода-вывода.
Производительность
Процессор PicoJava I разработан для наиболее эффективного выполнения Java-программ. Именно для этого были использованы конвейерная обработка команд, совместное их выполнение и стековая архитектура. Тесты на производительность PicoJava I показывают, что время и усилия, затраченные на разработку этого процессора, не пропали даром. В эталонных тестах PicoJava I работал в 15 - 20 раз быстрее, чем 486 с интерпретатором (с той же частотой), и в 5 раз быстрее Pentium с JIT-компилятором.
Язык Java разрабатывался специально для передачи по сетям. Именно поэтому программы, написанные на нем, очень компактны. А высокая производительность PicoJava I, его гибкие настройки и небольшая стоимость делают эту технологию наиболее приемлемой для развития сети. Появление Java-процессора открывает новые возможности для использования компьютерных сетей и интеграции различных платформ.
Валерий Коржов
К Валерию Коржову можно обратиться по адресу: oskar@get.msk.su.