В первой части нашего рассказа о виртуальных машинах и эмуляторах мы познакомились с классификацией виртуальных машин, изучили их достоинства и недостатки, познакомились со сравнениями виртуальных машин и обратили внимание на некоторые интересные эмуляторы. Теперь давайте изучим индустрию виртуальных машин, познакомимся с развитием, с перипетиями, ведь всё это довольно занятно и поучительно…
Что легче — создать компьютер или написать для него программу? С ростом потребностей второе становится всё труднее и труднее. Тенденции таковы, что чаще «железо» делают так, чтобы сохранить преемственность от старых моделей. Посудите сами: на всех современных процессорах могут работать программы для Intel 80386 (если не раньше). Прогресс даже в какой-то степени сдерживается тем, что трудно написать операционную систему и программы для нового компьютера/процессора — легче взять то, что было и постепенно наращивать потенциал. Так появились новые наборы команд, так двигались в развитии видеоадаптеры и прочая периферия.
Но какое отношение всё сказанное имеет к виртуальным машинам? Самое непосредственное. У многих исследователей и разработчиков появилась мысль создать ПО, которое бы работало на любых компьютерах с процессорами самых разных архитектур. Это решило бы не только вопросы переносимости, но и проблемы преемственности, оторвало бы программу от аппаратной платформы. А что для этого нужно? Правильно! Нужна прослойка между «железом» и ПО, которая, внося свой уровень абстракции, делает недоступными аппаратные ресурсы напрямую, но зато облегчает и упрощает доступ к ним.
Эту идею классически реализовала Sun в своей Java Virtual Machine (JVM — часть любой системы Java Runtime Environment (JRE). Смотрите, например в Java ME). Виртуальная машина исполняет не машкоды — она интерпретирует байт-код. Байткод не зависит от платформы. Он компактен и быстрее интерпретируется, чем программа «в исходниках».
Получается так, что Sun создала свою виртуальную среду в которой машкод — это байт-код. Эта среда более гибкая и универсальная, чем «железный» процессор. Эту среду можно эмулировать. И появление Java как раз пришлось на 90 годы двадцатого столетия, время, когда появились мощные процессоры, способные справиться с задачей эмуляции.
Сейчас на большинстве современных мобильных платформ установлена Java ME, включающая JVM. Любой мало-мальски продвинутый телефон способен запускать Java-игры. Многие серьёзные программы и среды проектирования пишутся на Java, чтобы обеспечить кроссплатформенность, а значит расширить область применения ПО. Пример тому — программа GanttProject из нашей коллекции бесплатных программ, раздел Офис. Это Java-программа. Она работает где угодно, — там, где можно установить соответсвующую ей Java VM.
Лавры победителей никогда не давали спокойно спать корпорации Microsoft. И если Sun разрабатывала Java с начала 90-х, а в середине 90-х выпустила в большой свет, то уже в 2000 году Microsoft дала свой ответ – .NET. Но и свободное сообщество тоже не дремлет. Родился проект Mono. Этот проект призван реализовать .NET на базе свободного ПО. Спонсор проекта – Novell.
Эмуляторы, позволяющие запускать компьютерные программы операционных системах, отличных от той, для которой они создавались, развиваются постоянно. Но самое широкое распространение они получили в среде Linux. Это закономерно: можно потратить силы на написание одного эмулятора, а потом пользоваться множеством программ Windows. Cedega, Wine, CrossOver – хорошо известные многим названия. Эти эмуляторы дают возможность расширить применяемость ПО в различных операционных системах.
Но людям хочется работать не только в иной операционной системе, но ещё и на другом компьютере, «компьютере в окне», отличном от том, на котором работают. Это позволят сделать виртуальные машины, напрмер Bochs, Parallels, QEMU, VMware. В «окошке» виртуальной машины можно установить любую ОС, а в ней уже запустить любую программу. В этом случае стираются границы не только на уровне операционных систем, но и на уровне аппаратных платформ. И если писать и отлаживать программу для Windows в Linux мягко говоря глупо и бессмысленно, то отлаживать драйвера для различных аппаратных систем не вставая со стула – вещь весьма полезная.
А теперь немного «крамолы» с точки зрения программистов.
Хочу продолжить тему виртуальных машин. «В железе». Я бы выделил семейство ARM как семейство ядер, подпадающих под вышеприведённую классификацию. По сути, ARM – универсальное ядро, универсальная виртуальная машина, которую используют многие производители для создания своих процессоров. Улавливаете смысл? Есть ядра x86, DSP, микроконтроллеров. Но все они привязаны к конкретной архитектуре, к конкретному набору периферии. Компания ARM же сделала великое дело – унифицировала ядро, создала «виртуальную машину в железе».
Это позволило запускать одни и те же программы на процессорах от различных производителей: Intel, Atmel, Cirrus Logic, NXP (Philips), Texas Instruments… На процессорах с разной периферией, с абсолютно разными порою аппаратными особенностями.
Разработчики и программисты в последнее время достигли просто вершин виртуализации. На «виртуальном» ядре ARM работает виртуальная машина Java. В помощь ей развивают технологии Jazelle, позволяющие ускорять Java на ARM.
Итак, мы увидели, что с развитием аппаратных возможностей расширились возможности создания виртуальных машин и эмуляторов. «Виртуалы» служат хорошую службу. Они расширяют возможности человека, связанные с примняемостью программного обеспечения на разных платформах, и наоборот, с применяемостью различных программ и ОС на одной платформе.
Я бы хотел поправить/уточнить некоторые утвеждения в этой статье.
> Многие серьёзные программы и среды проектирования пишутся на Java, чтобы обеспечить кроссплатформенность
К сожалению кроссплатформенность в JavaME (особенно когда это касается интерфейса пользователя и графики) вещь несуществующая. Каждый производитель телефонов изобретает свои библиотеки для своих же телефонов так что скажем игры написанные на JavaME для Mororola Accompli платформы не будут работать на Nokia. Приозводители телефонов уцепились за Java ME потому что это им позволяет давать разработчикам безопастный интерфейс для написания софта для телефонов. Безопастный в смысле того что код в Java VM теоретически не может навредить телефонной ОС. То что это не портируемый интерфейс их уже мало заботит. Вдобавок им теперь не надо потеть над тем чтобы производить SDK для разработчиков софта под их телефоны.
> По сути, ARM – универсальное ядро, универсальная виртуальная машина, которую используют многие производители для создания своих процессоров.
Ну это не совсем так. Никакой виртуальной машины там нет, ARM производит и лицензирует процессрные ядра (CPU cores) не в смысле железа а в смысле хардверного дизайна (спецификации ядра в виде Verilog программ итп). Все те компании что лицензируют эти ARM cores строят процессоры на базе этого ядра – добавляя свои ASIC и периферию. Но железо в ядре остается во всех реализациях одинаково как и система кодов. Так что это не виртуальная машина вовсе – это как тот FireFox с кучей плагинов: везде один и тот же но плагины разные
Кроме того ARM – RISC процессор так что у него нет традиционной микроархитектуры как в Интеловских CPU которая хоть как то похожа на виртуализацию.
Февраль 28, 2008 @ 17:02
2 Алексей Д :
Про кроссплатформенность для мобильных – да. То, что Вы сказали для JavaME – именно так. Соглашаюсь. Но на PC есть действительно кроссплатформенный софт. И такого много. «Java» и «JavaME», согласитесь, понятия разные. В статье (Вы сами цитировали) говорится именно о Java.
Про ARM говорил образно, рассматривая эволюцию ядер с точки зрения развития виртуальных машин.
По поводу «одинакового железа» – не соглашусь. Пример – процессоры PXA. Intel добилась от ARM разрешения на модификацию ядра (насколько я знаю, это единственный случай в практике). Именно поэтому до сих пор по большому счёту их PXA (теперь Marvell) вне конкуренции в своём сегменте.
Дело не в микроархитектуре и т.п. Дело вообще в самом принципе – использование схожего ядра в разных камнях. Это ядро универсально. Стало быть, его можно рассматривать как универсальную МАШИНУ для выполнения кода.
(Для кого-то эта машина – набор Verilog исходников, для кого-то – маска кремниевого дизайна, но суть с функциональной точки зрения одна.)
Февраль 28, 2008 @ 17:17
Блин, хорошо написано! Добавил в закладки.
Март 1, 2008 @ 21:58
Ая только пользуюся от майкрасофта эмулями
Март 3, 2008 @ 22:48
Переодически возникают проблемы с эмуляторами. Самая банальная как это ни странно недостаток мощностных ресурсов. Вот и дума либо эмуляторы меняй и другие пробуй, либо новую машину мощнее собирай.
Март 7, 2008 @ 9:41
2 Vladimir:
> В статье (Вы сами цитировали) говорится именно о Java.
Я цитировал ту часть которая находится в контексте где Вы говорите о JavaME и телефонах. Кроме того фраза «Любой мало-мальски продвинутый телефон способен запускать Java-игры.» мне например говорит о том что Вы Владимир ссылаетесь на Java и JavaME взаимозаменяемо. Почему собственно я и прокомментировал.
> По поводу “одинакового железа” – не соглашусь. Пример – процессоры PXA.
> Intel добилась от ARM разрешения на модификацию ядра (насколько я знаю, это
> единственный случай в практике). Именно поэтому до сих пор по
> большому счёту их PXA (теперь Marvell) вне конкуренции в своём сегменте.
А вот это неверно – Intel не добиласьразрешения а выкупила лицензию на StrongARM. В то время StrongARM был побочным продуктом ARM и Apple и Intel выкупил лицензию у обоих и развил платформу дальше. Apple пыталась в то время заниматься PDA и существующие ARM процессоры которые они использовали в первых нескольких генерациях своего Newton’a не тянули всю систему и то что Apple там надизайнил. Результатом стал StrongARM и Apple Newton MessagePad 2000. Потом Стив Джобс вернулся, свернул PDA бизнес и продал лицензию на StrongARM Intel’у.
Я не вижу что PXA вне конкуренции – они так же как АРМ лицензируют его разным фирмам (типа TI) и те производят PXA-подобные процессоры.
> Дело не в микроархитектуре и т.п. Дело вообще в самом принципе – использование
> схожего ядра в разных камнях. Это ядро универсально. Стало быть, его можно
> рассматривать как универсальную МАШИНУ для выполнения кода.
Ну с таким подходом – любой процессор можно так рассматривать. Любой дизайн проца на Verilog можно взять как базис нарастить всякой всячиной типа встроенных схем поддержки видео и выдать как новый процессор. Новаторство ARM было в том что у них это все модульно и просто. Но железо то все равно одно и то же – по крайней мере ядро (та же схематика, те же цепи и транзисторы). Рассматривать это как VM можно только на очень абстрактном уровне – но тогда тут любой CPU будет пожпадать под эту категорию.
Апрель 9, 2008 @ 17:57
Пожалуй соглашусь с Алексей Д, от себя добавлю хоть Java на РС вроде крос платформенная но появляются несовместимости уже самих версий Java, так что она не панацея, к нету это тоже относится, и если с процессорами все давольно стандартно производители в основном нацеливаются на максимально широкий охват жертвуй новомодными инструкциями и быстродействием, абсолютно та же «песня» и с Java и с Нетом обратная свместимость практически никакая а то еше и с новыми версиями фиговая если написали уж совсем изврашенно.
Апрель 15, 2008 @ 20:25