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

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

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

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

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

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

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

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

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

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

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

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

 за (int я = 1; я <= 10; я++) {    Система.из.println("номер" + я); }

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

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

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

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

Личность

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

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

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

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

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

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

<<print the numbers 1 to 10>>

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

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

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

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

Рекомендации

  1. ^ "Симони объясняет:" Это было непрактично, когда Microsoft добивалась огромных успехов в .Сеть в ближайшем будущем, чтобы как-то послать кого-нибудь из той же организации, который сказал бы: «Это не то, как вы должны делать что-то - что, если бы вы сделали что-то другим, более разрушительным способом?» (цитата из "Все, что вы можете сделать, я могу, Мета", Вторник, 9 января 2007 г., Скотт Розенберг, Обзор технологий. В архиве 20 сентября 2020 в Archive.today )
  2. ^ Генеративное программирование: методы, инструменты и приложенияКшиштофа Чарнецкого и Ульриха Эйзенекера, Эддисон-Уэсли, Ридинг, Массачусетс, США, июнь 2000 г.
  3. ^ Скотт Розенберг: "Все, что вы можете сделать, я могу сделать Мета." Обзор технологий, 8 января 2007 г. В архиве 20 сентября 2020 в Archive.today

внешняя ссылка