77211

АКТОРНОЕ РАСШИРЕНИЕ ЯЗЫКА JAVA В СРЕДЕ MPS

Научная статья

Информатика, кибернетика и программирование

В качестве средства создания расширения была выбрана среда мета-программирования MPS что позволило автоматически получить интегрированные средства разработки для применения расширения и кроме того достичь совместимости с другими языковыми расширениями созданными в среде MPS. Название средства Совместимость расширений Языковая инфраструктура LISP Есть Нет Внутренние языки в Ruby Groovy Есть Нет XText frmework Нет Есть...

Русский

2015-02-02

243 KB

1 чел.

АКТОРНОЕ РАСШИРЕНИЕ ЯЗЫКА JAVA В СРЕДЕ MPS

Научный руководитель

ЖУКОВА АННА РУСЛАНОВНА МАЗИН МАКСИМ АЛЕКСАНДРОВИЧ

СПбГУ:  каф. Системного программирования, гр. 445 СПбГУ ИТМО:

аспирант

каф. Компьютерных технологий

Старший инженер-программист ООО "ИнтеллиДжей Лабс"

Ключевые слова: акторная модель, проблемно-ориентированное расширение, параллельное программирование, языково-ориентированное программирование

Аннотация Описанное в работе акторное расширение добавляет автоматически распараллеливающиеся функциональные конструкции в универсальный язык Java. Необходимость такого расширения вызвана слабой приспособленностью языка Java к написанию параллельных программ. Акторная модель, поддерживаемая расширением, успешно применяется в функциональном языке параллельного программирования Erlang. В качестве средства создания расширения была выбрана среда метапрограммирования MPS, что позволило автоматически получить интегрированные средства разработки для применения расширения и, кроме того, достичь совместимости с другими языковыми расширениями, созданными в среде MPS.

1 Введение

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

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

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

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

Акторная модель была предложена К. Хьюиттом, П. Бишопом и Р. Штайгером [] в 1973 году. Они ввели понятие актора – примитива параллельных вычислений, обладающего потоком выполнения и способного обмениваться сообщениями с другими акторами. Актор обрабатывает сообщения из собственной очереди сообщений и в ответ на них выполняет полезные действия.

Разработанное авторами языковое расширение позволяет использовать акторные конструкции при программировании на языке Java []. На рисунке 1 приведены примеры объявления типа актора, объявления сообщения, создания нового актора и посылки сообщения. Из рисунка видно, что такой код синтаксически почти не отличается от объявления класса, объявления метода, создания нового объекта и вызова метода в языке Java. Поэтому Java-программисту потребуются минимальные усилия для изучения синтаксиса акторного языкового расширения.

Рисунок 1. Пример синтаксиса

Традиционно создание языка или языкового расширения [] включает в себя разработку общей инфраструктуры языка: абстрактного и конкретного синтаксиса [], системы типов [], операционной семантики и т.д. Для этого реализуются лексический, синтаксический и семантический анализаторы, трансляторы и другие утилиты. Существуют различные инструменты, позволяющие частично автоматизировать эту деятельность [13].

В настоящее время для повышения эффективности труда программисты используют интегрированные среды разработки [], обладающие знаниями о языке программирования и значительно ускоряющие разработку. Поэтому создание нового языка предполагает также создание инфраструктуры среды разработки [] с редактором, автодополнением кода, подсветкой ошибок, рефакторингами, системами версионирования и др.

Помимо того, что эта задача сама по себе является ресурсоемкой и требует высококвалифицированных разработчиков, возникает проблема совместимости различных языковых расширений при использовании в рамках одной программы. Под совместимостью понимается возможность совместного использования  компонентов даже, если они  созданы независимо []. Например, различные библиотеки для языка Java совместимы, если их классы расположены в разных пакетах. Обеспечить совместимость языковых расширений несколько сложнее.

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

Название средства

Совместимость расширений

Языковая инфраструктура

LISP

Есть

Нет

Внутренние языки в Ruby / Groovy

Есть

Нет

XText framework

Нет

Есть

JetBrains MPS

Есть

Есть

Таблица 1. Существующие средства создания языковых расширений

Из приведенных средств лишь JetBrains MPS [, , ] одновременно позволяет создавать как совместимые языковые расширения, так и  языковую инфраструктуру для них.  Поэтому именно среда MPS была выбрана для создания акторного расширения языка Java. Среда MPS поставляется с большим количеством уже готовых языков и языковых расширений, поддерживающих дополнительные конструкции: коллекции, замыкания, регулярные выражения, работу с датами и др.

2 Основная часть

2.1 Actors Language. Основные понятия

Созданное авторами языковое расширение позволяет использовать акторы наряду с обычными объектами при программировании на языке Java. Декларация типа актора, поддерживаемая расширением, синтаксически совпадает с декларацией java-класса с той лишь разницей, что вместо ключевого слова «class» используется ключевое слово «actor». Для типа актора могут быть определены конструкторы, поля и объявления типов обрабатываемых сообщений. Синтаксис последних полностью совпадает с синтаксисом объявлений обычных методов в языке Java. Аналогично, синтаксис отправки сообщений актору не отличается от синтаксиса вызова методов у объекта. Но, в отличие от вызова методов, отправка сообщений происходит асинхронно:  сообщения помещаются в индивидуальную очередь актора и последовательно актором обрабатываются.

Содержание потока в языке Java – ресурсоемкий процесс, поэтому для обработки сообщений актору не выделяется отдельный экземпляр класса «java.lang.Thread». Вместо этого отправка всех сообщений всем акторам происходит посредством добавления сообщений в очередь общего диспетчера. Диспетчер обладает пулом потоков [], размер которого либо задается программистом явно, либо вычисляется исходя из числа доступных ядер в системе. По мере появления новых сообщений в очереди диспетчера и освобождения потоков из пула, сообщения последовательно извлекаются из очереди для обработки акторами.

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

На рисунке 2 приведен пример объявления двух типов акторов: «Ping» и «Pong». При отправке актору «Ping» сообщения «start», между акторами начинается обмен сообщениями «ping» и «pong». После отправки, заданного параметром «pingCount», числа сообщений актор «Ping» отправляет актору «Pong» сообщение «stop» и прекращает работу. В ответ на сообщение «stop» актор «Pong» также завершает работу.

Рисунок 2. Пример объявления акторов

Для запуска обмена сообщениями необходимо создать акторы «Ping» и «Pong» и отправить актору «Ping» сообщение «start». Код, выполняющий эти действия, и результаты работы этого кода приведены на рисунке 3.

Рисунок 3. (а) Запуск обмена сообщениями между акторами и (б) вывод программы

2.2 Вызов метода с задержкой

Созданное авторами языковое расширение также поддерживает посылку сообщения с задержкой. Для этого была введена операция «defer», применяемая к соответствующему сообщению актора и принимающая в качестве параметра величину задержки в виде выражения на языке MPS для работы с датами и временем Dates: «5 minutes», «1 year» и др.

Синтаксис вызова метода с задержкой выглядит следующим образом: «имя_метода(параметры).defer(величина_задержки)».

Для того, чтобы в примере, рассмотренном в разделе 2.1, актор «Pong», получив от актора «Ping» сообщение «ping», отправлял ответное сообщение «pong» не сразу, а через 5 миллисекунд, достаточно заменить посылку «ping.pong()» на «ping.pong().defer(5 milliseconds)», как показано на рисунке 4.

Рисунок 4. Отправка сообщения с задержкой

После запуска измененного в соответствии с рисунком 4 приложения вывод каждой следующей строки «Ping: pong» произойдет с задержкой.

2.3 Отложенный результат

Для добавления возможности обработки результата асинхронных методов акторов, в языковое расширение введен специальный тип – «deferred». «Deferred» — это отложенный результат, результат выполнения, который станет известен через некоторое время (в момент завершения асинхронного метода). Результатом, хранящимся в «deferred», может быть произвольное значение (успешное выполнение) или ошибка (исключение), произошедшая во время исполнения асинхронного метода. Именно в «deferred» оборачиваются результаты, возвращаемые асинхронными методами акторов: метод актора, объявленный возвращающим значение типа «String», при вызове вернет значение типа «deferred<String>», а метод, не возвращающий значения: «void», вернет «deferred<void>». «Deferred» позволяет подписаться на результат: кроме результата он хранит цепочку обработчиков: обработчиков значения (callback) и обработчиков ошибок (errback). Для добавления обработчиков к «deferred» введены операции «addCallback» и «addErrback», принимающих в качестве параметра сам обработчик в виде выражения на языке MPS для работы с замыканиями Closures: «{тип_параметра имя_параметра => [обработка]}», где тип параметра – тип объявленного возвращаемого значения метода для обработчика результата и тип обрабатываемого исключения для обработчика ошибки.

Примером использования «deferred» может послужить программа-редактор, работающая с графами, позволяющая рисовать графы на экране, сохранять их в файл в формате xml [20] и отображать считанные из файла. На рисунке 5 показан актор «GraphReader», читающий xml-файл, в котором хранится граф, и строящий по нему модель «GraphModel». Метод «read(File f)» актора «GraphReader» принимает в качестве параметра файл, где хранится граф. Метод выполняется асинхронно и может бросать исключения «SAXException» и «IOException».

Рисунок 5. Актор GraphReader

На рисунке 6 показана часть программы, использующая результат чтения актора «GraphReader». С помощью операции «addCallback» к результату добавлен обработчик, в случае удачного выполнения метода «read(new File(“./graphmodel.grph”))» отображающий граф на экране. С помощью операции «addErrback» обрабатывается исключения IOEXception.

Рисунок 6. Добавление обработчиков

Обработчиков значения и ошибок для одного «deferred»-результата может быть несколько. Результат, возвращаемый обработчиками, также оборачивается в «deferred» и к нему могут быть добавлены собственные обработчики.

3 Заключение

Созданный авторами язык Actors Language расширяет язык Java одной из распараллеливающихся функциональных конструкций – акторной моделью. В качестве актора выступает разновидность java-класса, методы которой вызываются асинхронно. Асинхронный метод  может быть вызван с задержкой (при помощи операции «defer»). К отложенному результату асинхронных методов могут быть добавлены обработчики, которые выполнятся, когда результат станет известен.

Язык Actors Language совместим с другими языковыми расширениями среды MPS.

В дальнейшем планируется добавить к возможностям языка асинхронный ввод / вывод, автоматическое распараллеливание операций над коллекциями, а также упростить синтаксис использования отложенного результата, скрыв конструкцию «deferred» от пользователя, позволив ему оперировать с результатами акторных методов так же, как с результатом любого метода java-класса, что проиллюстрировано на рисунке 7.

Рисунок 7. Упрощение синтаксиса

Текущая версия языка Actors Language хранится в репозитории языков MPS: http://www.jetbrains.net/confluence/display/MPS/Actors+Language.

Литература

  1.  S.V. Adve et al. (November 2008). "Parallel Computing Research at Illinois: The UPCRC Agenda" (PDF). Parallel@Illinois, University of Illinois at Urbana-Champaign. "The main techniques for these performance benefits – increased clock frequency and smarter but increasingly complex architectures – are now hitting the so-called power wall. The computer industry has accepted that future performance increases must largely come from increasing the number of processors (or cores) on a die, rather than making a single core go faster."
  2.  В.В.Воеводин, Вл.В.Воеводин Параллельные вычисления-СПб.: БХВ-Петербург, 2002.
  3.  Себеста Р. Основные концепции языков М.: Вильямс, 2001.
  4.  Одинцов И. О. Профессиональное программирование. Системный подход. – 2-е изд. перераб. и доп. – СПб.: БХВ-Петербург, 2004.
  5.  Непейвода Н.Н. Стили и методы программирования. М.: Интернет-Университет Информационных технологий, 2005. 
  6.  Duffy J., Essey E. Running Queries On Multi-Core Processors. // MSDN Magazine. 2007, October http://msdn.microsoft.com/en-us/magazine/cc163329.aspx 
  7.  Hewitt C., Bishop P., Steiger R. A Universal Modular Actor Formalism for Artificial Intelligence. // Proc. of the Third Int. Joint Conf. on AI (IJCAI-73). – Stanford, CA: Stanford University: 1973. – P. 235–245. 
  8.  Armstrong J. Programming ERLANG: Software for a Concurrent World. Pragmatic Bookshelf, 2007.
  9.  Eckel B. Thinking in Java. NJ: Prentice Hall, 2006.
  10.  Дмитриев С. Языко-ориентированное программирование: следующая парадигма. //RSDN Magazine. 2005. №5. http://www.rsdn.ru/article/philosophy/LOP.xml. 
  11.  Ахо А., Сети Р., Ульман Дж. Компиляторы. Принципы, технологии, инструменты. М.: Вильямс, 2003.
  12.  Luo Z. Computation and Reasoning: A Type Theory for Computer Science. Oxford University Press, 1994.
  13.  Parr T. The Definitive ANTLR Reference: Building Domain-Specific Languages. The Pragmatic Programmers, 2007.
  14.  Fowler M. PostIntelliJ http://martinfowler.com/bliki/PostIntelliJ.html
  15.  Fields D. K., Saunders S., Belyaev E. IntelliJ IDEA in Action. Manning Publications, 2006. 
  16.  Solomatov K. DSL Adoption with JetBrains MPS http://architects.dzone.com/articles/solving-problem-dsls-adoption
  17.  Fowler M. A Language Workbench in Action – MPS http://martinfowler.com/articles/mpsAgree.html
  18.  Фаулер М. Языковой инструментарий: новая жизнь языков предметной области http://www.maxkir.com/sd/languageWorkbenches.html
  19.  Гетц Б. Теория и практика Java: Пулы потоков и очередь действий http://www.ibm.com/developerworks/ru/library/j-jtp0730/index.html
  20.  Сергеев А. П. HTML и XML. Профессиональная работа. — М.: «Диалектика», 2004. 

PAGE   \* MERGEFORMAT 1


 

А также другие работы, которые могут Вас заинтересовать

33395. АЛУ ОМК КР1816ВЕ51 30.5 KB
  АЛУ состоит из регистра аккумулятора двух программнонедоступных регистров Т1 и Т2 предназначенных для временного хранения операндов сумматора дополнительного регистра В регистра слова состояния программы ССП схемы десятичной коррекции и схемы формирования признаков. Важной особенностью АЛУ является его способность оперировать не только байтами но и битами. Таким образом АЛУ может оперировать четырьмя типами информационных объектов: булевскими 1 бит цифровыми 4 бита байтными 8 бит и адресными 16 бит.
33396. Признаки регистра ССП КР1816ВЕ51 38.5 KB
  В таблице приводится перечень флагов ССП даются их символические имена и описываются условия их формирования. Формат регистра слова состояния программы ССП Символ Позиция Наименование и назначение флага C PSW.7 Флаг переноса.6 Флаг вспомогательного переноса.
33397. Граф возможных вариантов пересылки … КР1816ВЕ51 31 KB
  Возможны следующие виды пересылки: пересылка в аккумулятор из регистра и пересылка в регистр из аккумулятор; пересылка в аккумулятор прямоадресуемого байта и пересылка по прямому адресу аккумулятора; пересылка в аккумулятор байта из РДП и пересылка в РДП из аккумулятора; пересылка в регистр прямоадресуемого байта и пересылка по прямому адресу регистра; пересылка прямоадресуемого байта по прямому адресу; пересылка в аккумулятор байта из ВПД и пересылка в ВПД из аккумулятора; пересылка в аккумулятор байта из расширенной ВПД и пересылка в...
33398. Структура РПП и ВПП КР1816ВЕ51 28.5 KB
  Организация памяти в микроконтроллере иллюстрируется рисунке Память программ имеет 16битовую адресную шину ее элементы адресуются с использованием счетчика команд PC или инструкций которые вырабатывают 16разрядные адреса. Память программ доступна только по чтению. ОМЭВМ не имеют команд и управляющих сигналов предназначенных для записи в память программ.
33399. Структура РПД и ВПД КР1816ВЕ51 27.5 KB
  Организация памяти в микроконтроллере иллюстрируется рисунке Память данных делится на внешнюю и внутреннюю каждая из них имеет свое пространство адресов. В архитектуре MК51 пространство адресов внутренней памяти данных объединяет все внутренние программно доступные ресурсы. Это пространство размером 256 байт в свою очередь делится на пространство адресов внутреннего ОЗУ резидентная память данных РПД размером 128 байт и пространство адресов регистров специальных функций.
33400. Порты ввода-вывода КР1816ВЕ51 34.5 KB
  Каждый порт содержит управляемые регистрзащелку входной буфер и выходной драйвер. Выходные драйверы портов 0 Р0 и 2 Р2 а также входной буфер Р0 используются при обращении к внешней памяти ВПП и ВПД.5 Вход таймера счетчика 1 или тест – вход.4 Вход таймера счетчика 0 или тест – вход.
33401. Таймер/Счетчики КР1816ВЕ51 30 KB
  Для управления режимами работы Т С и для организации взаимодействия таймеров с системой прерывания используются два регистра специальных функций РРТС и РУСТ. РРТС определяет включение и выключение T C а также их режимы работы. Используются четыре режима работы Т С. Режим 0.
33402. Образ организации-работодателя 15.43 KB
  Профиль восприятия или имидж предприятия как работодателя в персоналмаркетингеmix называют персоналимиджем personlimge. Персоналимидж организации управляет поведением кандидата на наем ищущего работу. Сначала персоналимидж влияет на решение кандидата: можно ли вообще рассматривать организацию как работодателя. Если организация в итоге потенциальной для найма определяется то персоналимидж свое решающее влияние может оказать на претендента в процессе собеседования в результате которого у кандидата на должность сформируется...
33403. КОНСТРУКТИВНЫМ КОНФЛИКТ 45 KB
  Чтобы конфликт начал разрастаться нужен инцидент т. По значению конфликты делятся на конструктивные созидательные и деструктивные неконструктивные разрушительные. КОНСТРУКТИВНЫМ КОНФЛИКТ бывает тогда когда оппоненты имея собственную позицию не выходят за рамки этических норм деловых отношений и разумных аргументов.