Назад

УДК 004.4242

ГЕНЕРАЦИЯ ПРОГРАММНОГО КОДА

Баев Д.Э., Суров А.Д., Григорьев А.В.

ГОУ ВПО «Донецкий национальный технический университет» (г. Донецк)

azo.cw@yandex.ru, emoxypine@gmail.com, grigorievalvl@gmail.com

Введение

Генерация кода – это автоматическое создание программного кода специальным приложением, при котором по заданным условиям полностью или частично формируется исходный код программы [1]. Такое специальное приложение называется генератором кода.

Актуальность использования генераторов программного кода обусловлена повышением скорости разработки программного обеспечения; мобильности и гибкости платформ для разработки, а также самих разработчиков; минимизацией ошибок на этапе проектирования, подготовки программного обеспечения и выбора программных средств для реализации определенной задачи.

Целью предлагаемой статьи является:

Описание основных бизнес-процессов генераторов программного кода

Генерация классифицируется по выбранному языку программирования, по методам генерации и типу генерации. Структуры генерации программного кода показаны на рисунках 1-2.

Наиболее популярные методы генерации [1]:

Типы генерации:

Рисунок 1 - Структура процесса генерации программного кода

Рисунок 2 - Структура системы генерации программного кода

Потенциально может применяться как возможность автоматизировать процесс создания электронной информации. Наиболее применимыми областями являются [1]:

При правильном задании параметров и корректной разработке генератора большая часть кода может быть автоматически сгенерирована. Для того, чтобы программный код мог быть создан генератором, необходимо наличие следующих трех ключевых компонентов (см. рис. 3-4) [1]:

Рисунок 3 - Ключевые составляющие генерации кода

Рисунок 4 - Формирование кода без применения генерации (слева), формирование кода с применением генерации кода (справа)

Анализ рынка программных продуктов с возможностью генерации программного кода

Рассмотрим генераторы кода с применением средств искусственного интеллекта.

Bayou - это система для создания идиом API, которые представляют собой фрагменты кода, использующие API в Java [2]. Основная задача этой системы - использовать код пользователя и запрос для генерации соответствующей программы, процесс показан на рисунке 5. Bayou интерпретирует этот запрос, используя метод обучения Neural Sketch [3].

Рисунок 5 - Bayou - ИИ, помогающий писать код

DeepCode - это программная платформа для искусственного интеллекта, которая учится у программистов с открытым исходным кодом и использует полученные знания для внесения предложений о том, как можно улучшить код. Разработчик может использовать эту платформу как инструмент проверки кода или как инструмент аудита (см. рис. 6). Он предупреждает пользователя об уязвимостях в коде. DeepCode интегрируется с платформами хостинга кода, такими как GitHub, Bitbucket Server или GitLab, и для всех интеграций платформа предоставляет один и тот же базовый набор функций, таких как Аудит контроля качества и ИИ анализ кода [2].

Deep Code - инструмент поиска уязвимостей в коде программ, написанных на Java, JavaScript, TypeScript и Python, в котором машинное обучение присутствует в качестве компонента. По заявлению Бориса Паскалева, уже работает более 250 тысяч правил. Этот инструмент обучается на основе изменений, вносимых разработчиками в исходный код открытых проектов (миллион репозиториев). Сама компания говорит, что их проект - это Grammarly для разработчиков [3].

Рисунок 6 - Рабочая среда DeepCode

Clever-Commit – анализатор, созданный Mozilla в сотрудничестве с Ubisoft. Он основан на исследовании CLEVER (Combining Levels of Bug Prevention and Resolution Techniques), проведенном Ubisoft, и основанном на нем продукте Commit Assistant, который выявляет подозрительные коммиты, скорее всего содержащие ошибку. Благодаря тому, что CLEVER основан на сравнении кода, он не только указывает на опасный код, но и делает предложения о возможных правках. Согласно описанию, в 60-70% случаев Clever-Commit находит проблемные места и с той же частотой предлагает для них верные правки. В целом, информации об этом проекте и об ошибках, которые он способен находить, немного, на официальном сайте есть только логотипы компаний-основателей, показанные на рисунке 7.

Рисунок 7 - Логотипы компаний-основателей Clever-Commit

Sketch2Code - это веб-решение, использующее ИИ для преобразования рукописного дизайна пользовательского интерфейса в действующий код HTML-разметки. Для этого сначала необходимо указать шаблоны проектирования (см. рис. 8). Решение понимает рукописный чертеж или текст, понимает структуру, а затем создает код HTML в соответствии с обнаруженным макетом, содержащим обнаруженные элементы дизайна.

Рисунок 8 - Выбор шаблонов макетирования на главной форме Sketch2Code

Также рассмотрим самые популярные генераторы программного кода среди программистов различных областей, которыми считаются: Visual Studio, Android Studio, Qt Creator/Qt Designer, а также различные библиотеки или узкоспециализированные программы.

Visual Studio – интегрированная среда разработки для малых и больших проектов, которая представляет из себя многофункциональную программу, используемую для различных аспектов разработки программного обеспечения. Помимо стандартного редактора и отладчика, Visual Studio включает в себя компиляторы, средства автозавершения кода и многие другие функции для упрощения процесса разработки программного обеспечения. Visual Studio использует сразу два варианта генерации программного кода. При создании проекта среда разработки подготавливает шаблон, подходящий под выбранный тип проекта, далее разработчик модифицирует шаблон, наполняя его необходимыми модулями. При использовании WPF среда разработки подгружает разработчику заранее подготовленный макет (см. рис. 9), а при использовании Windows Forms среда разработки модифицирует соответственный шаблон в зависимости от расположения элементов управления на Canvas’ном холсте.

Рисунок 9 - Шаблон WPF проекта Visual Studio

Android Studio – интегрированная среда разработки для работы с платформой Android, включающий в себя SDK (Software Development Kit), поддержку различных устройств (платформы разработки): умные часы, телевизоры и т.д. Android Studio генерирует код по заготовленному шаблону под отдельную платформу разработки (см. рис. 10), однако весь процесс генерации сводиться к загрузке шаблона в созданный проект Android Studio. Разработку пользовательского интерфейса, позиционирование элементов управление, подключение обработчиков происходит вручную.

Рисунок 10 - Шаблон проекта мобильного приложения Android Studio

Qt Design Studio (ответвлениями/ранними стадиями продукта являются Qt Designer и Qt Creator) - мощнейший инструментарий по созданию пользовательского интерфейса на сегодняшний момент. Qt Design Studio сокращает разрыв между дизайнерами и разработчиками. Теперь они могут работать одновременно с одной объединяющей структурой, одним общим языком, меньшим количеством циклов обратной связи и более быстрыми итерациями. «Дизайнеры могут импортировать файлы дизайна пользовательского интерфейса из Adobe Photoshop, Sketch, Maya, MODO или Blender в Qt Design Studio, которая может превратить их в код для ваших разработчиков. Функции прототипирования Qt Design Studio воплотят ваши проекты в жизнь, а также имитируют и проверяют взаимодействия и динамическое поведение. Вы даже можете протестировать, просмотреть и настроить свои проекты до совершенства пикселей в реальном времени на целевом устройстве. Начните проектирование с Qt. Получите бесплатную пробную версию. Найдите вдохновение для вашего следующего дизайн-проекта.» — заверяют создатели Qt Design Studio.

Также существует множество программных модулей, пользовательских библиотек. Индивидуальных наработок, которые самостоятельно генерируют программный код по заранее определенному стандартом шаблону, к примеру, это может быть и Django, Flask, Bottle для языка программирования Python, и Ruby on Rails, Sinatra для языка Ruby, а также множество других схожих библиотек.

В качестве небольшого бонуса, представлю список программ для генерации G-кода. Качественные G-коды невозможно создать без специализированного программного обеспечения.

Конструктор G-кода - любительский софт от независимого разработчика, распространяющего свой продукт на бесплатной основе. На данный момент он находится на стадии разработки, однако уже доступен для скачивания [4]. Софт основан на модульном принципе, при котором каждый блок обозначен уникальным кодом и отвечает за свой сегмент деятельности. Одним из них является «Генерация G-кода» под кодом 900. В качестве исходных данных допускается использование графического изображения любого формата, а также DXF, PLT и Gerber-файлов.

Различные пресеты для программы необходимо устанавливать дополнительно, они тоже являются бесплатными. Напротив каждого из них на официальном сайте представлено подробное описание и видеофайл с примером. Рабочее пространство Конструктора G-кода поделено на четыре блока, как показано на рисунке 11: область меню, панель навигации, область вывода текущего обрабатываемого модуля и панель действий с доступными инструментами. Все необходимые операции экспортируются в отдельный файл.

Рисунок 11 - Интерфейс программы Генератор G-кода

SheetCAM — многофункциональный пакет подготовки G-кодов для последующей обработки на станках плазменного раскроя с ЧПУ (см. рис. 12). Главная особенность — наличие понятного и интуитивного интерфейса, с которым разберется даже начинающий пользователь. В качестве исходных данных используются форматы EMF, DXF, HPGL и Excellon. Если проект предварительно не обрабатывался в сторонних системах автоматизированного проектирования, можно сделать это непосредственно в меню SheetCAM. Редактор оснащен внушительным перечнем инструментов для обработки деталей. Их можно вращать, дублировать, перемещать и, естественно, вносить изменения. Предусмотрена 3D-визуализация маршрута обработки объекта под углом, заданным пользователем [4].

Рисунок 12 - Интерфейс программы SheetCAM

Сига - удобный редактор для преобразования графических объектов в G-коды для дальнейшей печати на 3D-принтере. Приложение поддерживает все современные принтеры торговых марок BQ, ALYA, Creality, Delta, Innovo, Folger и др.

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

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

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

CAM-приложение для генерации G-кодов с названием Bmp2Cnc, в качестве исходных данных использует растровые форматы JPEG и BMP. После загрузки начального изображения необходимо установить простые параметры и отрегулировать показатели под свои нужды, с помощью предусмотренного редактор с несколькими инструментами (см. рис.14).

Рисунок 13 - Интерфейс программы Cura

Рисунок 14 - Интерфейс программы Bmp2Cnc

Анализ возможностей генераторов программного кода

Рассмотрим два примера генерации программного кода. Первым примером будет выступать программный продукт Qt Designer для создания пользовательского графического интерфейса для языков программирования C++ или Python. Вторым примером рассмотрим программный интерфейс приложения (API) Ruby on Rails для создания web-приложений с помощью языка программирования Ruby.

Процесс генерации программного кода средствами Qt Designer для языка программирования Python происходит в два этапа: первый - создание .ui файла пользовательского интерфейса, второй - подключение файла в проект.

Создадим интерфейс простого калькулятора, как показано на рисунке 15. Сохраним в формате .ui, который сохраняет созданные компоненты в виде XML разметки (см. рис. 16). После создания интерфейс необходимо подключить к программе, подключение происходит с помощью методов подключаемой библиотеки Qt в Python (см. рис. 17).

Рисунок 15 - Пользовательский графический интерфейс

Рисунок 16 - Сгенерированный код

Рисунок 17 - Подключение сгенерированного кода в Python проект

Ruby – динамический, рефлективный, интерпретируемый высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования.

Ruby on Rails – полноценный, многоуровневый фреймворк для построения веб-приложений, использующих базы данных, который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).

Генерация проекта средствами RoR происходит консольной командой: rails new <название_проекта> (см. рис. 18). Создается каталог с указанным названием, где и будет располагаться сгенерированный код фреймворком. В таком случае, RoR создаст все необходимые файлы, подключит актуальные библиотеки и зависимости, а также сгенерирует файл-конфигурации будущего web-приложения (см. рис. 19).

Рисунок 18 - Генерация программного кода фреймворком RoR

Рисунок 19 - Сгенерированные файлы (проводник)

Анализ проблем, возникающих при использовании шаблонов или генераторов

Множество разработчиков ошибочно считают, что Visual Studio и Android Studio применяют методы генерации кода. На самом деле это не так. В данных IDE применяется создание шаблона с уже заготовленными строками кода. Исключением является Windows Forms, т.к. в заготовленный шаблон пользовательской формы Visual Studio автоматически изменяет/добавляет компоненты проектируемой формы. Однако, удалять компоненты IDE не умеет - дизайнеру приходится вручную исправлять ошибку в классе пользовательской формы после удаления какого-либо компонента, имеет тот ссылки на методы или нет - Visual Studio расценит удаление как за ошибку. Касательно WPF и Android Studio - сгенерированный «код» программисту или дизайнеру придется исправлять вручную. При изменении какой-то мелкой детали в проекте возникнут горы ошибок - потянутых автоматически.

Что касается генерации кода, то она находится не на самом высоком уровне. Специалисты приводят довольно внушительный список преимуществ и недостатков.

Преимущества [1]:

  1. Структурированность и согласованность исходного кода приложения (генерированного машиной). Генератор позволяет с точностью до символа соблюдать правила написания кода, применяемые в организации. Программисты перенимают чистый и структурированный стиль генерированного кода, то есть учатся у генератора хорошему оформлению программы.
  2. Согласованность на уровне архитектуры приложения. Применение генератора дает уверенность в том, что создаваемый код соответствует изначально спроектированной структуре приложения и шаблонам. Если какую-то функциональность не получается реализовать с помощью генератора, это служит сигналом к тому, что она не соответствует изначальной архитектуре.
  3. Высокое качество кода и облегченное исправление ошибок. Программа стабильна и свободна от ошибок (предполагается, что подавляющая часть ошибок исправлена уже на этапе отладки самого генератора). Если же все-таки имеются ошибки, то их поиск и исправление можно вести как на более абстрактном уровне шаблонов, так и в генерированном коде.
  4. Гибкость к изменениям. Если требования поменяются, можно только обновить шаблоны, генератор и/или метаданные и сделать массированный вывод новой версии кода. Есть возможность относительно легко и безболезненно переходить на другие платформы и технологии; Сводятся к минимуму ошибки, возникающие из-за человеческого фактора, например, опечатки.
  5. Скорость разработки. Если метаданные уже определены и введены, то генерация огромного объема кода может производиться за невероятно короткое время - буквально за секунды.
  6. Единый источник информации о приложении. В приложениях, которые пишутся вручную, простое изменение имени таблицы или столбца может повлечь за собой серию изменений во многих участках кода. При генерации же метаданные находятся в отдельном источнике и поэтому достаточно изменить название таблицы или столбца в том месте, где определяется схема, и пересоздать код.
  7. Наглядность бизнес логики. В приложениях, которые пишутся вручную, смысл бизнес логики теряется в сотнях и тысячах строк программного кода. Генераторы же используют файлы метаданных, в которых видна вся структура программируемой предметной области, её поведение, исключения и т.д. Гораздо легче понять, что делает приложение на высоком уровне абстракции. Метаданные могут использовать эксперты в предметной области приложения.
  8. Усовершенствованный процесс разработки кода. Теперь появляется возможность больше времени уделять проектированию приложения, так как процесс создания кода будет занимать меньше времени. Уменьшается срок выполнения проекта, повышается удобство сопровождения проекта. Также с помощью генератора можно быстро изготавливать множество прототипов кода, анализируя и тестируя которые можно избегать ситуаций, когда ошибка допущена на этапе проектирования, а выявлена была уже в процессе разработки.
  9. Разработчики концентрируются на более интеллектуальных областях разработки. Что позволяет лучше использовать их профессиональные навыки, быстрее повышать квалификацию.
  10. Улучшение удобства работы программистов. Код становится намного чище и проще, так как генерируется только то, что требуется сейчас.
  11. Улучшение мотивации и интереса к работе у программистов. Все вышеперечисленное делает работу разработчика более интересной, насыщенной и продуктивной, что не может не сказываться положительно на мотивации, а это является очень важным фактором, влияющим на успех проекта.

Недостатки [1]:

  1. Применение генератора может быть эффективно не во всех случаях. Если в проекте мало повторяющегося кода, объем проекта недостаточно большой, если код сложно поддается генерации, может оказаться, что легче написать приложение вручную.
  2. Практически всегда присутствует часть кода, которую нужно создать вручную. Объем такого кода может быть различным на разных проектах. В основном это уникальные, единожды встречающиеся в приложении шаблоны кода, которые нет смысла генерировать. Их проще написать один раз вручную. Например, это может быть модуль авторизации пользователя или библиотека функций.
  3. Возникает необходимость сопровождения генератора. Если генератор разрабатывался не только для изначального создания кода, а также для применения на протяжении всего жизненного цикла приложения, то это значит, что параллельно с сопровождением и развитием приложения надо будет сопровождать и развивать и сам генератор. Если это приобретенный у поставщика генератор, то сделать это будет очень сложно, либо невозможно.
  4. Необходимо обучать применению генераторов. При внедрении генератора, а также в ходе эксплуатации после каждого его изменения надо обучать всех имеющих непосредственное отношение к генератору особенностям его применения. Также это надо делать для новоприбывших сотрудников.

Выводы

В статье описаны и проанализированы основные бизнес-процессы генерации программного кода. Выполнен обзор и анализ функциональных программных продуктов с возможностью генерации кода, проведён их анализ, а также на нескольких примерах рассмотрены методы генерации программного кода различными средствами.

Список литературы

  1. Основные представления о генерации кода [Электронный ресурс] // НОУ ИНТУИТ. – URL: https://intuit.ru/studies/courses/4432/975/lecture/14619
  2. Использование машинного обучения в статическом анализе исходного кода программ [Электронный ресурс] // Хабрахабр. – URL: https://habr.com/ru/company/pvs-studio/blog/484208/
  3. Топ 5 ИИ приложений, которые сами могут генерировать код [Электронный ресурс] // Яндекс.Дзен. – URL: https://zen.yandex.ru/media/anosistema/top-5-ii-prilojenii-kotorye-sami-mogut-generirovat-kod-5e72edec375fb21d41705455
  4. Программы для генерации кода программ [Электронный ресурс] // Лумпикс. – URL: https://lumpics.ru/programs-for-generating-program-code/

Баев Д.Э., Суров А.Д., Григорьев А.В. Генерация программного кода. В статье описан термин генерации программного кода, основные бизнес-процессы, методы и требования генерации. Выполнен обзор программных продуктов для генерации программного кода. Проанализированы проблемы, возникающие при генерации программного кода, а также рассмотрен вопрос различия шаблонов и генераторов.

Ключевые слова: CAПР ПО «Генерация программного кода», генерация программного кода, программные шаблоны, генераторы кода, графическая модель, программное представление.

Baev D.E., Surov A.D., Grigoriev A.V. Program code generation. The article describes the term of program code generation, the main business processes, methods and requirements of generation. A review of software products for generating program code is performed. The problems arising during the generation of program code are analyzed, and the issue of the difference between templates and generators is also considered.

Keywords: CAD "Software code generation", software code generation, software templates, code generators, graphical model, software representation.