Преднамеренное программирование - Intentional programming

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

Преднамеренное программирование было разработано бывшим главным архитектором Microsoft Чарльзом Симони , который возглавлял команду в Microsoft Research , которая разработала парадигму и построила интегрированную среду разработки (IDE) под названием IP (для преднамеренного программирования), которая продемонстрировала эту парадигму. Microsoft решила не разрабатывать парадигму преднамеренного программирования, поскольку в начале 2000-х Microsoft развертывала C # и .NET, чтобы противостоять принятию Java. Чарльз Симони решил с одобрения Microsoft забрать свою идею у Microsoft и сам коммерциализировать ее. Для этого он основал компанию Intentional Software . Microsoft предоставила Intentional Software патенты на намеренное программирование, которые Симони приобрела в Microsoft, но не исходный код.

Обзор преднамеренного программирования в том виде, в каком оно было разработано в Microsoft Research, дается в главе 11 книги Генеративное программирование: методы, инструменты и приложения .

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

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

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

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

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

Система использует нормализованный язык для популярных языков, таких как C ++ и Java , позволяя пользователям среды смешивать и сопоставлять их с идеями Eiffel и других языков. Часто упоминаемый в одном контексте с языково-ориентированным программированием через предметно-ориентированные языки и аспектно-ориентированным программированием , IP призван обеспечить некоторые прорывы в генеративном программировании . Эти методы позволяют разработчикам расширять языковую среду для захвата предметно-ориентированных конструкций без вложений в написание полного компилятора и редактора для любых новых языков.

Пример программирования

Программа на Java, которая записывает числа от 1 до 10, используя синтаксис фигурных скобок , может выглядеть так:

 for (int i = 1; i <= 10; i++) {
    System.out.println("the number is " + i);
 }

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

Но этот код не отражает намерений программиста, а именно «распечатать числа от 1 до 10». В этом простом случае программист, которого попросили поддерживать код, вероятно, мог бы понять, для чего он предназначен, но это не всегда так просто. Циклы, охватывающие множество строк или страниц, могут стать очень трудными для понимания, особенно если исходный программист использует нечеткие метки. Традиционно единственным способом указать намерение кода было добавление комментариев к исходному коду , но часто комментарии не добавляются, либо неясны, либо не синхронизируются с исходным кодом, который они первоначально описали.

В системах преднамеренного программирования вышеупомянутый цикл может быть представлен на некотором уровне как нечто столь же очевидное, как " print the numbers 1 to 10". Затем система будет использовать намерения для генерации исходного кода, вероятно, что-то очень похожее на приведенный выше код. Ключевое отличие состоит в том, что системы преднамеренного программирования поддерживают семантический уровень, которого нет в исходном коде, и который может значительно облегчить читаемость в более крупных программах.

Хотя большинство языков содержат механизмы для захвата определенных видов абстракции , IP, как и семейство языков Lisp , позволяет добавлять совершенно новые механизмы. Таким образом, если разработчик начал с такого языка, как C , он мог бы расширить язык такими функциями, как в C ++, не дожидаясь, пока разработчики компилятора добавят их. По аналогии, программисты могли использовать гораздо более мощные механизмы выражения, чем простые классы и процедуры .

Личность

IP фокусируется на концепции идентичности . Поскольку большинство языков программирования представляют исходный код в виде простого текста , объекты определяются по именам, а их уникальность должна определяться компилятором . Например, одно и то же символическое имя может использоваться для именования разных переменных, процедур или даже типов. В коде, охватывающем несколько страниц - или, для глобально видимых имен, несколько файлов - может стать очень трудно определить, какой символ относится к какому фактическому объекту. Если имя изменено, необходимо внимательно изучить код, в котором оно используется.

Напротив, в IP-системе все определения присваивают объектам не только символические имена, но и уникальные частные идентификаторы . Это означает, что в среде разработки IP каждая ссылка на переменную или процедуру - это не просто имя - это ссылка на исходный объект.

Основным преимуществом этого является то, что если объект переименован, все ссылки на него в программе остаются действительными (это называется ссылочной целостностью ). Это также означает, что если одно и то же имя используется для уникальных определений в разных пространствах имен (например, " .to_string()"), ссылки с тем же именем, но с разными идентификаторами не будут переименованы, как это иногда происходит при поиске / замене в текущих редакторах. Эта функция также упрощает создание многоязычных версий программы; он может иметь набор имен на английском языке для всех определений, а также набор имен на японском языке, которые можно менять местами по желанию.

Наличие уникального идентификатора для каждого определенного объекта в программе также упрощает выполнение задач автоматического рефакторинга , а также упрощает проверку кода в системах управления версиями . Например, во многих современных системах совместной работы кода (например, Git ), когда два программиста фиксируют изменения, которые конфликтуют (т. Е. Если один программист переименовывает функцию, а другой изменяет одну из строк в этой функции), система управления версиями будет думать, что один программист создал новая функция, в то время как другая модифицировала старую функцию. В системе управления версиями IP он будет знать, что один программист просто изменил имя, а другой изменил код.

Уровни детализации

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

<<print the numbers 1 to 10>>

Таким образом, IP-системы в значительной степени самодокументируются , что позволяет программисту иметь хорошее общее представление о программе в целом.

Похожие работы

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

Смотрите также

использованная литература

внешние ссылки