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


 

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

2252. Мероприятие: В стране невыученных уроков 19.84 KB
  Внеклассное мероприятие посвященное ко дню учителя, отображающее учеников которые не хотят учить уроки.
2253. Экономическая теория прав собственности 16.42 KB
  Современная экономическая теория получила развитие направление называемое неоинституционализм. Одним из важнейших направлений этого подхода является экономическая теория прав собственности. У истоков стоял такой известнейший экономист Рональд Коуз.
2254. Экономическое право 17.74 KB
  Право собственности на природные ресурсы. Право природного пользования. Правовые формы использования природных ресурсов.
2255. Строительная механика. Специальный курс. Применение метода граничных элементов 6.82 MB
  В учебном пособии изложен новый метод расчета статически определимых и статически неопределимых стержневых и пластинчатых систем на статические и динамические нагрузки, а также на устойчивость. Приведено большое количество характерных типовых задач и примеров с краткими указаниями к их решению. Значительное место уделено математической постановке задач и их решению с помощью персональных компьютеров.
2256. Гласные звуки. Деление слова на слоги. Слогообразующая роль гласных звуков 18.21 KB
  Цели: познакомить учащихся с понятием слог, научить детей делить слова на слоги, развивать речь, внимание, память, воспитывать трудолюбие, аккуратность в работе.
2257. День делового человека 19.55 KB
  Tasks: совершенствование навыков поискового чтения, активизация лексических навыков, развитие навыков постановки вопросов.
2258. Господарське право та господарське законодавство 17.96 KB
  Метою вивчення теми є розуміння студентами місця господарського права серед галузей права України, а також розуміння ними системи та специфіки господарського законодавства України.
2259. Повторяем грамматику. Местоимение 21.26 KB
  TASKS: повторение грамматического материала, контроль орфографических и лексических навыков, контроль навыков диалогической и монологической речи.
2260. Анализ современных дидактических концепций 18.35 KB
  Цель: способствовать формированию представления у студентов о современных дидактических концепциях.