Виртуализация приложений: История появления и перспективы дальнейшего развития

Знакомство c виртуализацией приложений

Сегодня термин виртуальная машина чаще всего ассоциируется с виртуализацией и гипервизорами. Но кроме этого, виртуальная машина – это также еще одна форма абстракции (стандартный способ разделения сущностей, успешно применяющийся в программировании и других технических дисциплинах). В этой статье рассматриваются две современные виртуальные машины c открытым исходным кодом: Dalvik - виртуальная машина, реализующая ядро мобильной ОС Android, и Parrot - виртуальная машина для эффективного выполнения приложений, написанных на динамических языках программирования.

M. Тим Джонс, инженер-консультант, Emulex Corp.

М. Тим ДжонсМ. Тим Джонс - архитектор встроенного ПО и, кроме того, автор книг Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (выдержавшей на данный момент второе издание), AI Application Programming (второе издание) и BSD Sockets Programming from a Multilanguage Perspective. Он имеет обширный опыт разработки ПО в самых разных предметных областях - от ядер специальных ОС для геосинхронных космических аппаратов до архитектур встраиваемых систем и сетевых протоколов. Тим - инженер-консультант Emulex Corp., Лонгмонт, Колорадо.



31.01.2012

Как связаться с Тимом

Тим является одним из наиболее популярных авторов портала developerWorks. Ознакомьтесь с другими статьями, написанными Тимом для developerWorks. Загляните в профайл Тима, чтобы связаться с ним, а также общайтесь с другими авторами и разработчиками в сообществе developerWorks.

Сравнение виртуализации платформ с виртуализацией приложений

Первые виртуальные машины (ВМ) (virtual machines – VM) были созданы компанией IBM 60 лет назад, как способ обеспечить множеству пользователей совместный доступ к большим дорогостоящим мейнфреймам. Хотя эта концепция до сих пор применяется в продуктах, выпускаемых компанией IBM, значение самого термина "виртуальная машина" стало значительно шире, и сегодня он встречается и в других областях, а не только в области виртуализации.

Появление виртуальных машин

Операционная система CMS (conversational monitor system – система диалогового монитора) была первой ОС с полной поддержкой виртуализации для ВМ. ОС CMS поддерживала полную виртуализацию и паравиртуализацию. В начале 70-ых годов IBM представила семейство виртуальных машин, которые могли запускать множество однопользовательских операционных систем поверх VMCP (VM control program – программа управления ВМ) – первой реализации гипервизора.

В 60-ые годы IBM занималась развитием виртуализации платформ (или систем). Этот тип виртуализации характеризуется тем, что нижележащая аппаратная платформа виртуализируется, чтобы обеспечить одновременный доступ к ней для множества пользователей и операционных систем.

Другой вариант использования ВМ обеспечивает состояние, при котором виртуальные системы не зависят друг от друга. Этот тип виртуализации называется виртуализацией приложений (или процессов), и в нем для приложения создается абстрактная "среда", делая его независимым от аппаратного окружения.


Особенности виртуальных машин для приложений

При виртуализации приложений виртуальные машины используются, чтобы обеспечить аппаратно-независимую среду для выполнения приложений. Пример такой виртуальной машины показан на рисунке 1. В верхней части располагается высокоуровневый язык, используемый разработчиками для создания приложений. С помощью компиляции код, написанный на высокоуровневом языке, превращается в промежуточное представление, так называемый объектный код. В обычной среде объектный код (независящий от аппаратного обеспечения) компилируется в бинарный машинный код для исполнения на аппаратной платформе. В виртуальной среде объектный код сразу интерпретируется абстрактной машиной с целью исполнения. Ключевым преимуществом подобного подхода является то, что объектный код можно запускать на любой аппаратной платформе, поддерживающей абстрактную машину (интерпретатор).

Рисунок 1. Виртуальная машина, обеспечивающая независимость приложений от платформы
Рисунок 1. Виртуальная машина, обеспечивающая независимость приложений от платформы

Кроме создания переносимой среды для запуска объектного кода, виртуализация приложений предоставляет среду, позволяющую изолировать ВМ от других приложений, запущенных на этой же системе. Эта возможность обеспечивает дополнительные преимущества, например, расширенное управление ресурсами и повышенный уровень безопасности.

В объектном коде ВМ, также называемом байт-кодом (bytecode), определен набор инструкций, которые будут выполняться интерпретатором. Термин байт-код возник благодаря реализациям, в которых виртуальные инструкции для большей простоты и производительности представлялись в виде отдельных байтов.

В следующих разделах статьи рассказывается о том, как виртуализация приложений применялась раньше, и какая область применения отводится ей сегодня.


История виртуальных машин

Один из первых случаев использования виртуализации приложений был зафиксирован в 60-ых годах прошлого века в продукте BCPL (Basic Combined Programming Language). Язык BCPL – это императивный язык программирования, разработанный Мартином Ричардсом (Martin Richards) в Кембриджском Университете. Этот язык был предшественником языка B, который впоследствии развился в язык C, не нуждающийся в представлении.

BCPL тогда и сегодня

Хотя язык BCPL появился в 1966 году, но благодаря Мартину Ричардсу он продолжает развиваться и сегодня. Первый BCPL-компилятор был написан для системы IBM7094 под управлением ОС CTSS (Compatible Time Sharing System), одной из первых операционных систем с разделением времени. Сегодня BCPL можно использовать на самых различных системах, включая Linux.

Хотя BCPL – это высокоуровневый язык (также, как и язык С), но промежуточный код, генерируемый компилятором, был назван О-кодом (объектным кодом). О-код может интерпретироваться на аппаратной платформе (например, с помощью виртуальной машине) или компилироваться в "родной" машинный код целевой системы. Эта возможность обеспечивает дополнительные преимущества с точки зрения независимости от аппаратной составляющей. Во-первых, благодаря абстрагированию О-кода от "материальной" составляющей, он может интерпретироваться на различных платформах. Во-вторых, О-код может быть скомпилирован в "родной" машинный код, что позволяет создать один компилятор для создания О-кода и множество компиляторов для трансляции О-кода в специфический машинный код (это упрощает постановку и реализацию задачи). Независимость от платформ делает язык BCPL переносимым между различными системами, что обеспечивает его доступность на самых различных платформах.

В начале 70-ых годов прошлого века в Университете Калифорнии в Сан-Диего был разработан способ исполнения скомпилированного кода на языке Pascal с помощью виртуальной машины. Это промежуточное представление, называемое p-код (p-code), позволяло абстрагироваться от нижележащего аппаратного обеспечения, что упрощало разработку компиляторов для языка Pascal (вместо использования архитектуры на основе абстрактного псевдо-компьютера). Язык Forth также использовал виртуальные машины, а именно архитектуры с адресацией нулевого уровня или основанные на стеке.

В 1972 лаборатория PARC компании Xerox представила язык Smalltalk, в котором для исполнения также использовалась виртуальная машина. Smalltalk был одним из первых языков, построенных на объектной модели. Язык Smalltalk и p-code оказали значительное влияние на Java - один из самых известных на сегодня языков программирования, также основанный на виртуальной машине. Язык Java, разработанный компанией Sun Microsystems, впервые появился в 1995 году и развил идею мульти-платформенного программирования с помощью виртуальной Java-машины (Java Virtual Machine – JVM). С того времени технология Java является фундаментальным компонентом корпоративных приложений. От сценариев на стороне сервера до апплетов на стороне клиента, технология Java способствовала популяризации технологий на основе виртуальных машин и внедряла новые подходы, объединяющие интерпретацию и исполнение "родного" машинного кода с помощью JIT-компиляции (just-in-time – точно в срок).

В других языках программирования также используются виртуальные машины. Язык Erlang, разработанный компанией Ericsson, использует виртуальную машину для запуска Erlang-байт-кода и интерпретации исходного кода Erlang в виде дерева абстрактного синтаксиса. Упрощенный язык Lua, разработанный в Католическом Университете Рио-де-Жанейро, включает в себя виртуальную машину на основе регистров. При запуске Lua-программы, она транслируется в байт-коды, которые затем исполняются в виртуальной машине. Далее в статье будет рассмотрен стандарт байт-кода, который может использоваться для любого языка.


Текущее состояние технологии виртуальных машин

Классический вариант использования виртуальной машины для абстрагирования от аппаратной составляющей в процессе развития охватил и область виртуализации приложений. В этом разделе рассматриваются современные решения open-source, которые, возможно, определят направления для дальнейшего развития виртуальных машин.

Виртуальная машина Dalvik

Виртуальная машина Dalvik – это технология open-source, разработанная компанией Google для операционной системы Android. Android – это модифицированное ядро Linux, включающее стек ПО для мобильных устройств (см. рисунок 2). В отличие от других виртуальных машин, использующих архитектуру на основе стека, в Dalvik используется архитектура на основе регистров (в разделе Ресурсы приведена дополнительная информация об архитектуре Dalvik и наборе инструкций). Хотя архитектуры, основанные на стеке, более просты и эффективны, они могут привести к новым трудностям, например, к увеличению размера программ из-за необходимости поддержки стека.

Рисунок 2. Архитектура стека ПО виртуальной машины Dalvik
Рисунок 2. Архитектура стека ПО виртуальной машины Dalvik

Так как Dalvik обеспечивает виртуализацию приложений, то он зависит от высокоуровневого языка, который компилируется в байт-код, понимаемый виртуальной машиной. Вместо того, чтобы в очередной раз изобретать колесо, Dalvik в качестве высокоуровневого языка для разработки приложений использует язык Java. Также в этой технологии имеется специальный инструмент dx для конвертации Java-классов в исполняемые модули для Dalvik ВМ. Для повышения производительности виртуальная машина Dalvik дополнительно оптимизирует исполняемые (dex) модули, используя JIT-компиляцию, которая переводит dex-инструкции в "родной" машинный код. Подобный процесс называется "динамической трансляцией" и является одним из способов повышения производительности виртуальных машин.

Как показано на рисунке 2, исполняемый dex-модуль вместе с экземпляром виртуальной машины изолируются в отдельном процессе в пользовательском пространстве Linux. Виртуальная машина Dalvik спроектирована так, чтобы поддерживать одновременное выполнение нескольких виртуальных машин в независимых процессах.

Технология Dalvik VM не использует стандартную среду исполнения Java и поэтому не связана соответствующими лицензионными ограничениями. Благодаря тому, что Dalvik является независимым приложением, эта технология распространяется под лицензией Apache 2.0.

Parrot

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

Изначально Parrot был спроектирован как среда исполнения для Perl 6, но его гибкая архитектура допускает запуск байт-кодов и других языков, как показано на рисунке 3. Parrot может принимать входные данные в нескольких форматах

  • PAST- абстрактное синтаксическое дерево (Parrot Abstract Syntax Tree), применяемое при написании компиляторов;
  • PIR – промежуточное представление (Parrot Intermediate Representation), высокоуровневый код, который может быть написан как человеком, так и компилятором в автоматическом режиме;
  • PASM – сборка (Parrot Assembly), расположенная ниже уровня PIR, но подходящая для использования пользователям и компиляторам.

Каждый из этих форматов транслируется в байт-код Parrot и выполняется виртуальной машиной Parrot.

Рисунок 3. Архитектура виртуальной машины Parrot
Рисунок 3. Архитектура виртуальной машины Parrot

Parrot поддерживает большое количество языков, но особенно интересна его возможность поддерживать одновременно статические и динамические языки, включая специальную поддержку функциональных языков. В листинге 1 приведен пример использования PASM. Для установки Parrot в дистрибутиве Ubuntu используется команда apt-get:

sudo apt-get install parrot

В листинге 1 приведен пример программы Parrot для манипуляции строками. Хотя Parrot выполняет этот код как отдельную сборку, он более функционален, чем обычные сборки. Инструкции Parrot используют синтаксис dest.src, поэтому в листинге 1 показывается, как текст загружается в строковый регистр. Инструкция length определяет длину строки и загружает её в целочисленный регистр. Инструкция print выводит значение аргумента в стандартный поток вывода (stdout), а инструкция concat выполняет слияние строк.

Листинг 1. Пример PASM-программы
$ more test.pasm
set	S1, "Parrot"
set	S2, "VM"
length	I1, S1
print	I1
print	"\n"

concat	S3, S1, S2
print	S3
print	"\n"

end

$ parrot test.pasm
6
ParrotVM
$

В разделе Ресурсы приведена ссылка на полный набор инструкций Parrot. Авторы Parrot предпочли минимализму богатый выбор функций, поэтому при создании компиляторов для виртуальной машины Parrot обычно не возникает никаких сложностей.

Несмотря на то, что в PASM используются высокоуровневые абстракции, PIR-программы еще более удобны для программистов, использующих языки высокого уровня. В листинге 2 приведен пример программы, написанной в PIR и выполняемой в виртуальной машине Parrot. В этом примере объявляет подпрограмма square, вычисляющая квадратный корень числа и возвращающая его. Этот процесс вызывается подпрограммой main, которая специально выделена идентификатором :main, чтобы Parrot запустил её первой. Подпрограмма main выведет результат работы PIR-программы.

Листинг 2. Пример PIR-программы
$ more test.pir
.sub square
  .param int arg
  arg *= arg
  .return(arg)
.end

.sub main :main
  .local int value
  value = square(19)
  print value
  print "\n"
.end
$ parrot test.pir
361
$

Parrot предоставляет среду с широкими возможностями для виртуализации приложений, которая может использоваться для разработки высокоэффективных приложений, не привязанных к конкретным платформам. Большое количество языков программирования, включая С, Lua, Python, Scheme и Smalltalk, поддерживают специальные надстройки для своих компиляторов, позволяющие генерировать код для виртуальной машины Parrot.


Другие способы применения виртуализации приложений

В статье были описаны известные примеры виртуализации приложений, включая новейшие разработки. Dalvik – это мощная среда для разработки приложений для современных мобильных устройств, a Parrot предлагает удобную среду для программистов, разрабатывающих компиляторы для статических и динамических языков. Но идея виртуализации приложений нашла применение и в других областях, которые не упоминались ранее.

Один из перспективных способов использования виртуализации приложений, возможно, работает прямо сейчас на вашем компьютере. Системы, использующие новый стандарт EFI (Extensible Firmware Interface – расширяемый интерфейс для микрокода), который должен заменить BIOS, могут использовать драйверы, в которых вызывается EBC (EFI Byte Code - EFI-байт-код). Микрокод компьютера включает в себя интерпретатор, который вызывается при загрузке образа EBC. Эта идея также реализована в технологии Open Firmware, разработанной компанией Sun Microsystems, в которой используется язык Forth, включающий собственную виртуальную машину.

Виртуализация приложений успешно применяется в области компьютерных игр. Многие современные игры используют сценарии, написанные на языках, исполняющих байт-коды (например, Lua), для управления поведением неигровых персонажей и другими аспектами игры. Но сама идея применить виртуализацию приложений в компьютерных играх возникла гораздо раньше.

Компания Infocom, разрабатывавшая текстовые приключенческие игры, например Zork, оценила перспективы мультиплатформенности ещё в 1979 году. Infocom создала виртуальную машину Z-machine, названную в честь игры Zork. Эта виртуальная машина облегчала перенос игр на другие архитектуры. Вместо миграции всей игры на новую платформу достаточно было перенести на нужную платформу только интерпретатор, представляющий Z-machine. Эта возможность значительно упростила процесс переноса игр на другие системы, которые могли поддерживать другие языки или вообще иметь абсолютно другую архитектуру. Хотя задачей Infocom было облегчить миграцию приложений между платформами, существовавшими в тот момент, эта работа было продолжена, и в конце сделала возможным запуск старых игр на новом поколении платформ, включая мобильные.

Другим примером использования виртуальных машин в области компьютерных игр может служить проект ScummVM, предоставляющий виртуальную среду исполнения для языка SCUMM (Script Creation Utility for Maniac Mansion – утилита для создания сценариев), разработанного в 1987 году в компании LucasArts для упрощения процесса разработки приключенческих игр. Сегодня ScummVM используется на различных платформах для запуска большого количества текстовых и графических приключенческих игр.


Заключение

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

Ресурсы

Научиться

  • Application virtualization, past and future: оригинал статьи (EN).
  • Ознакомьтесь со статьями, посвященными виртуализации и другими статьями Тима, представленными на портале developerWorks.
  • В Wikipedia представлены множество статей, позволяющих узнать больше о виртуальных машинах для виртуализации платформ и приложений. На странице virtual machines приведена информация о виртуальных машинах, а в статье p-code machines рассказывается о p-code машинах.
  • Язык BCPL, предшественник языков программирования B и С, был разработан в 1967 году Мартином Ричардсом. На сайте Project Mac можно прочитать руководство BCPL reference manual для первой версии BCPL. Также можно загрузить текущую версию BCPL с сайта проекта.
  • В технологии EBC определяется интерпретирующий уровень для переносимых драйверов компонентов. Дополнительную информацию о технологиях EBC и UEFI можно найти в статье Boot Loaders: Small, Fast System Initialization (Dr. Dobb's, сентябрь 2010).
  • Хотя технология Forth появилась в 70-ых годах, она по прежнему используется в качестве языка для виртуальных машин. Forth применяется в космической отрасли, встроенных системах, BIOS и других приложениях, работающих на ограниченных ресурсах. Дополнительную информацию о Forth можно найти на Web-сайте Forth Interest Group.
  • Следите за публикациями developerWorks в Твиттере, подпишитесь на канал твитов по Linux на developerWorks или присоединяйтесь к учетной записи Тима на Твиттер.

Получить продукты и технологии

  • Dalvik – это виртуальная среда исполнения для операционной системы Android. Эта технология была разработана Дэном Борнстейном (Dan Bornstein) и поддерживается Google как один из компонентов Android. Дополнительную информацию о Dalvik и его байт-кодах можно найти в документации пользователя. Также можно прочитать об этой технологии в статье Introduction to Android development (Frank Ableson, developerWorks, май 2009).
  • Parrot – это виртуальная машина, спроектированная для эффективного исполнения статических и динамических языков с помощью различных промежуточных реализаций на основе байт-кода Parrot. Технология Parrot относится к open-source ПО и может применяться с большим количеством языков. Дополнительную информацию о наборе инструкций, доступных в Parrot, можно получить на этой Web-странице.
  • Виртуализация приложений также популярна и в области разработки компьютерных игр. Один из первых примеров использования виртуализации приложений был представлен компанией Infocom в своих текстовых приключенческих играх (например, Zork). По указанным ссылкам можно узнать больше о виртуальной машине Infocom – Z-machine и интерпретаторах, существующих для различных платформ. Другой пример использования виртуальных машин для разработки компьютерных игр – проект Scumm, использованный в графических приключенческих играх компании LucasArts. Scumm реализован в виде open-source проекта ScummVM, который позволяет запускать старые игры на современных платформах.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы в первый раз заходите в developerWorks. Выберите данные в своем профиле (имя, страна/регион, компания) которые будут общедоступными и будут отображаться, когда вы публикуете какую-либо информацию. Вы можете изменить данные вашего ИБМ аккаунта в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=790573
ArticleTitle=Виртуализация приложений: История появления и перспективы дальнейшего развития
publish-date=01312012