Введение

Парадигма программирования, кодирующая намерение программиста.

В компьютерном программировании, интенциональное программирование – это парадигма программирования, разработанная Чарльзом Симоньи, которая кодирует в исходном коде программного обеспечения точное намерение, которое программисты (или пользователи) имеют в виду при создании своих работ. Использование соответствующего уровня абстракции, на котором мыслит программист, упрощает создание и поддержку компьютерных программ. Разделение забот о намерениях и способах их реализации делает программное обеспечение более модульным и позволяет повторно использовать программный код. Интенциональное программирование было разработано бывшим главным архитектором Microsoft Чарльзом Симоньи, который возглавил команду в Microsoft Research, разработавшую эту парадигму и создавшую интегрированную среду разработки (IDE) под названием IP (сокращение от Intentional Programming), демонстрирующую возможности парадигмы. Microsoft отказалась от коммерциализации парадигмы интенционального программирования, поскольку в начале 2000-х годов компания активно продвигала C# и .NET для противодействия распространению Java. Чарльз Симоньи, с одобрения Microsoft, решил вывести свою идею из Microsoft и самостоятельно заняться её коммерциализацией. Он основал компанию Intentional Software для реализации этой цели. Microsoft лицензировала компании Intentional Software патенты на интенциональное программирование, полученные Симоньи во время работы в Microsoft, но не исходный код. Обзор интенционального программирования, разработанного в Microsoft Research, представлен в главе 11 книги Generative Programming: Methods, Tools, and Applications.

Цикл разработки

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

Разделение хранения и представления исходного кода

Ключ к преимуществам намеренного программирования заключается в том, что доменный код, отражающий намерения, хранится не в текстовых файлах исходного кода, а в древовидном хранилище (которое может быть бинарным или XML). Тесная интеграция среды разработки с форматом хранения позволяет привнести в исходный код некоторые преимущества нормализации баз данных. Избыточность устраняется за счет присвоения каждому определению уникального идентификатора и хранения имен переменных и операторов в единственном месте. Это упрощает внутреннее различие между объявлениями и ссылками, и среда разработки может отображать их по-разному. Пробелы в программе также не хранятся как часть исходного кода, и каждый программист, работающий над проектом, может выбрать свой стиль отступов. Более радикальные варианты визуализации включают отображение списков операторов в виде вложенных блоков, редактирование условных выражений в виде логических элементов или перерисовку имен китайскими иероглифами. Система использует нормализованный язык для популярных языков, таких как C++ и Java, позволяя пользователям среды комбинировать их с идеями из Eiffel и других языков. Намеренное программирование часто упоминается в контексте языко-ориентированного программирования через предметно-ориентированные языки и аспектно-ориентированного программирования, и претендует на обеспечение прорывов в генеративном программировании. Эти методы позволяют разработчикам расширять среду разработки для включения предметно-ориентированных конструкций без необходимости разработки полноценного компилятора и редактора для новых языков.

Личность

ИС фокусируется на концепции идентичности. Поскольку большинство языков программирования представляют исходный код в виде обычного текста, объекты определяются именами, и их уникальность должна выводиться компилятором. Например, одно и то же символическое имя может использоваться для именования различных переменных, процедур или даже типов. В коде, занимающем несколько страниц – или, для глобально видимых имен, несколько файлов – может быть очень сложно определить, какой символ относится к какому конкретному объекту. Если имя изменяется, код, в котором оно используется, необходимо тщательно проверять. В отличие от этого, в системе ИС все определения присваивают объектам не только символические имена, но и уникальные приватные идентификаторы. Это означает, что в среде разработки ИС каждая ссылка на переменную или процедуру – это не просто имя, а связь с исходной сущностью. Главное преимущество этого заключается в том, что при переименовании сущности все ссылки на нее в программе остаются действительными (это называется референциальной целостностью). Это также означает, что если одно и то же имя используется для уникальных определений в разных пространствах имен (например, ".to string"), ссылки с одинаковым именем, но разной идентичностью, не будут переименованы, как иногда происходит при поиске и замене в современных редакторах. Эта функция также упрощает создание многоязычных версий программы: можно иметь набор английских имен для всех определений и набор японских имен, которые можно переключать по желанию. Наличие уникальной идентичности для каждого определенного объекта в программе также облегчает выполнение автоматизированных задач рефакторинга и упрощает проверку кода в системах контроля версий. Например, во многих современных системах совместной разработки кода (например, Git), когда два программиста вносят конфликтующие изменения (то есть, если один программист переименовывает функцию, а другой изменяет одну из строк в этой функции), система контроля версий может решить, что один программист создал новую функцию, а другой изменил старую. В системе контроля версий ИС она поймет, что один программист просто изменил имя, а другой – код.