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

Что легче — создать компьютер или написать для него программу? С ростом потребностей второе становится всё труднее и труднее. Тенденции таковы, что чаще «железо» делают так, чтобы сохранить преемственность от старых моделей. Посудите сами: на всех современных процессорах могут работать программы для 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.

***

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