Programming paradigm which encodes the programmer's intention
В компьютерном программировании, интенциональное программирование – это парадигма программирования, разработанная Чарльзом Симоньи, которая кодирует в исходном коде программного обеспечения точное намерение, которое программисты (или пользователи) имеют в виду при создании своих работ. Использование соответствующего уровня абстракции, на котором мыслит программист, упрощает создание и поддержку компьютерных программ. Разделение забот о намерениях и способах их реализации делает программное обеспечение более модульным и позволяет повторно использовать программный код. Интенциональное программирование было разработано бывшим главным архитектором 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.
In computer programming, Intentional Programming is a programming paradigm developed by Charles Simonyi that encodes in software source code the precise intention which programmers (or users) have in mind when conceiving their work. By using the appropriate level of abstraction at which the programmer is thinking, creating and maintaining computer programs become easier. By separating the concerns for intentions and how they are being operated upon, the software becomes more modular and allows for more reusable software code. Intentional Programming was developed by former Microsoft chief architect Charles Simonyi, who led a team in Microsoft Research, which developed the paradigm and built an integrated development environment (IDE) called IP (for Intentional Programming) that demonstrated the paradigm. Microsoft decided not to productize the Intentional Programming paradigm, as in the early 2000s Microsoft was rolling out C# and NET to counter Java adoption. Charles Simonyi decided, with approval of Microsoft, to take his idea out from Microsoft and commercialize it himself. He founded the company Intentional Software to pursue this. Microsoft licensed the Intentional Programming patents Simonyi had acquired while at Microsoft, but no source code, to Intentional Software. An overview of Intentional Programming as it was developed at Microsoft Research is given in Chapter 11 of the book Generative Programming: Methods, Tools, and Applications.
Цикл разработки
Как задумал Симони, разработка нового приложения с использованием парадигмы преднамеренного программирования происходит следующим образом. Программист создает среду, подобную WYSIWYG, поддерживающую схему и нотацию бизнес-знаний для конкретной предметной области (например, приложения для повышения производительности или страхование жизни). Пользователи затем используют эту среду для формулирования своих намерений, которые фиксируются на высоком уровне абстракции. Среда может обрабатывать эти намерения и помогать пользователю создавать семантически насыщенные документы, которые можно обрабатывать и выполнять, подобно электронной таблице. Зафиксированные знания выполняются интерпретатором или компилируются для генерации финальной программы. Последующие изменения вносятся исключительно на уровне WYSIWYG. В отличие от текстовых процессоров, электронных таблиц или программ для презентаций, среда преднамеренного программирования обеспечивает более широкую поддержку структуры и семантики выражаемых намерений и позволяет создавать интерактивные документы, более полно отражающие цели пользователя. Особым случаем является ситуация, когда контент представляет собой программный код, в этом случае среда превращается в интеллектуальную IDE.
As envisioned by Simonyi, developing a new application via the Intentional Programming paradigm proceeds as follows. A programmer builds a WYSIWYG like environment supporting the schema and notation of business knowledge for a given problem domain (such as productivity applications or life insurance). Users then use this environment to capture their intentions, which are recorded at high level of abstraction. The environment can operate on these intentions and assist the user to create semantically richer documents that can be processed and executed, similar to a spreadsheet. The recorded knowledge is executed by an evaluator or is compiled to generate the final program. Successive changes are done at the WYSIWYG level only. As opposed to word processors, spreadsheets or presentation software, an Intentional environment has more support for structure and semantics of the intentions to be expressed, and can create interactive documents that capture more richly what the user is trying to accomplish. A special case is when the content is program code, and the environment becomes an intelligent IDE.
Разделение хранения и представления исходного кода
Ключ к преимуществам намеренного программирования заключается в том, что доменный код, отражающий намерения, хранится не в текстовых файлах исходного кода, а в древовидном хранилище (которое может быть бинарным или XML). Тесная интеграция среды разработки с форматом хранения позволяет привнести в исходный код некоторые преимущества нормализации баз данных. Избыточность устраняется за счет присвоения каждому определению уникального идентификатора и хранения имен переменных и операторов в единственном месте. Это упрощает внутреннее различие между объявлениями и ссылками, и среда разработки может отображать их по-разному. Пробелы в программе также не хранятся как часть исходного кода, и каждый программист, работающий над проектом, может выбрать свой стиль отступов. Более радикальные варианты визуализации включают отображение списков операторов в виде вложенных блоков, редактирование условных выражений в виде логических элементов или перерисовку имен китайскими иероглифами. Система использует нормализованный язык для популярных языков, таких как C++ и Java, позволяя пользователям среды комбинировать их с идеями из Eiffel и других языков. Намеренное программирование часто упоминается в контексте языко-ориентированного программирования через предметно-ориентированные языки и аспектно-ориентированного программирования, и претендует на обеспечение прорывов в генеративном программировании. Эти методы позволяют разработчикам расширять среду разработки для включения предметно-ориентированных конструкций без необходимости разработки полноценного компилятора и редактора для новых языков.
Key to the benefits of Intentional Programming is that domain code which capture the intentions are not stored in source code text files, but in a tree based storage (could be binary or XML). Tight integration of the environment with the storage format brings some of the nicer features of database normalization to source code. Redundancy is eliminated by giving each definition a unique identity, and storing the name of variables and operators in exactly one place. This makes it easier to intrinsically distinguish declarations from references, and the environment can show them differently. Whitespace in a program is also not stored as part of the source code, and each programmer working on a project can choose an indentation display of the source. More radical visualizations include showing statement lists as nested boxes, editing conditional expressions as logic gates, or re rendering names in Chinese. The system uses a normalized language for popular languages like C++ and Java, while letting users of the environment mix and match these with ideas from Eiffel and other languages. Often mentioned in the same context as language oriented programming via domain specific languages, and aspect oriented programming, IP purports to provide some breakthroughs in generative programming. These techniques allow developers to extend the language environment to capture domain specific constructs without investing in writing a full compiler and editor for any new languages.
Личность
ИС фокусируется на концепции идентичности. Поскольку большинство языков программирования представляют исходный код в виде обычного текста, объекты определяются именами, и их уникальность должна выводиться компилятором. Например, одно и то же символическое имя может использоваться для именования различных переменных, процедур или даже типов. В коде, занимающем несколько страниц – или, для глобально видимых имен, несколько файлов – может быть очень сложно определить, какой символ относится к какому конкретному объекту. Если имя изменяется, код, в котором оно используется, необходимо тщательно проверять. В отличие от этого, в системе ИС все определения присваивают объектам не только символические имена, но и уникальные приватные идентификаторы. Это означает, что в среде разработки ИС каждая ссылка на переменную или процедуру – это не просто имя, а связь с исходной сущностью. Главное преимущество этого заключается в том, что при переименовании сущности все ссылки на нее в программе остаются действительными (это называется референциальной целостностью). Это также означает, что если одно и то же имя используется для уникальных определений в разных пространствах имен (например, ".to string"), ссылки с одинаковым именем, но разной идентичностью, не будут переименованы, как иногда происходит при поиске и замене в современных редакторах. Эта функция также упрощает создание многоязычных версий программы: можно иметь набор английских имен для всех определений и набор японских имен, которые можно переключать по желанию. Наличие уникальной идентичности для каждого определенного объекта в программе также облегчает выполнение автоматизированных задач рефакторинга и упрощает проверку кода в системах контроля версий. Например, во многих современных системах совместной разработки кода (например, Git), когда два программиста вносят конфликтующие изменения (то есть, если один программист переименовывает функцию, а другой изменяет одну из строк в этой функции), система контроля версий может решить, что один программист создал новую функцию, а другой изменил старую. В системе контроля версий ИС она поймет, что один программист просто изменил имя, а другой – код.
IP focuses on the concept of identity. Since most programming languages represent the source code as plain text, objects are defined by names, and their uniqueness has to be inferred by the compiler. For example, the same symbolic name may be used to name different variables, procedures, or even types. In code that spans several pages – or, for globally visible names, multiple files – it can become very difficult to tell what symbol refers to what actual object. If a name is changed, the code where it is used must carefully be examined. By contrast, in an IP system, all definitions not only assign symbolic names, but also unique private identifiers to objects. This means that in the IP development environment, every reference to a variable or procedure is not just a name – it is a link to the original entity. The major advantage of this is that if an entity is renamed, all of the references to it in the program remain valid (known as referential integrity). This also means that if the same name is used for unique definitions in different namespaces (such as ". to string "), references with the same name but different identity will not be renamed, as sometimes happens with search/replace in current editors. This feature also makes it easy to have multi language versions of the program; it can have a set of English language names for all the definitions as well as a set of Japanese language names which can be swapped in at will. Having a unique identity for every defined object in the program also makes it easy to perform automated refactoring tasks, as well as simplifying code check ins in versioning systems. For example, in many current code collaboration systems (e. g. Git), when two programmers commit changes that conflict (i. e. if one programmer renames a function while another changes one of the lines in that function), the versioning system will think that one programmer created a new function while another modified an old function. In an IP versioning system, it will know that one programmer merely changed a name while another changed the code.