Построение рабочего места Ruby on Rails-разработчика на базе IDE Netbeans
Design of Integrated Development Environment for Ruby on Rails Programmers Based on Netbeans PlatformУДК 004.4’22. 22.05.2017 Выходные сведения: Авторы: 1 студент 4-го курса бакалавриата по направлению «Информационные системы и технологии», ФГАОУ ВО Национальный исследовательский ядерный университет «МИФИ», Москва, Российская Федерация (115409, г. Москва, Каширское ш., 31), e-mail: sheludko.serg@gmail.com. 2 студент 4-го курса бакалавриата по направлению «Информационные системы и технологии», ФГАОУ ВО Национальный исследовательский ядерный университет «МИФИ», Москва, Российская Федерация (115409, г. Москва, Каширское ш., 31), e-mail: naumenko.mephi@gmail.com. 3 к.т.н., доцент кафедры финансового мониторинга, ФГАОУ ВО Национальный исследовательский ядерный университет «МИФИ», Москва, Российская Федерация (115409, г. Москва, Каширское ш., 31), e-mail: vyradygin@mephi.ru. Authors: 1 fourth year BA-student, specialty “Information systems and technologies”, National Research Nuclear University MEPhI (Moscow Engineering Physics Institute), Moscow, Russian Federation (115409, Moscow, Kashirskoe shosse, 31), e-mail: sheludko.serg@gmail.com. 2 fourth year BA-student, specialty “Information systems and technologies”, National Research Nuclear University MEPhI (Moscow Engineering Physics Institute), Moscow, Russian Federation (115409, Moscow, Kashirskoe shosse, 31), e-mail: naumenko.mephi@gmail.com. 3 Ph.D., assistant professor of dept. Financial Monitoring, National Research Nuclear University MEPhI (Moscow Engineering Physics Institute), Moscow, Russian Federation (115409, Moscow, Kashirskoe shosse, 31), e-mail: vyradygin@mephi.ru. Ключевые слова: Keyword: Аннотация: Annotation:
Введение На сегодняшний день разработка крупной коммерческой информационной системы невозможна без использования фреймворков или аналогичных им программных систем. Для каждого из популярных на сегодняшний день языков построения веб-ориентированных приложений существует целый спектр подобных средств. Например, высокую востребованность имеют следующие фреймворки: ASP.NET MVC Framework для языков программирования семейства .NET (таких, как C#, Visual Basic.NET, JScript.NET), Django для скриптового языка Python, Spring Framework для языка программирования Java, AngularJS для языка JavaScript и другие. В последнее десятилетие особо активное развитие демонстрирует фреймворк Ruby on Rails [1]. Согласно статистике Австралийского независимого агентства BuiltWith [2], фреймворк Ruby on Rails в той или иной мере лежит в основе десятой части самых посещаемых сайтов Интернета. Работы различных авторов подтверждают популярность данной системы, как за рубежом, так и в нашей стране. Например, перспективы использования Ruby on Rails в своих статьях рассматривают П. Вагстрём (P. Wagstrom) [3] и Д.Ю. Куприянов [4, 5], Вишванатан (Viswanathan) [6]. Особую популярность данной системы обуславливают три фактора: полноценная реализация MVC (Model-View-Controller) шаблона проектирования, базирование на современном языке программирования Ruby и универсальная поддержка взаимодействия с большинством популярных систем управления базами данных, включая как поддержку реляционных баз данных на уровне объектно-реляционного преобразователя (например, PostgreSQL, Oracle, MySQL и т.д.), так и поддержку NoSQL систем (например, MongoDB). Системы, базирующиеся на шаблоне проектирования MVC, обычно не ограничены одним языком разработки, а объединяют в своей основе целый пакет языков, начиная с языков разметки и заканчивая языками низкого уровня. В частности, крупное коммерческое Ruby on Rails приложение может включать в себя комбинацию языков SQL, Ruby, С (или C++) на уровне моделей, комбинацию языков Ruby и C (или C++) на уровне контроллеров, и комбинацию целой россыпи языков на уровне представлений (интерфейсной части), в том числе языки: Ruby, ERB, HAML, JavaScript, Sass, CSS, SCSS, CoffeeScript, LaTeX, MarkDown, YAML и т.д. Такое разнообразие программных средств накладывает серьёзные квалификационные требования не только на самих разработчиков, но и на их рабочее место. Использование несвязанных инструментов, таких как: текстовый редактор, компилятор, отладчик, система контроля версий и т.д. в такой ситуации невозможно. Потери большого количества времени, а, главное, концентрации разработчика, обусловленные переключением между компонентами, приводят к снижению общей эффективности программистов, как отдельных производственных единиц, так и целых трудовых коллективов. Оптимизировать процесс реализации проекта позволяет полноценное рабочее место, сформированное на основе интегрированной среда разработки (IDE). Интегрированные среды разработки в последнее время стали неотъемлемой частью рабочего процесса как разработчиков программного обеспечения, так и специалистов других областей науки и промышленности. Данная тематика подробно раскрыта в работах многих авторов. Например Х. Танк (H. Tunc) в своей работе [7] рассматривает вопрос разработки веб-ориентированного IDE для событийных приложений. Д. Лиу (D. Liu) исследует вопрос разработки IDE для микросервисного программирования [8]. Ф Кремона (F. Cremona) в своём исследовании [9, 20, 21] раскрывает особенности использования IDE при проектировании элементов приложений, использующих Mock-up-технологии. Большое внимание уделено интегрированным средам разработки и среди учёных других научных областей. Например, С Крупицер (C. Krupitzer) [10] показывает использование IDE для проектирования электронных схем, Л.-Е.И. Куадрадо (L.-E.I. Cuadrado) [11] – для обучения роботов, Б. Шётц (B. Schätz), [12] – для решения физических задач, С. Грун (Grun, C.) [13] – для решения задач нанотехнологий. Таким образом, вопрос использования интегрированных сред разработки для формирования рабочих мест разработчика и исследователя на сегодняшний день крайне актуален. С другой стороны, сегодня существует большое число программных продуктов предназначенных для обеспечения нужд Ruby on Rails-девелоперов. Все они в той или иной мере претендуют на роль полноценной среды разработки, формирующей рабочей место веб-программиста. К сожалению, все они обладаю рядом существенных недостатков. В частности, к таким программным продуктам можно отнести бесплатные системы NetBeans от компании Oracle и Aptana Studio (на основе Eclipse), редактор Atom с набором Ruby on Rails плагинов и коммерческую систему RubyMine от компании JetBrains. RubyMine является платной средой разработки и ориентирована исключительно на Ruby on Rails. Данная однобокость этого продукта не даёт возможности использовать его в проектах совмещающих технологию Ruby on Rails с другими современными технологиями, такими как, Java-фреймворки или C++-приложения. Более того, проприетарность данного продукта не позволяет крупным компаниям осуществить её доработку для собственных нужд. С бесплатными продуктами также есть ряд проблем. Aptana Studio больше не поддерживается на должном уровне. Редактор Atom не является средой разработки в своей основе, что затрудняет как работу с ним, так и его дальнейшее развитие. NetBeans не поддерживает ряд современных Ruby on Rails технологий, так как начиная с версии 7.0 модуль поддержки языка Ruby и фреймворка Ruby on Rails не входит в состав его стандартной сборки, а предоставляется в виде плагина. Таким образом, можно смело говорить о необходимости создания полноценного рабочего места Ruby on Rails-разработчика и его востребованности в мире. Из рассмотренных существующих систем некоторые являются универсальными и широко используются программистами при создании приложений на основе множества языков отличных от языка Ruby. Наибольший интерес среди них представляет среда разработки NetBeans, которая является одной из наиболее востребованных систем в мире [14]. При этом данная IDE является кросс-платформенной и поддерживает многие языки программирования и веб-технологии, используемые одновременно с Ruby on Rails в крупных проектах. Причём одной из ключевых особенностей этой среды является возможность написания собственного плагина для добавления ещё не поддерживаемого языка. Всё вышесказанное показывает возможность использования NetBeans как основы для построения полноценного рабочего места Ruby on Rails-разработчика, но не устраняет её недостатков. Среди них можно выделить два основных: отсутствие поддержки языка разметки HTML-представлений HAML и отсутствие поддержки средства формирования JSON-представлений JBuilder. Разработка данных языковых модулей и их последующая интеграция с уже существующими модулями поддержки языка Ruby и фреймворка Ruby on Rails позволит значительно повысить востребованность IDE NetBeans в среде Ruby on Rails разработчиков и даст возможность сформировать полноценное рабочее место современного веб программиста. Актуальность задачи определила необходимость разработки данных языковых модулей средствами программистов НИЯУ МИФИ. Разработка языкового модуля для IDE NetBeans Для реализации языковых модулей NetBeans были построены программные реализации лексического и синтаксического анализаторов [15]. Программная реализация должна была быть выполнена на базовом языке IDE NetBeans (Java) и встроена в полноценный плагин-проект. Особенную сложность при разработки данных плагинов определяет тот факт, что и HAML и JBuilder являются композициями нескольких языков. HAML по своей сути является композицией трёх языков Ruby, HTML и новых языков элементов, задаваемых самим HAML. JBuilder – это комбинация Ruby и новых элементов, определяемых самим JBuilder. Так как языки похоже, но HAML сложнее по своей структуре, то далее будем рассматривать только модуля для языка HAML. Схема взаимодействия лексического и синтаксического анализаторов показана на рисунке 1.
Рис. 1. Принципиальная схема анализа
Существуют два способа создания лексического и синтаксического анализаторов: самостоятельное описание алгоритма его работы на языке программирования и автоматическая генерация программного кода на основе формального описания языка с помощью специализированных программных средств. Для написания плагина поддержки языка HAML для NetBeans более приемлема автоматическая генерация анализатора, так как его самостоятельная разработка – процесс излишне трудоёмкий, затраты на который не оправдывают потенциальной выгоды (пользы) от разработанного языкового модуля. В качестве программного средства генерации синтаксического и лексического анализаторов использовался генератор нисходящих анализаторов [16] для формальных языков ANTLR [17]. Такой выбор был сделан по следующим причинам: ANTLR, в отличие от большинства альтернативных продуктов, таких как, например, Flex и Bison, предоставляет возможность генерации обоих анализаторов, и лексического (далее лексера) и синтаксического (далее парсера). Это позволяет использовать одно программное средство для решения обеих задач. Кроме того, одним из возможных целевых языков генерируемого кода ANTLR является язык Java, являющийся основным языком разработки плагины для NetBeans. Не менее важно, что ANTLR является широко используемым программным средством с подробной документацией и большим сообществом. Для реализации, непосредственно, HAML-плагина был выбран ANTLR версии 3.5.2. На данный момент существует более поздняя версия ANTLR – 4.5.3, но в ней отсутствует поддержка автоматического построения деревьев разбора [18], что затрудняет её использование для решения поставленной задачи. ANTLR генерирует код лексера и парсера на основе файла с расширением *.g. Синтаксис подобных файлов довольно прост, что делает их удобными для описания формального языка. Каждый g-файл начинается с ключевого слова grammar, определяющего название грамматики [19] (указывается сразу после него). Название грамматики должно совпадать с названием самого файла. Далее может идти блок опций, начинающийся с ключевого слова options. Доступный для ANTLR версии 3.5.2 ряд опций приведён в таблице 1. Таблица 1 Опции грамматики для ANTLR версии 3.5.2
Пример использования блока options показан на рисунке 2.
Рис 2. Пример использования блока options
После блока options могут идти блоки @header и @members. В блоке @header располагается код, который будет помещен в начало генерируемого файла. В блоке @members располагается код, который будет помещен в тело классов лексического и синтаксического анализаторов. При помощи конструкции @lexer:: и @parser:: можно задать @header и @members для лексера и парсера раздельно. Пример использования блоков @header и @members показан на рисунке 3. Блок @rulecatch позволяет заменить стандартное содержимое catch-раздела для каждого правила. Пример использования блока @rulecatch показан на рисунке 4. Правила лексического анализатора задаются в верхнем регистре и представляют из себя шаблоны идентификаторов токена. Правила синтаксического анализатора задаются в нижнем регистре и представляют из себя шаблон корректной последовательности токенов. Шаблоны задаются через двоеточие после названия правила, в конце ставится точка с запятой. Их синтаксис во многом основан на регулярных выражениях. При создании плагина использовались конструкции языка ANTLR, показанные в таблице 2. Таблица 2 Основные конструкции языка ANTLR
Рис 3. Пример использования блоков @header и @members
Рис 4. Пример использования блока @rulecatch
Некоторые правила лексера могут начинаться с префикса fragment. Такое правило будет являться вспомогательным и не будет обрабатываться как токен. Пример подобного правила показан на рисунке 5.
Рис 5. Пример вспомогательного правила
ANTLR позволяет работать не только с текущим символом или токеном потока, но и предоставляет возможность получения информации о символах и токенах, следующих за ним. Для лексического анализатора существует функция LA(n), которая возвращает символ, стоящий на n позиций впереди текущей. Для синтаксического анализатора есть аналогичная функция LT(n), которая возвращает токен, стоящий впереди текущей позиции на n токенов. Тип возвращаемого данной функцией значения – токен. Для получения идентификатора токена используется функция getType(), для получения лексемы – getText(). Идентификатор токена, находящийся на n позиций впереди текущего, также можно получить с помощью функции LA(n). Тип возвращаемого значения функций LA(n) и LT(n).getType()– целое число, присваиваемое токенам в соответствии с тем, какому правилу они удовлетворяют. Тип возвращаемого значения функции LT(n).getText() – строковая константа (String). Пример использования данных функций показан на рисунке 6.
Рис 6. Работа с последующими токенами Завершающей стадией процесса разработки лексического и синтаксического анализаторов является генерация их кода. Она осуществляется командой java (версия может отличаться): java -jar antlr-3.5.2-complete.jar Haml.g. После генерации каждому токену будет присвоен числовой идентификатор токена, поэтому понятие идентификатор токена разделяется на два новых понятия: числовой идентификатор и смысловой идентификатор. Последний хранит в себе идентификатор токена, указанный в g-файле.
Этапы создания HAML-плагина Разработка языкового HAML-модуля (далее плагина) была выполнена в несколько этапов. На первом этапе был создан каркаса плагина. Он был создан непосредственно в самой среде NetBeans, как проект модуля в категории «Модули NetBeans». Затем в данный проект была добавлена поддержка новых типов файла, соответствующего целевому языку. Для языка HAML это файлы с расширением «*.haml» В результате данного действия создаются файлы HamlDataObject.java, HamlTemplate.haml, HamlVisualElement.java, HamlVisualElement.form. На следующем этапе был создан новый слой XML, добавление которого повлекло за собой создание файла layer.xml, в котором позднее была задана структура проекта. Третий этап – это подключение ANTLR v.3. Для его корректной работы потребовалось подключить к проекту последнюю версию соответствующего jar-файла, которая может быть загружена с ресурса [22]. Четвёртый этап – это создание пакета antlr и размещение в нем файлов с кодом грамматики. Кроме того, был создан пакет lexer, реализующий классы, показанные в таблице 3. Таблица 3 Классы пакета lexer
Последний этап являлось задание цвета лексем, относящихся к введенным категориям. Для решения данной задачи был создан файл FontAndColors.xml, в котором были установлены связи между категориями и цветами.
Заключение В результате выполненных в НИЯУ МИФИ работ были разработаны, успешно протестированы и интегрированы в среду разработки NetBeans плагины поддержки языка HAML и средства подготовки JSON-представлений JBuilder. Разработанные плагины в совокупности с другими существующими плагинами поддержки фреймворка Ruby on Rails формируют полноценное рабочее место Ruby on Rails-программиста и позволяют значительно повысить эффективность разработки крупных веб проектов. Что, в свою очередь, позволяет использовать IDE NetBeans в качестве основной среды разработки веб-приложений на основе фреймворка Ruby on Rails. Пример работы разработанного плагина показан на рисунке 7.
Рис 7. Пример работы HAML-плагина
Рассмотренные в статье технологии независимы от выбора целевого языка и позволяют разрабатывать собственные языковые модули для широко спектра языков программирования. Что, в свою очередь, позволяет использовать такое мощное средство разработки, как IDE NetBeans для большинства современных задач программирования. Стоит отметить, что используемые программные продукты являются бесплатными и свободными, что позволяет беспрепятственно использовать их в коммерческих продуктах и значительно снижает затраты на разработку в целом. Библиографический список 1.Hartl M. Ruby on Rails Tutorial: Learn Web Development with Rails. – Addison-Wesley, 2015, – 707 с. References 1.Hartl M. Ruby on Rails Tutorial: Learn Web Development with Rails. – Addison-Wesley, 2015, – 707 p. |