QA Fest — конференция №1 по тестированию и автоматизации. Финальная программа уже на сайте >>
×Закрыть

Программирование в форме диалога. Часть III. Реализация диалога, будущее

Cм. также начало: Часть I. Зачем это нужно и Часть II. Реализация диалога, предыстория.

Третья задача. SymADE

Третьей задачей, которую необходимо решить для реализации диалогового способа программирования есть задача полного разделения семантического кода и его синтаксического отображения, то есть разделение внутреннего представления модели программы и языка (языков) на которых компьютер общается с программистом. И единственной известной мне разработкой, работающей над решением этой задачи, является среда разработки SymADE (Symbolic Adaptable Development Environment) реализующая SOP (semantic-oriented programming) парадигму программирования. Автор данной статьи и является разработчиком SymADE.

SymADE — это полностью open-source проект (под лицензией CPL 1.0), разработка которого ведётся на http://symade.tigris.org, в котрой уже сейчас достаточно полно реализована возможность редактирования дерева программы (используя структурный редактор, как и в MPS), и в котором ведётся разработка возможности полного отделения кода программы от его отображения. Сейчас среда разработки SymADE находится в состоянии альфы, она активно используется при разработке самой себя, но ещё достаточно сырая для публичного использования. В то же время, полная открытость SymADE значительно уменьшает потенциальные риски потенциальных пользователей, так как они имеют гарантию (в виде полностью доступного исходного кода), что смогут довести до конца текущую разработку своего проекта. Если же они будут реализовывать критически важную часть проекта используя закрытый продукт (вроде MPS или IP), то в случае внезапного прекращения поддержки (JetBrains или Intentional Software разорятся, или будут куплены и новый хозяин изменит политику) они не имеют никаких гарантий, что их труд не пропадёт. Этот фактор является достаточно важным для новой технологии, при отсутствии альтернативных реализаций.

Другим важным преимуществом open-source решения является то, что по своей природе эти новые средства разработки рассчитаны на максимальную адаптивность, возможность быть изменёнными в соответствии с требованиями конкретной задачи. Очевидно, что никакое закрытое решение не сможет предоставить настолько полной возможности по изменению и адаптации, насколько это могут предоставить открытые программные продукты.

Разделение синтаксиса от семантики в SymADE делается на основе возможности задавать произвольные проекции (projection) одного дерева в другое. При этом деревья остаются (могут оставаться) связанными, то есть изменение в одном дереве автоматически транслируется в изменения в другое дерево.

Это может использоваться с разными целями. Например, можно задать проекцию дерева кода программы в дерево, узлы которого реализуют DOM (document object model) интерфейс спецификации XML. После этого, производное дерево может быть сохранено в XML файл, в нём можно использовать поиск на основе XPath или трансформировать его при помощи XSLT. Эти изменения будут автоматически (тем же кодом или теми же правилами, которые использовались для проекции в XML дерево) транслированы обратно, в исходное дерево кода.

Другое использование — это решение проблемы с редактированием. Поскольку декларативная часть кода достаточно удобна для редактирования структурным редактором, и проблемы возникают только с редактированием выражений, в SymADE используется следующий подход. Код программы (дерево), проектируется в другое специальное дерево, удобное для редактирования. В частности, в этом дереве выражения представлены как списки (состоящие из идентификаторов, констант, и операторов). Приоритет и ассоциативность операторов задаётся в описании проекции, и позволяет делать взаимно-однозначное преобразование между представлением выражения в виде дерева и в виде списка. Редактирование такого списка больше всего напоминает редактирование форматированного текста в редакторах вроде Word-а.

Вообще говоря, WYSIWYG редакторы являются достаточно хорошим примером для демонстрации основного отличия SymADE от MPS. Дело в том, что в Word-е и подобных редакторах, вы редактируете не текст. В нём есть некое внутреннее представление структурированного документа, которое он отображает как (отформатированный) текст. И он интерпретирует команды пользователя (нажатия клавиш и действия мышкой), на основе которых меняет своё внутреннее представление документа, и снова отображает эти изменения как текст. При этом отображения могут значительно различаться, в зависимости от настроек и текущего режима редактора. Скажем, сноски могут отображаться на текущей странице, в конце документа, в виде подсказки при наведении мышки и пр. Такой редактор не отображает всей информации о редактируемом документе. Например, он обычно скрывает историю редактирования текста, но может и показывать удалённые части как зачёркнутый текст. Внутри «текста» существуют достаточно сложные не-текстовые объекты — картинки, специальные поля для заполнения форм, автоматические поля для текущей даты или номера страницы и так далее.

Процесс редактирования современного WYSIWYG редактора может дать приблизительное представление о редактировании кода программы в будущих реализациях диалогового программирования. Конечно, надо учитывать, что WYSIWYG редакторы не позволяют определять новые понятия, и вообще оперируют достаточно небольшим набором концепций, даже по сравнению с языком программирования не очень большой сложности. Да и набор способов отображения документа у них предопределённый, в то время как среда разработки программ будущего будет позволять определять эти отображения.

MPS, и в несколько большей степени SymADE (когда он будет доведён до состояния публичной бета-версии), теоретически позволяют уже сейчас значительно увеличить производительность труда программиста для больших проектов (а также для проектов в некоторых специфических областях программирования). Дело в том, что небольшие программы быстрей и дешевле писать на динамических языках — они обладают максимальной выразительностью, хотя и в ущерб проверки программы до исполнения. Программы средней сложности лучше писать на строгих языках со статической компиляцией, что позволяет предварительно проверить правильность программы, оптимизировать её скорость и потребление памяти, а сами дополнительные декларации позволяют сделать код более документированным (что достаточно важно для больших проектов). Однако, когда проект становится очень большим, единственными на сегодня средством увеличить производительность труда программистов являются IDE и метапрограммирование. Но увы, использовать существующие языки программирования со встроенными средствами метапрограммирования для таких выросших проектов не получится. По двум причинам. Первая — это недостаточная поддержка этих языков в IDE, что вызвано, в первую очередь, ориентацией в них метапрограммирования на преобразование новых понятий в старые, а средства описания этих новых понятий для IDE (способы отображения, редактирования, рефакторинга) не являются ни стандартными, ни достаточно развитыми. Вторая, это то, что они требуют перехода на другой язык программирования. На Lisp, на Nemerle и так далее. Что является практически невозможным, так как на старом языке программирования уже написаны десятки мегабайт исходного кода. Таким образом, метапрограммирование практически не попадает в то место, где оно могло бы дать максимальный эффект, то есть в проекты большого объёма и сложности.

SymADE (и до определённой степени MPS) позволяют определить практически любой синтаксис для набора (онтологии) семантических понятий. То есть можно настроить SymADE или MPS так, чтоб они имели полный набор понятий соответствующий понятиям языка Java или C# или Haskell или другого языке, и отображал эти понятия в соответствующем синтаксисе (Java, C#, Haskell и т.п.). Таким образом, после импорта кода большого проекта в дерево внутреннего представления кода программы в SymADE или MPS, программисты будут видеть всё тот же старый код и работать с теми же привычными им понятиями. Но плюс к этому, у них появится возможность использовать полноценное метапрограммирование. Таким образом, они позволят плавно перейти к метапрограммированию тем проектам, которые достигли критического размера, при котором их дальнейшая разработка едва возможна, без расширения семантических и синтаксических возможностей используемого языка программирования.

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

Если точнее, то все связи между семантическими понятиями в SymADE задаются ad hoc. Мы явно задаём способ отображения нового понятия. Явно задаём способ его преобразования в другое (например, более низкоуровневое) понятие. Если мы модифицируем исходное понятие, то нам надо задавать правила миграции исходного кода в новую версию онтологии (языка). Если мы задаём новое понятие как слегка модифицированное старое понятие — нам надо практически полностью определить его, с нуля, мы не имеем других возможностей определить его значение, поведение и использование кроме copy&paste кода для описания изначального понятия. То есть нельзя сказать, что новое понятие X, это почти что старое понятие Y, за исключением таки-то случаев и с дополнительно таким-то поведением.

Этот недостаток делает достаточно сложным реализацию достаточно больших онтологий (наборов семантических понятий) и их модификацию. Ещё более сложным будет проблема, связанная с определением различными программистами (для различных проектов) сходных понятий. Скажем, в одном проекте используются две разные библиотеки, определившие сходные понятия, но несколько различным образом. Скажем, сейчас несколько сред разработки программ на Java используют аннотации (вроде @Nullable) для обозначения полей, переменных и методов, которые могут или не могут принимать/возвращать значение null. Одна библиотека написана в среде с одной реализацией nullable-аннотаций, а другая в среде с другой реализацией. А вы бы хотели использовать обе эти библиотеки.

Увы, для этой и подобных проблем, как индустрия в целом, так и SymADE, пока не могут предложить никаких решений кроме «стандартизации». И если для статических, не-адаптируемых решений и языков программирования это более-менее приемлемый подход, то для ориентированного на расширяемость и адаптируемость подхода SymADE это не лучший выход. И, следовательно, для полноценной реализации диалогового процесса программирования и автоматизацию компьютером процесса кодирования, нам нужно реализовать эту задачу.

Четвёртая задача. Искусственный интеллект

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

Теоретически, эта система вывода новых связей из заданных программистом связей между существующими семантическими понятиями будет работать аналогично выводам фактов в логических языках программирования (таких как Prolog). Только вместо фактов будут выступать семантические понятия, а вместо предикатов — связи семантических понятий. Понятно, что это должна быть намного более сложная система вывода, позволяющая использовать нечёткую логику, проверять набор фактов и правил на противоречивость и так далее.

Сейчас просто не существует базы, где искусственный интеллект мог бы быть применён для автоматизации программирования в значительной степени. Поскольку среды разработки и исполнения программ, которые позволяют оперировать объёмными (в отличие от дискурсивных) описаниями семантических понятий и связей между ними — сейчас просто не существует. Достаточно широкое распространение и использование таких сред разработки как MPS или SymADE, породит потребность в развитии этого направления в области искусственного интеллекта. А реализация в SymADE даже существующих теоретических разработок позволит получить значительный эффект и реализовать путь достаточно простую, но уже полноценную систему программирования, в которой значительная часть работы по кодированию и рефакторингу программы будет полностью автоматизирована компьютером.

LinkedIn

9 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

За изменением синтаксиса, который как китайский, следить не нужно — его можно настраивать под себя.За вводом новых понятий, разумеется, следить надо. Но чем это принципиально отличается от слежения за вводом новых понятий и соглашений в большом проекте? Ты точно так-же не сможешь взять исходники большого проекта и сходу их все понять и начать исправлять и развивать дальше. В любом случае тебе надо будет выучить API, структуру проекта, особенности реализации, внутренние соглашения проекта.Но одно дело, когда эти внутренние соглашения существуют лишь в мозгах разработчиков (даже если они есть в документации — поди найди их в ней), а другое дело, если среда разработки содержить знания об этих соглашениях и умеет контролировать их соблюдение, и наконец — просто поделиться этим знанием с человеком, который только начал работать над проектом.

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

Если точнее, то все связи между семантическими понятиями в SymADE задаются ad hoc. Мы явно задаём способ отображения нового понятия. Явно задаём способ его преобразования в другое (например, более низкоуровневое) понятие. Если мы модифицируем исходное понятие, то нам надо задавать правила миграции исходного кода в новую версию онтологии (языка). Если мы задаём новое понятие как слегка модифицированное старое понятие — нам надо практически полностью определить его, с нуля, мы не имеем других возможностей определить его значение, поведение и использование кроме copy& paste кода для описания изначального понятия. То есть нельзя сказать, что новое понятие X, это почти что старое понятие Y, за исключением таки-то случаев и с дополнительно таким-то поведением.

Этот абзац вызвал настойчивые аналогии с ООП... может стоит взять оттуда что-то наподобие наследования, для избежания копипаста?

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

Интересный подход. Молодцы. Интерестно почитать про еще одно направление в развитии «от истока» — в обход устоявшегося трамлина из нынешних технологий.

Картинки лиспа вам не нужны особо, да? Картинки MPS можно найти в тьюториалах на их сайте http://www.jetbrains.com/mps/i..., картинки SymADE можно найти в мини-описании демки http://symade.tigris.org/files... (OpenOffice документ).

Уважуха аффтару за многа букафф:)) Но, картинок очень не хватает.

Спасибо, Максим, за статьи. Я-то конечно помню о SymADE/SOP, но будет интересно посмотреть как отреагиует общественность.Впрочем, к сожалению тут судя по всему, собрались люди-програмисты довольно коммерчески-ориентированные, и с постоянной нехваткой времени, и оценить, мне кажется, в должной мере не смогут. Наиболее частым ответом ожидаю «не осилил много текста»...

Это чья-то диссертация?

Подписаться на комментарии