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


 

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

74152. Административно-правовые гарантии прав граждан 17.37 KB
  Формы обращения граждан за защитой: предложение рекомендация гражданина по совершенствованию законов и иных нормативных правовых актов деятельности государственных органов и органов местного самоуправления развитию общественных отношений улучшению социально-экономической и иных сфер деятельности государства и общества; заявление представляет собой просьбу гражданина о содействии в реализации его конституционных прав и свобод или конституционных прав и свобод других лиц либо сообщение о нарушении законов и иных нормативных правовых...
74153. Понятие, особенности и виды административно-правового статуса гражданина РФ, иностранных граждан и лиц без гражданства 17.08 KB
  Структура административноправового статуса: административная правоспособность способность быть субъектом административного права иметь права и выполнять обязанности административноправового характера; административная дееспособность способность лица своими личными действиями приобретать субъективные права и выполнять обязанности а также нести ответственность в соответствии с нормами административноправового характера; совокупность прав и обязанностей; ответственность; гарантии реализации прав и обязанностей. Виды...
74154. Административно-правовой статус иностранных граждан и лиц без гражданства 18.26 KB
  Лицо без гражданства лицо не являющееся гражданином Российской Федерации и не имеющее доказательств наличия гражданства иностранного государства. Для пребывания иностранных граждан и лиц без гражданства на территории Российской Федерации существуют национальный режим и режим наибольшего благоприятствования. Иностранные граждане и лица без гражданства пользуются в Российской Федерации правами и несут обязанности наравне с гражданами Российской Федерации кроме случаев установленных федеральным законом или международными договорами РФ ч.
74155. Основные права и обязанности граждан в сфере государственного управления 16.36 KB
  Виды прав граждан в сфере государственного управления: на участие в управлении государством как непосредственно так и через своих представителей; на поступление на государственную службу; на обращение в органы государственной власти органы местного самоуправления и к их должностным лицам как индивидуально так и коллективно; на свободу передвижения; на неприкосновенность личности; на неприкосновенность жилища; на объединение включая право создавать профессиональные союзы для защиты своих интересов; на проведение собраний митингов...
74156. Административно-правовой статус юридических лиц 19.53 KB
  В отношении общественных организаций запрещаются создание объединений преследующих незаконные цели и осуществление деятельности посягающей на здоровье и нравственность населения права и законные интересы граждан. Обязанности юридических лиц: общие необходимость соблюдения требований законодательства в своей деятельности; обязанность государственной регистрации создания реорганизации ликвидации юридических лиц внесения изменений в уставные документы; специальные регистрация прав на недвижимое имущество и сделок с...
74160. Исследование эффективности автоматического отключения питания в системе TN-C 69 KB
  При отсутствии нулевого провода А 31 Выводы по разделам Обеспечивает ли защитное заземление защиту от косвенного прикосновения в системе TNC и почему Да защищает путём снижения тока кз отводом в землю Возможно ли автоматического отключение питания при отсутствии нулевого провода и почему Результаты измерений При целом нулевом проводе...