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

редактировать

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

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

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

Содержание
  • 1 Цикл разработки
  • 2 Разделение хранения исходного кода и представления
  • 3 Пример программирования
    • 3.1 Идентификация
    • 3.2 Уровни детализации
  • 4 Подобные работы
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Цикл разработки

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

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

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

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

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

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

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

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

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

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

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

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

Идентичность

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

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

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

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

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

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

<>

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

Подобные работы

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

См. также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-24 04:03:28
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте