Регулярно устраиваю мозговой штурм касательно применения своего абстрактного языка.
Пока из всех конструкций абстрактного языка наиболее мощной мне кажется
абстрактная функция - это функция, у которой не указывается имя, нет тела, а имеются лишь неполный список аргументов.
Код:
y = abstract(x1, x2, x3, ...)
Это аналог произвольной функции в математике. Такая функция позволяет определять термы (или терминалы) вне кода, в его окружении. В качестве аргументов абстрактной функции могут выступать конкретные переменные в коде, а выходной параметр - терм (терминал). Такая функция описывает связь внутреннего пространства кода с его внешним окружением.
Например, можно определить, что некоторые объекты в коде document1, document2, document3 образуют систему документации. Однако этот нюанс может быть не отражен в коде, три данных объекта не имеют никакой связи между собой, кроме того, что у них похожи имена. Тогда можно написать такое абстрактное описание:
Код:
terminal doc_system = abstract(document1, document2, document3)
Абстрактная функция позволяет лениво описать тот факт, что несколько документов образуют структуру с именем doc_system. Более подробное и точное описание могло включать в себя конструкцию struct {}.
Код:
terminal struct doc_system {document1, document2, document3}
Одно это предложение определяет терминал doc_system, которое может поддерживаться на уровне IDE, чтобы быстро находить объекты документов в коде с помощью специального навигатора.
Таких структур, которые объединяют переменные и функции в коде, на самом деле очень много. Среди них я выделяю стандартные терминалы, например:
terminal Graphics
terminal Graphics.Console
terminal Graphics.OS
terminal Filesystem
terminal Database
terminal Keyboard
terminal Mouse
и т.д.
Вы могли бы указывать терминалы в навигаторе IDE и от этого подсвечивались бы (раскрывались бы) те участки кода, которые содержат переменные, объекты, события, которые отслеживались бы благодаря абстрактным описаниям.
Вообще, строго говоря, если зациклиться на одних абстрактных функциях, то в общем-то никаких абстрактных описаний и не нужно было бы. Можно было бы просто указать мышью ряд объектов в коде и связать с некоторой сущностью в IDE и не заморачиваться с абстрактным языком. Однако это работает лишь для связывания конкретных объектов кода, по имени которых можно ткнуть мышью в коде.
Можно написать такое абстрактное описание, которое позволило бы парсить код и находить в нем такие терминалы как массивы (terminal arrays), условия "если" (terminal if_conditions) и другие языковые конструкции. В отличие от конкретных объектов в коде, такие терминалы обладают свойством обобщения, т.е. не требуют указания имени. Обобщенные терминалы могли бы участвовать в более сложных высокоуровневых абстрактных описаниях, таких как описания ошибок. С другой стороны, IDE, используя достаточно точное описание функций парсинга кода, может по обобщенным описаниям находить конкретные объекты в коде.
Иными словами, благодаря абстрактным описаниям, IDE может автоматизированно выполнять действия разработчика. Разработчик узнает на stackoverflow, что некоторая ошибка может возникать из-за обращения к массивам в коде - он находит все обращения к массивам в коде. Фактически, когда IDE парсит код, она выполняет совершенно те же действия, которые разработчик выполняет при ручном поиске. Абстрактное описание парсинга кода и терминалы, связанные с этим, должны иметь важное значение для автоматизации разработки. Эти вещи прячутся в голове программиста в виде порядочно-беспорядочных моделей, и эти модели в своем подавляющем большинстве стандартны.
Кто-то бы мог додуматься написать программу-навигатор, которая находила бы в коде участки, которые релевантны тому или иному терминалу. Однако моя идея заключается в том, чтобы использовать для этого абстрактные модели, в той или иной мере, соответствующие реальности (туманным представлениям в голове команды разработчиков).
Среди промежуточных терминалов можно выделить, например, паттерны проектирования. Если бы IDE могла распознавать паттерны, то появился бы дополнительный инструмент и элемент абстрактного языка. Это было бы поддержкой в общении двух разработчиков "через код": если один разработчик создал паттерн, то второй заметил бы это благодаря абстрактному описанию паттерна и подсказке IDE.
На самом деле, с помощью абстрактного языка можно было бы не только анализировать имеющийся код, но и создавать новый. Например, можно задать абстрактную функцию, которая описывает связь между терминалами Keyboard, Graphics.Console и Printer. Под этой абстрактной функцией следовало бы понимать некий конкретный код, который еще предстоит разработать. Поэтапная разработка заключается, по сути, в устранении символов неопределенности (...) и abstract из абстрактного описания и заменой их на конкретные цепочки символов. Здесь также можно изобрести механизмы поддержки со стороны IDE.