HaikuVM: Java для микроконтроллеров

HaikuVM: Java для микроконтроллеров

Java на Raspberry Pi, Java на LEGO Mindstorms NXT контроллере. Но есть ли Java для еще меньшего формата? Да! Такое решение существует и называется HaikuVM.

Что же такое HaikuVM?

HaikuVM — виртуальная машина Java для микроконтроллеров, разрабатывалась сначала для микроконтроллеров семейства AVR (8-битные микроконтроллеры от Atmel), а также для платформы Arduino. Это продукт с открытым исходным кодом, доступен на SourceForge и расчитан по большей части на микроконтроллеры с малым ресурсом оперативной и Flash-памяти. HaikuVM придерживается традиций и, очевидно, почерпнула много из других виртуальных машин для микроконтроллеров, как, например, leJOSTinyVM), TakaTuka, Toba, bajos, Darjeeling, JC, SlimVM и NanoVM.

В особенности NanoVM наглядно показывает, что реализация виртуальной Java машины даже при наличии ограниченных ресурсов вполне возможна. К примеру, NanoVM и HaikuVM работают на микроконтроллере ATmega8 всего лишь с 8К flash-памяти и 1К оперативной памяти — в сравнении с тем же LEGO Mindstorms NXT контроллером это вообще миниатюрно. В отличие от NanoVM, в HaikuVM реализованы все без исключения байткод-операции Java 6-й версии. Поддерживаются также такие продвинутые возможности как многопоточность (в том числе и синхронизированная), обработка исключений и сборка мусора.

Hauikufy your World!

Как же работает HaikuVM? Она анализирует Java байткод и интерпретирует в С-конструкции. Эти конструкции вместе с Java машиной (HaikuVM тоже написана на С) компилируются для целевой платформы с помощью кросс-платформенного компилятора (в данном случае это avr-gcc). Этот процесс авторы называют «haikufying». Структуру этого самого «haikufying» можно посмотреть на картинке ниже.

HaikuVM: обзор

Чтобы не возникло недопонимания сразу отмечу: на микроконтроллер не загружается Java байткод и, как следствие, он не запускается на предустановленной на микроконтроллере виртуальной машине. Причина тому очевидна: виртуальная машина Java вместе с JRE, конечно же, непомерно большая для маленького микроконтроллера. Искусство HaikuVM заключается состоит в том, чтобы сделать предварительный анализ программы и сократить Java машину настолько, чтобы остались только действительно необходимые ее части. Если, например, в программе не используются типы double и float (а эти типы программисты микроконтроллеров зачастую недолюбливают), то скомпилированная для загрузки конкретного приложения Java машина не будет содержать в своем байткоде операций с типами double и float. Если же не используется многопоточность, то, соответственно, она тоже не войдет в скомпилированную версию.

Насколько нужна очередная Java «микромашина»?

Думаю, даже заядлые Java программисты не станут спорить с тем, что использование этого распространенного языка для микроконтроллеров, как минимум, странно. По крайней мере, гораздо привычнее видеть пару микроконтроллер-С или микроконтроллер-ассемблер. Тем не менее, из года в год рождаются все новые проекты, направленные на распространение Java в «микромир».

Идея HaiukuVM, на мой взгляд, вполне может найти конечного потребителя. Ведь порой проще купить микроконтроллер «побольше», дать задание программисту языка высокого уровня и на скорую руку «состряпать» конечный продукт широкого потребления (как это зачастую происходит с Arduino). Конечно же, для серьезной разработки, где каждый байт и каждое прерывание на счету, такой подход, мягко скажем, не востребован.

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