Глава 3. Реализация Разработка данной технологии проводилась в несколько этапов:
Описание дизайна языка асинхронных вызовов, расширяющих язык Java
Реализация этого языка в стиле try-catch
Осознание необходимости добавления в этот язык блока finally, реализация
Представление дизайна IDL для сообщений
Создание языка для сообщений
Поддержка удобства редактирования: проверка корректности кода, реализованы доступные действия для пользователя
Реализован генератор в язык Java с простейшим кодированием в JSON
Произведены исследования по оптимизациям данного кодирования в рамках JSON: пулы объектов, массивы без разделителей (так как известно как разбирать каждое сообщение в массиве), другие мелкие оптимизации
Составление дизайна языка для сервисов так, чтобы он был максимально простым. На данном этапе был произведен отказ от удаленных объектов и были выбраны именно сервисы
Реализован генератор сервисов в язык Java
Реализован первый тестовый сервер, который позволял проводить исследования
Был создан дизайн для исключений и произведена их реализация на сервере и клиенте
Далее были реализованы генераторы в язык Objective C [25], что позволило проверить корректность выбора дизайна
Введена возможность создавать абстрактные сервисы, поддержано наследование
Реализовано наследование сообщений: возможность наследовать поля, при этом при указании типа поля желательно указывать точный тип, а не тип предка: это позволит добиться ускорения кодирования и уменьшения объема сообщений
Произведена работа по реализации другого кодирования
Реализована возможность создавать события, тем самым уменьшая нагрузку на сервер и на сеть: не нужно делать однотипные запросы, чтобы узнать изменения системы
Проведение тестирования качества реализованной технологии
Интегрирование с проектом производилось по всему хожу работы
Выбор платформы Было решено, что данная технология должна быть реализовано с помощью метапрограммирования. Это позволяет вынести множество стереотипного кода в отдельные абстрактные функции, избавляет от необходимости писать один и тот же код по несколько раз, просто задав правила генерации. Таким образом, программа становится понятной и легкосопровождаемой, изменение части генерации требует лишь замены небольшого фрагмента генератора. Кроме того, практически всегда существует среда разработки для метапрораммирования, а это означает, что возможно динамически давать программисту подсказки, проверять правильность кода, создавать подсветку для синтаксиса, а так же пользоваться другими возможностями среды. Для рассмотренных реализаций RPC, которые поддерживают сразу несколько языков программирования, нет среды для разработки.
Именно по этим причинам был произведен отказ от написания на Java парсеров для IDL, а реализация производилась с помощью метапрограммирования. Платформой для этого был выбран MPS (Meta Programming System), которая была реализована JetBrains. Данная система позволяет:
Описывать концепты и их взаимосвязь
Описывать редакторы для них
Поддерживать систему типов
Поддерживать проверку правильности кода
Автоматически поддерживать подсказки
Создавать «горячие клавиши» для различных действий пользователя
Реализовывать отображения из одного языка в другой, т.е. из описанного нами языка создавать генераторы в другие
Кроме того основной проект, для которого требовалась система удаленного вызова процедур, большей частью был реализован на MPS, поскольку это помогает расширять стандартные механизмы языка Java: расширенные возможности коллекций, closure, расширения типов, более удобные тесты, возможность создавать другие расширения. При этом остается полная интеграция с языком Java: можно подключать сторонние библиотеки, использовать сторонний код, генерировать обычные java-классы и собирать их в библиотеки.
Разработка MPS была начала в 2003 году и сейчас работа продолжается. Однако данная технология уже стала применима в жизни. При работе с этой системой достаточно часто возникают различные трудности: некорректный разбор какого-либо случая, замедление работы при определенных ситуациях, а также другие мелкие проблемы. Однако они все решаются в кратчайшие сроки, так как есть система обратной связи и есть возможность зайти на трекер и добавить новую ошибку или пожелание к системе.
Система находится в состоянии разработки и не существует доступной и полной документации, так как набор функций постоянно меняется, производятся рефакторинги и прочие изменения. Поэтому к изучению данной системы приходится подходить основательно, практически невозможно найти готовое решение в точности поставленной задачи. Таким образом, написание языка требует изучения других реализованных языков, разборе исходных кодов, высокого уровня понимания алгоритмов работы MPS, а также понимание всех концепций метапрограммирования. Чтобы приступить к разработке серьёзного языка, требуется получить необходимый опыт, поскольку невозможно сразу же понять всех возможностей языка и всех альтернатив реализаций.
Некоторые разработчики сводятся к мнению, что программисту нужно строго знать, что и как делается, предоставление альтернатив мешает разработке кода. Однако в ходе работы с системой MPS было выяснено, что наличие различных подходов к решению одной и той же задачи позволяет лучше понять задачу и выбрать самое оптимальное решение для именно той задачи, которая стоит, а не для задачи похожей на шаблонную. Также разработка с помощью метапрограммирование вынуждает изучать существующие языки, синтаксисы, дизайны, решения, тем самым заметно расширяя кругозор разработчика и позволяя тем самым создавать наиболее оптимальные решения. Таким образом, изначальное время на изучение и понимание всех концепций занимает гораздо большее время, нежели изучение одного языка программирования, но скорость и качество разработки в дальнейшем намного выше, поскольку программист практически всегда заранее знает несколько возможных решений поставленной задачи.
Кроме того, использование данной системы не требует от программиста какой-то дополнительной настройки: изучение параметров, которые надо передать генератору в командной строке, написание конфигурационных файлов. Всё это сделано с помощью пользовательского интерфейса. Также есть возможность интегрироваться с системой контроля версий. Всё это позволяет разработчику меньше тратить времени на задачи, которые не связаны напрямую с программированием.
Таким образом, в ходе данной работы был получен опыт разработки языков, изучения множества других языков, а также опыт применения метапрограммирования для решения задач, требующих абстрактность.
|