Translate this page:
Please select your language to translate the article


You can just close the window to don't translate
Library
Your profile

Back to contents

Cybernetics and programming
Reference:

Semantic code editing in intelligent IDEs

Vanyasin Nikita Vadimovich

graduate student, Department of Informatics and Computer Systems, Volga State Technological University

424000, Russia, respublika Marii El, g. Ioshkar-Ola, ul. Ploshchad' Lenina, 3, aud. 522

nikita.vanyasin@gmail.com

DOI:

10.7256/2306-4196.2017.1.18881

Received:

20-04-2016


Published:

22-03-2017


Abstract: The article presents description of the method of semantic editing and a overview of current research in this field. The overview is presented in terms of dividing the views of the software system into the abstract, editable, executed, stored and visual parts. Tools and methods that allow increasing the productivity of software development are always relevant. There are various integrated development environments (IDEs), which combine different methods to significantly increase the productivity of the programmer in comparison with the work without IDE. One of the promising methods is the semantic editing of the program code of the developed system allowing changing the abstract representation of the software through various editable views. The author concludes that currently there are no universal integrated software development environments with semantic editing of program code. The development of such environments could significantly increase the productivity of the programmer in comparison with the work without IDE due to the semantic editing and the function of the version control system that tracks not text changes, but changes in the abstract code model.


Keywords:

semantic editors, projectional editor, programming environments, linguistic tools, human-computer interaction, IDE, version control systems, code generation, user interfaces, software development


Введение

Для разработчиков программного обеспечения важна высокая производительность при написании исходного кода. При этом часто используют интегрированные среды разработки (ИСР), которые позволяют существенно повысить производительность по сравнению с использованием набора отдельных компонентов: редактора, компилятора, отладчика и т. п. Высокая производительность при использовании ИСР достигается за счет тесной связанности перечисленных компонентов. Однако большинство современных ИСР представляют лишь несколько более функциональный текстовый редактор, обеспечивающий подсветку синтаксиса, возможность автоматического дополнения и другие методы – набор связанных возможностей, которые призваны сократить время, и помочь в написании кода без ошибок и с большей эффективностью. Эти возможности могут быть представлены в виде всплывающих подсказок, автоматической корректировки, различных полей со списками и смарт-тегов.

Представим обычный сценарий, знакомый многим разработчикам: после внесения небольшого изменения в исходный код программы при помощи текстового редактора или ИСР, компилятор показывает множество ошибок компиляции. Однако часто компиляторы не могут точно определить корень действительной ошибки. Основной рабочий сценарий – внести изменения, запустить компилятор, проверить наличие ошибок сборки – практически не изменился со времен эры перфокарт. Можно описать этот сценарий более точно: мы начинаем с абсолютно не ограниченного ввода текста в редакторе исходного кода, после чего посылаем эти введенные строки в компилятор, который производит разбор текста и осуществляет семантические проверки. В основном, такие строки являются не корректными (с точки зрения исходного кода) и не проходят компиляцию. А компиляция при этом может занимать значительное время, особенно в больших проектах.

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

Примерами сред, в которых используется семантическое редактирование, являются Unison, JetBrains Meta Programming System, Whole Platform.

Обзор существующих проектов с поддержкой семантического редактирования кода

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

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

Платформа состоит из трех основных компонентов:

  1. Типизированный, функциональный язык программирования Unison
  2. Семантический редактор, с поддержкой web
  3. Unison Node: реализация компилятора и программного интерфейса для языка Unison.

Исходный код программ Unison редактируется в семантическом редакторе, который гарантирует, что программы будут сформированы семантически правильно. Отсутствуют какие-либо ошибки разбора исходного кода или ошибки несовпадения типов, т.к. редактор не позволяет их допустить. Пользователь редактора мгновенно получает обратную связь от компилятора языка в виде форм поиска и автоматического дополнения [10].

JetBrains Meta Programming System [12] представляет собой language workbench для разработки языков программирования. Она позволяет определять новые языки, как общего назначения, так и специфичного для предметной области. Данная среда полностью основана на семантическом редактировании кода, кроме того доступны нетекстовые синтаксические формы, включая таблицы и математические символы [1].

Термин language workbench представлен Мартином Фаулером в 2005 году [7][9]. В его статьях он определен как инструмент со следующими характеристиками:

  1. Пользователи могут свободно определять языки, которые могут быть интегрированы друг с другом.
  2. Первичным источником информации является абстрактное представление исходного кода.
  3. Языки предметной области определяются тремя частями: схема, редактор и генератор.
  4. Пользователи языка управляют языком предметной области через семантический редактор.
  5. Language workbench может хранить неполную или противоречащую информацию.

Наиболее важной характеристикой семантического редактора является то, что весь текст, символы и любые графические элементы языка проецируются в абстрактное (семантически корректное) представление. JetBrains MPS полностью соответствует описанию language workbench. Редактор является семантическим: редактирование текста полностью заменено редактированием абстрактного представления программы [2].

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

Основными преимуществами данного инструмента являются:

  1. Компонуемые модульные языки в декларативном стиле с межязыковой интеграцией;
  2. Множество компонуемых и подключаемых типов для каждого из языков;
  3. Различные модели запуска: интерпретация, динамическая компиляция, и генерация кода;
  4. Множество стилей определения поведения: правила, запросы, аспектно-ориентированное программирование, шаблоны;
  5. Множество стилей внешнего представления исходного кода: графический, таблицы, деревья, математические символы, текст.

Описанные системы ориентированы в первую очередь на разработку предметно-ориентированных языков, что является только узкой областью прикладного программирования. То есть описанные системы не являются универсальными. Кроме того, семантические редакторы этих систем обладают не слишком удобным пользовательским интерфейсом (в первую очередь из-за ориентации на предметно-ориентированные языки).

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

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

Способ семантического редактирования программного кода в интегрированных средах разработки приложений

Воспользуемся следующей терминологией для описания программного проекта с помощью различных представлений [8]:

  1. Редактируемое представление: что редактируется для изменения программного проекта
  2. Хранимое представление: сохраненная запись определения программного проекта
  3. Исполняемое представление: что выполняется для запуска программного проекта
  4. Абстрактное представление: используется для управления и описания программного проекта. Может включать в себя абстрактное синтаксическое дерево, объектное представление программного кода в памяти, граф потока выполнения и т. д.
  5. Визуальное представление: не редактируемое представление программного проекта

Классическим подходом назовем подход с редактированием исходного кода, когда совпадает и редактируемое, и хранимое представление. Программный проект запускается путем трансформирования исходного кода в выполняемое представление. Чтобы это сделать, компилятор или интерпретатор переводит сначала исходный код в абстрактное представление. Это абстрактное представление временное, и существует только во время компиляции. При таком классическом подходе исходный код является главным представлением программного проекта.

classic

Рисунок 1 – Классический способ редактирования

В предложенном методе семантического редактирования, главным представлением программного проекта является абстрактное. Программная среда управляет абстрактным представлением и проецирует его во множество редактируемых представлений для программиста, чтобы он мог внести изменение в описание системы. Программная среда сохраняет абстрактное представление в хранимое представление, которое никак не связано с редактируемым представлением. Исполняемое представление получается через серию преобразований абстрактного представления.

new

Рисунок 2 – Семантический способ редактирования

Основная разница между классическим редактированием кода и семантическим заключается в разделении хранимого представления и редактируемого. Программные среды с семантическим редактированием могут использовать совершенно любой способ сохранения абстрактного представления, в отличии от классических системы, которые обязаны использовать некоторый универсальный механизм хранения (обычно - текстовый).

Абстрактное представление может быть отредактировано через множество различных проекций, каждая из которых не обязательно отображает всю информацию о системе, таким образом может быть использовано более упрощенное представление. К примеру таблицу, которая выглядит как таблица гораздо проще редактировать, чем таблицу, которая записана как часть программного кода (в котором обычно надо использовать служебные символы и синтаксические конструкции для описания таблицы) [6].

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

Заключение

На основе исследования существующих проектов семантического редактирования исходного кода предложен способ редактирования, обеспечивающий повышение эффективности формирования программных систем при минимальном количестве правок. Ключевой особенностью данного способа является разделение абстрактного и редактируемого представлений программной системы. Это разделение позволяет создавать несколько редактируемых представлений одного и того же компонента программы, повышая удобство использования интегрированной средой. Кроме того, система контроля версий в данном случае будет следить за семантикой изменений абстрактного представления программы, что упрощает разрешение конфликтных ситуаций в процессе слияния (merge). Разработка прототипа семантического редактора и основных примитивов редактирования исходного кода, ориентирована на реализацию функции контроля версий исходного кода, отслеживающей не текстовые изменения, а изменения абстрактной модели программного кода.

References
1. Voelter M., Solomatov K. Language Modularization and Composition with Projectional Language Workbenches illustrated with MPS (2010)
2. Pech V., Shatalin A., Voelter M. JetBrains MPS as a tool for extending Java PPPJ '13 Proceedings of the 2013 International Conference on Principles and Practices of Program-ming on the Java Platform: Virtual Machines, Languages, and Tools. C. 165-168 (2013)
3. Erdweg S., Storm T. Voelter M. and others. The State of the Art in Language Workbenches Conclusions from the Language Workbench Challenge (2013)
4. Clark T. A General Architecture for Heterogeneous Language Engineering and Projectional Editor Support (2015)
5. Chiusano P. Why are we still programming like it's the punchcard era? https://pchiusano.github.io/2014-09-30/punchcard-era.html (data obrashcheniya 20.04.2016)
6. Chiusano P. A very early demo of semantic program layout https://pchiusano.github.io/2014-09-30/semantic-layout (data obrashcheniya 20.04.2016)
7. Fowler M. Language Workbench http://www.martinfowler.com/bliki/LanguageWorkbench.html (data obrashcheniya 20.04.2016)
8. Fowler M. Projectional Editing http://martinfowler.com/bliki/ProjectionalEditing.html (data obrashcheniya 20.04.2016)
9. Fowler M. Language Workbenches: The Killer-App for Domain Specific Languages? http://www.martinfowler.com/articles/languageWorkbench.html (data obrashcheniya 20.04.2016)
10. Unison Project http://unisonweb.org/2015-05-07/about.html (data obrashcheniya 20.04.2016)
11. Whole Platform http://whole.sourceforge.net/ (data obrashcheniya 20.04.2016)
12. JetBrains Meta Programming System https://www.jetbrains.com/mps/ (data obrashcheniya 20.04.2016)