stringtranslate.com

Намеренное программирование

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

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

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

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

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

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

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

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

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

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

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

 for ( int i = 1 ; i <= 10 ; i ++ ) { System.out.println ( " число равно " + i ) ; }             

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

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

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

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

Личность

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

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

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

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

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

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

<<выведите числа от 1 до 10>>

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

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

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

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

Ссылки

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

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