Обобщенное программирование. Обобщённое программирование

Последнее обновление: 28.09.2017

C выходом версии 2.0 фреймворк.NET стал поддерживать обобщенные типы (generics), а также создание обобщенных методов. Чтобы разобраться в особенности данного явления, сначала посмотрим на проблему, которая могла возникнуть до появления обобщенных типов. Посмотрим на примере. Допустим, мы определяем класс для представления банковского счета. К примеру, он мог бы выглядеть следующим образом:

Class Account { public int Id { get; set; } public int Sum { get; set; } }

Класс Account определяет два свойства: Id - уникальный идентификатор и Sum - сумму на счете.

Здесь идентификатор задан как числовое значение, то есть банковские счета будут иметь значения 1, 2, 3, 4 и так далее. Однако также нередко для идентификатора используются и строковые значения. И у числовых, и у строковых значений есть свои плюсы и минусы. И на момент написания класса мы можем точно не знать, что лучше выбрать для хранения идентификатора - строки или числа. Либо, возможно, этот класс будет использоваться другими разработчиками, которые могут иметь свое мнение по данной проблеме.

И на первый взгляд, чтобы выйти из подобной ситуации, мы можем определить свойство Id как свойство типа object. Так как тип object является универсальным типом, от которого наследуется все типы, соответственно в свойствах подобного типа мы можем сохранить и строки, и числа:

Class Account { public object Id { get; set; } public int Sum { get; set; } }

Затем этот класс можно было использовать для создания банковских счетов в программе:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; account2.Id = "4356"; int id1 = (int)account1.Id; string id2 = (string)account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Все вроде замечательно работает, но такое решение является не очень оптимальным. Дело в том, что в данном случае мы сталкиваемся с такими явлениями как упаковка (boxing) и распаковка (unboxing) .

Так, при присвоении свойству Id значения типа int, происходит упаковка этого значения в тип Object:

Account1.Id = 2; // упаковка в значения int в тип Object

Чтобы обратно получить данные в переменную типов int, необходимо выполнить распаковку:

Int id1 = (int)account1.Id; // Распаковка в тип int

Упаковка (boxing) предполагает преобразование объекта значимого типа (например, типа int) к типу object. При упаковке общеязыковая среда CLR обертывает значение в объект типа System.Object и сохраняет его в управляемой куче (хипе). Распаковка (unboxing), наоборот, предполагает преобразование объекта типа object к значимому типу. Упаковка и распаковка ведут к снижению производительности, так как системе надо осуществить необходимые преобразования.

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

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id2 = (int)account2.Id; // Исключение InvalidCastException

Мы можем не знать, какий именно объект представляет Id, и при попытке получить число в данном случае мы столкнемся с исключением InvalidCastException.

Эти проблемы были призваны устранить обобщенные типы. Обобщенные типы позволяют указать конкретный тип, который будет использоваться. Поэтому определим класс Account как обощенный:

Class Account { public T Id { get; set; } public int Sum { get; set; } }

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

Например, вместо параметра T можно использовать объект int, то есть число, представляющее номер счета. Это также может быть объект string, либо или любой другой класс или структура:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; // упаковка не нужна account2.Id = "4356"; int id1 = account1.Id; // распаковка не нужна string id2 = account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Поскольку класс Account является обобщенным, то при определении переменной после названия типа в угловых скобках необходимо указать тот тип, который будет использоваться вместо универсального параметра T. В данном случае объекты Account типизируется типами int и string:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 };

Поэтому у первого объекта account1 свойство Id будет иметь тип int, а у объекта account2 - тип string.

При попытке присвоить значение свойства Id переменной другого типа мы получим ошибку компиляции:

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id1 = account2.Id; // ошибка компиляции

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

Значения по умолчанию

Иногда возникает необходимость присвоить переменным универсальных параметров некоторое начальное значение, в том числе и null. Но напрямую мы его присвоить не можем:

T id = null;

В этом случае нам надо использовать оператор default(T) . Он присваивает ссылочным типам в качестве значения null, а типам значений - значение 0:

Class Account { T id = default(T); }

Статические поля обобщенных классов

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

Class Account { public static T session; public T Id { get; set; } public int Sum { get; set; } }

Теперь типизируем класс двумя типами int и string:

Account account1 = new Account { Sum = 5000 }; Account.session = 5436; Account account2 = new Account { Sum = 4000 }; Account.session = "45245"; Console.WriteLine(Account.session); // 5436 Console.WriteLine(Account.session); // 45245

В итоге для Account и для Account будет создана своя переменная session.

Использование нескольких универсальных параметров

Обобщения могут использовать несколько универсальных параметров одновременно, которые могут представлять различные типы:

Class Transaction { public U FromAccount { get; set; } // с какого счета перевод public U ToAccount { get; set; } // на какой счет перевод public V Code { get; set; } // код операции public int Sum { get; set; } // сумма перевода }

Здесь класс Transaction использует два универсальных параметра. Применим данный класс:

Account acc1 = new Account { Id = 1857, Sum = 4500 }; Account acc2 = new Account { Id = 3453, Sum = 5000 }; Transaction, string> transaction1 = new Transaction, string> { FromAccount = acc1, ToAccount = acc2, Code = "45478758", Sum = 900 };

Здесь объект Transaction типизируется типами Account и string. То есть в качестве универсального параметра U используется класс Account, а для параметра V - тип string. При этом, как можно заметить, класс, которым типизируется Transaction, сам является обобщенным.

Обобщенные методы

Кроме обобщенных классов можно также создавать обобщенные методы, которые точно также будут использовать универсальные параметры. Например:

Class Program { private static void Main(string args) { int x = 7; int y = 25; Swap(ref x, ref y); Console.WriteLine($"x={x} y={y}"); // x=25 y=7 string s1 = "hello"; string s2 = "bye"; Swap(ref s1, ref s2); Console.WriteLine($"s1={s1} s2={s2}"); // s1=bye s2=hello Console.Read(); } public static void Swap (ref T x, ref T y) { T temp = x; x = y; y = temp; } }

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

В методе Main вызываем метод Swap, типизируем его определенным типом и передаем ему некоторые значения.

Cтраница 1


Описанную выше обобщенную программу решения стационарной задачи можно легко приспособить для расчета методом конечных разностей распределения температур в радиальном ребре прямоугольного профиля. Для того чтобы избежать неудобств, связанных с применением в расчетах числа л, нами было использовано предложение Дюсин-бера о проведении вычислений для сектора ребра в пределах угла в 1 / 2 радиана.  

Операционные системы - это обобщенные программы, применяемые для управления последовательностью выполнения программ, при котором обеспечивается возможность контроля и вмешательства со стороны оператора, а также переключения им управления на себя. Язык операционных систем составляют параметры управления, которыми оператор пользуется, чтобы устанавливать и направлять последовательность выполнения программ. Освобождая программиста от большого количества учетной и диспетчерской черной работы и принимая ее на себя, операционная система, работающая в реальном масштабе времени, упрощает процесс программирования для ЭВМ управления процессом.  

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

Система разработана фирмой ИБМ и является системой обобщенных программ, выполняющих функции определения, создания, ведения и опрашивания файлов. Она реализована на ЭВМ IBM-360 и выполняется под управлением операционной системы ОС / 360 с оперативной памятью не менее 192 Кбайт.  


Используя методы вычислений в конечных разностях совместно с обобщенной программой для решения стационарных и нестационарных задач теплопроводности на ЭВМ, Винд получил профили температур для радиальных ребер при произвольном распределении коэффициента теплоотдачи. Были рассмотрены радиальные ребра прямоугольного 0 9 и треугольного профилей. Однако эту программу можно применить и для расчета радиальных ребер других форм, таких как параболическая, трапециевидная и гиперболическая.  

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

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

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

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

Обобщенные программы являются результатом более широкого применения методов стандартных подпрограмм: они включают многократно используемые общие программы, например программы регистрации, программы ввода и вывода данных, матричных операций и регрессионного анализа. Для того, чтобы сделать обобщенную программу пригодной для выполнения работы в каждом конкретном случае, необходима только спецификация (перечень значений) требуемых параметров.  

Наряду с упрощением программы модификация адреса имеет еще одно преимущество: если бы в результате сложения данных понадобилось изменить m или п, то это легко достигается без других изменений в основной части программы. Таким образом, модификация позволяет писать обобщенные программы, которые не зависят от фактического размера массива данных.  

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

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

Затем в виде параметрического полиморфизма в и его потомках, а затем во многих объектно-ориентированных языках, таких как C++ , Java , Object Pascal , , Eiffel , языках для платформы .NET и других.

Методология обобщённого программирования

Обобщённое программирование рассматривается как методология программирования , основанная на разделении структур данных и алгоритмов через использование абстрактных описаний требований . Абстрактные описания требований являются расширением понятия абстрактного типа данных . Вместо описания отдельного типа в обобщённом программировании применяется описание семейства типов, имеющих общий интерфейс и семантическое поведение (англ. semantic behavior ). Набор требований, описывающий интерфейс и семантическое поведение, называется концепцией (англ. concept ). Таким образом, написанный в обобщённом стиле алгоритм может применяться для любых типов, удовлетворяющих его своими концепциями. Такая возможность называется полиморфизмом .

Говорят, что тип моделирует концепцию (является моделью концепции), если он удовлетворяет её требованиям. Концепция является уточнением другой концепции, если она дополняет последнюю. Требования к концепциям содержат следующую информацию:

  • Допустимые выражения (англ. valid expressions ) - выражения языка программирования, которые должны успешно компилироваться для типов, моделирующих концепцию.
  • Ассоциированные типы (англ. associated types ) - вспомогательные типы, имеющие некоторое отношение к моделирующему концепцию типу.
  • Инварианты (англ. invariants ) - такие характеристики типов, которые должны быть постоянно верны во время исполнения . Обычно выражаются в виде предусловий и постусловий . Невыполнение предусловия влечёт непредсказуемость соответствующей операции и может привести к ошибкам.
  • Гарантии сложности (англ. complexity guarantees ) - максимальное время выполнения допустимого выражения или максимальные требования к различным ресурсам в ходе выполнения этого выражения.

Альтернативный подход к определению обобщённого программирования, который можно назвать обобщённым программированием типов данных (англ. datatype generic programming ), был предложен Ричардом Бёрдом и Ламбертом Меертенсом. В нём структуры типов данных являются параметрами обобщённых программ. Для этого в язык программирования вводится новый уровень абстракции, а именно параметризация по отношению к классам алгебр с переменной сигнатурой . Хотя теории обоих подходов не зависят от языка программирования, подход Массера - Степанова, делающий упор на анализ концепций, сделал C++ своей основной платформой, тогда как обобщённое программирование типов данных используют почти исключительно Haskell и его варианты .

Общий механизм

Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы . Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.

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

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

Обобщённое программирование в языках

C++

В языке C++ обобщённое программирование основывается на понятии «шаблон», обозначаемом ключевым словом template . Широко применяется в стандартной библиотеке C++ (см. STL), а также в сторонних библиотеках boost , Loki . Большой вклад в появление развитых средств обобщённого программирования в C++ внёс Александр Степанов .

В качестве примера приведём шаблон (обобщение) функции, возвращающей большее значение из двух.

// Описание шаблона функции template < typename T > T max (T x , T y ) { if (x < y ) return y ; else return x ; } ... // Применение функции, заданной шаблоном int a = max (10 , 15 ); ... double f = max (123.11 , 123.12 ); ...

или шаблон(обобщение) класса связного списка:

template < class T > class List { /* ... */ public : void Add ( const T & Element ); bool Find ( const T & Element ); /* ... */ };

Java

Java предоставляет средства обобщённого программирования, синтаксически основанные на C++, начиная с версии J2SE 5.0. В этом языке имеются generics или «контейнеры типа T» - подмножество обобщённого программирования.

.NET

// http://digitalmars.com/d/2.0/template.html template Foo (T , R ...) // T - тип, R - набор типов { void Foo (T t , R r ) { writeln (t ); static if (r . length ) // if more arguments Foo (r ); // do the rest of the arguments } } void main () { Foo (1 , "a" , 6.8 ); } /+++++++++++++++ prints: 1 a 6.8 +++++++++++++++/

нем. Programmusik, франц. musique а programme, итал. musica a programma, англ. programme music

Музыкальные произведения, имеющие определённую словесную, нередко поэтич. программу и раскрывающие запёчатлённое в ней содержание. Явление муз. программности связано со специфич. чертами музыки, отличающими её от др. иск-в. В области отображения чувств, настроений, душевной жизни человека музыка имеет важные преимущества перед др. иск-вами. Косвенно, через чувства и настроения, музыка способна отразить мн. явления действительности. Однако она не в состоянии точно обозначить, что именно вызывает в человеке то или иное чувство, не способна достигнуть предметной, понятийной конкретности отображения. Возможностями такой конкретизации обладают речевой язык, литература. Стремясь к предметной, понятийной конкретизации, композиторы создают программные муз. произв.; предпосылая соч. программу, они заставляют средства речевого языка, художеств. лит-ры действовать в единстве, в синтезе с собственно муз. средствами. Единению музыки и лит-ры способствует и то, что они являются иск-вами временными, способными показывать рост, развитие образа. Единение разл. иск-в происходило издавна. В глубокой древности вообще не существовало самостоят. видов иск-в - они выступали вместе, в единстве, иск-во было синкретическим; одноврем. оно было тесно связано с трудовой деятельностью и с разл. рода ритуалами, обрядами. В эту пору каждое из иск-в было столь ограничено в средствах, что вне синкретич. единства, направленного на решение прикладных задач, существовать не могло. Последующее выделение иск-в определялось не только изменением бытового уклада, но и ростом возможностей каждого из них, достигнутым внутри синкретич. единства, связанным с этим ростом эстетич. чувства человека. В то же время единение иск-в никогда не прекращалось, включая и единение музыки со словом, поэзией - прежде всего во всевозможных вок. и вок.-драматич. жанрах. В нач. 19 в., после длительного периода существования музыки и поэзии как самостоятельных иск-в, тенденция к их единению ещё более усилилась. Это определялось уже не их слабостью, а скорее их силой, доведением до предела их собств. возможностей. Дальнейшее обогащение отображения действительности во всём её многообразии, во всех её аспектах могло быть достигнуто лишь совместным действием музыки и слова. И программность является одним из видов единения музыки и средств речевого языка, а также лит-ры, обозначающих или отображающих те стороны единого объекта отражения, передать к-рые своими собственными средствами музыка не в состоянии. Т. о., неотъемлемым элементом программного муз. произв. является словесная программа, созданная или избранная самим композитором, - будь то краткий программный заголовок, указывающий на явление действительности, к-рое имел в виду композитор (пьеса "Утро" Э. Грига из музыки к драме Г. Ибсена "Пер-Гюнт"), порой же "отсылающий" слушателя к определённому лит. произв. ("Макбет" Р. Штрауса - симф. поэма "по драме Шекспира"), или пространный отрывок из литературного произв., подробная программа, составленная композитором по тому или иному лит. произв. (симф. сюита (2-я симфония) "Антар" Римского-Корсакова по одноимённой сказке О. И. Сенковского) или вне связи с к.-л. лит. прообразом ("Фантастическая симфония" Берлиоза).

Не всякое заглавие, не всякое пояснение к музыке могут рассматриваться как её программа. Программа может исходить только от автора музыки. Если он не сообщил программы, значит сам его замысел был непрограммным. Если он сначала придал своему соч. программу, а потом отказался от неё, значит он перевёл своё соч. в разряд непрограммных. Программа не является разъяснением музыки, она дополняет её, раскрывая нечто отсутствующее в музыке, недоступное для воплощения муз. средствами (иначе она была бы излишней). Этим она принципиально отличается от любого анализа музыки непрограммного соч., любого описания его музыки - хотя бы и самого поэтичного, в т.ч. и от описания, принадлежащего автору соч. и указывающего на конкретные явления, к-рые вызвали в его творч. сознании те или иные муз. образы. И наоборот - программные соч. - это не "перевод" на язык музыки самой программы, но отражение муз. средствами того же объекта, к-рый обозначен, отражён в программе. Программой не являются и приданные самим автором заголовки, если они обозначают не конкретные явления действительности, но понятия эмоционального плана, к-рые музыка передаёт гораздо точнее (напр., заголовки типа "Грусть" и т.п.). Случается, что программа, приданная произв. самим автором, не находится в органич. единстве с музыкой, однако это определяется уже художеств. мастерством композитора, порой и тем, насколько удачно составлена или подобрана им словесная программа. К вопросу о существе явления программности это прямого отношения не имеет.

Определёнными средствами конкретизации обладает сам муз. язык. В их числе муз. изобразительность (см. Звукопись) - отражение различного рода звучаний действительности, ассоциативные представления, порождаемые муз. звуками - их высотой, длительностью, тембром. Важным средством конкретизации является также привлечение черт "прикладных" жанров - танцевальных, марша во всех его разновидностях и т.п. Конкретизации могут служить и нац.-характерные черты муз. языка, муз. стиль. Все эти средства конкретизации позволяют и без обращения к программности выражать общую концепцию соч. (напр., торжество светлых сил над тёмными и т.п.). И всё же они не дают той предметной, понятийной конкретизации, к-рая обеспечивается словесной программой. Более того, чем шире применены в муз. произв. собственно муз. средства конкретизации, тем более необходимыми для полноценного восприятия музыки оказываются слова, программа.

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

Второй осн. вид муз. программности - сюжетная программность. Источником сюжетов для программных произв. этого вида служит прежде всего художеств. лит-ра. В сюжетно-программном муз. произв. развитие муз. образов в целом или в частностях отвечает развитию сюжета. Различают программность обобщённо-сюжетную и последовательно- сюжетную. Автор соч., относящегося к обобщённо-сюжетному типу программности и связанного через программу с тем или иным лит. произв., не ставит целью показать обрисованные в нём события во всей их последовательности и сложности, но даёт муз. характеристику осн. образов лит. произв. и общего направления развития сюжета, исходного и итогового соотношения действующих сил. Напротив, автор произв., принадлежащего к последовательно-сюжетному типу программности, стремится отобразить и промежуточные этапы развития событий, порой всю последовательность событий. Обращение к этому типу программности диктуется сюжетами, в к-рых важное значение приобретают и срединные этапы развития, протекающего не прямолинейно, но связанного с введением новых персонажей, с изменением обстановки действия, с событиями, не являющимися непосредственным следствием предшествующей ситуации. Обращение к последовательно-сюжетной программности зависит и от творч. установок композитора. У разных композиторов одни и те же сюжеты зачастую претворяются по-разному. Напр., трагедия "Ромео и Джульетта" У. Шекспира вдохновила П. И. Чайковского на создание произв. обобщённо-сюжетного типа программности (увертюра-фантазия "Ромео и Джульетта"), Г. Берлиоза - на создание произв. последовательно-сюжетного типа программности (драм. симфония "Ромео и Джульетта", в к-рой автор даже выходит за пределы чистого симфонизма и привлекает вок. начало).

В области муз. языка невозможно установить отличит. признаки П. м. Это справедливо и в отношении формы программных произв. В соч., представляющих картинный тип программности, нет никаких предпосылок для возникновения специфич. структур. Задачи, к-рые ставят перед собой авторы программных произв. обобщённо-сюжетного типа, с успехом выполняются формами, выработанными в непрограммной музыке, в первую очередь формой сонатного allegro. Авторам программных соч. последовательно-сюжетного типа приходится создавать муз. форму, в большей или меньшей мере "параллельную" сюжету. Но строят они её, комбинируя элементы разл. форм непрограммной музыки, привлекая нек-рые широко представленные уже в ней приёмы развития. В их числе - вариационный метод. Он позволяет показывать изменения, не затрагивающие существа явления, касающиеся мн. важных черт, но сопряжённые с сохранением ряда качеств, что даёт возможность узнать образ, в каком бы новом облике он ни выступал. С вариационным методом тесно связан принцип монотематизма. Используя этот принцип в плане образной трансформации, столь широко применявшейся Ф. Листом в его симфонических поэмах и др. произв., композитор обретает большую свободу следования за сюжетом без опасности нарушить муз. цельность соч. Другой вид монотематизма, связанный с лейтмотивной характеристикой персонажей (см. Лейтмотив), находит применение гл. обр. в последовательно-сюжетных произв. Зародившись в опере, лейтмотивная характеристика была перенесена и в область инстр. музыки, где одним из первых и наиболее широко к ней прибегал Г. Берлиоз. Суть её заключается в том, что одна тема на протяжении всего соч. выступает как характеристика одного и того же героя. Она появляется каждый раз в новом контексте, обозначающем окружающую героя новую обстановку. Тема эта может меняться и сама, но изменения в ней не меняют её "предметного" смысла и отражают лишь перемены в состоянии того же героя, изменение представлений о нём. Приём лейтмотивной характеристики наиболее уместен в условиях цикличности, сюитности и оказывается мощным средством объединения контрастных частей цикла, раскрывающих единый сюжет. Облегчает воплощение в музыке последовательно-сюжетных замыслов и объединение в одночастной форме черт сонатного allegro и сонатно-симф. цикла, характерное для созданного Ф. Листом жанра симф. поэмы. Разл. этапы действия передаются с помощью относительно самостоят. эпизодов, контраст между к-рыми отвечает контрасту частей сонатно-симф. цикла, затем эти эпизоды "приводятся к единству" в сжатой репризе, причём в соответствии с программой выделяется тот или иной из них. С точки зрения цикла реприза обычно соответствует финалу, с точки зрения сонатного allegro 1-й и 2-й эпизоды отвечают экспозиции, 3-й ("скерцо" в цикле) - разработке. У Листа применение подобных синтетич. форм нередко сочетается с использованием принципа монотематизма. Все эти приёмы позволяли композиторам создавать муз. формы, отвечающие индивидуальным чертам сюжета и вместе с тем органичные и целостные. Однако новые синтетич. формы не могут считаться принадлежностью одной лишь программной музыки. Они возникли не только в связи с воплощением программных замыслов - в их появлении сказались и общие тенденции эпохи. Точно такие же структуры постоянно использовались и в непрограммной музыке.

Встречаются программные муз. соч., в к-рых в качестве программы привлекаются произв. живописи, скульптуры, даже архитектуры. Таковы, напр., симф. поэмы Листа "Битва гуннов" по фреске В. Каульбаха И "От колыбели до могилы" по рисунку М. Зичи, его же пьесы "Часовня Вильгельма Телля"; "Обручение" (к картине Рафаэля), "Мыслитель" (по статуе Микеланджело) из фп. циклов "Годы странствий" и др. Однако возможности предметной, понятийной конкретизации у этих иск-в не являются исчерпывающими. Не случайно живописные и скульптурные произв. снабжаются конкретизирующим названием, к-рое может рассматриваться как своеобразная их программа. Поэтому в муз. произв., написанных по тем или иным творениям изобразит, иск-в, по существу объединяются не только музыка и живопись, музыка и скульптура, но музыка, живопись и слово, музыка, скульптура и слово. И функции программы в них выполняет гл. обр. не произв. изобразит, иск-ва, но словесная программа. Это определяется прежде всего разноплановостью музыки как временного иск-ва и живописи и скульптуры как иск-в статичных, "пространственных". Что же касается архитектурных образов, они вообще неспособны конкретизировать музыку в предметно-понятийном плане; авторы муз. произв., связанных с архитектурными памятниками, как правило, вдохновлялись не столько ими самими, сколько история, событиями, разыгравшимися в них или вблизи них, легендами, к-рые о них сложились (пьеса "Вышеград" из симф. цикла Б. Сметаны "Моя родина", упомянутая выше фп. пьеса "Часовня Вильгельма Телля" Листа, к-рой автор не случайно предпослал эпиграф "Один за всех, все за одного").

Программность явилась большим завоеванием муз. иск-ва. Она обусловила обогащение круга образов действительности, находящих отражение в муз. произв., поиски новых выразит. средств, новых форм, способствовала обогащению и дифференциации форм и жанров. Обращение композитора к П. м. обычно определяется его связью с жизнью, с современностью, вниманием к актуальным проблемам, в др. случаях само способствует сближению композитора с действительностью, более глубокому её постижению. Однако кое в чём П. м. уступает музыке непрограммной. Программа суживает восприятие музыки, отвлекает внимание от выраженной в ней общей идеи. Воплощение сюжетных замыслов обычно сопряжено с муз. характеристиками, отличающимися большей или меньшей условностью. Отсюда двойственное отношение многих великих композиторов к программности, к-рая и притягивала их, и отталкивала (высказывания П. И. Чайковского, Г. Малера, Р. Штрауса и др.). П. м. не является неким: высшим родом музыки, как не является им и музыка непрограммная. Это равноправные, одинаково правомерные разновидности. Различие между ними не исключает их связи; оба рода связаны и с вок. музыкой. Так, колыбелью программного симфонизма были опера и оратория. Оперная увертюра явилась прототипом программной симф. поэмы; в оперном искусстве лежат и предпосылки лейтмотивизма и монотематизма, столь широко применяющихся в П. м. В свою очередь непрограммная инстр. музыка испытывает влияние вок. музыки и П. м. Найденные в П. м. новые выразит. возможности становятся достоянием и непрограммной музыки. Общие тенденции эпохи сказываются на развитии как П. м., так и непрограммной музыки.

Единство музыки и программы в программном соч. не является абсолютным, нерасторжимым. Случается, что программа не доводится до слушателя при исполнении соч., что лит. произв., к к-рому автор музыки отсылает слушателя, оказывается ему незнакомым. Чем более обобщённую форму избирает композитор для воплощения своего замысла, тем меньший ущерб восприятию нанесёт подобный "отрыв" музыки произведения от его программы. Такой "отрыв" всегда нежелателен, если речь идёт об исполнении совр. произведений. Однако он может оказаться и закономерным, когда речь идёт об исполнении произв. более ранней эпохи, поскольку программные замыслы с течением времени могут утратить прежнюю актуальность, значимость. В этих случаях муз. произв. в большей или меньшей степени утрачивают черты программности, превращаются в непрограммные. Т. о., грань между П. м. и музыкой непрограммной, вообще совершенно чёткая, в историч. аспекте условна.

П. м. развивалась по существу на протяжении всей истории проф. муз. иск-ва. Самое раннее из найденных исследователями сообщений о программных муз. соч. относится к 586 до н.э. - в этом году на пифийских играх в Дельфах (Др. Греция) авлетист Сакао исполнил пьесу Тимосфена, изображавшую битву Аполлона с драконом. Немало программных соч. было создано и в последующее время. В их числе - клавирные сонаты "Библейские истории" лейпцигского композитора И. Кунау, клавесинные миниатюры Ф. Куперена и Ж. Ф. Рамо, клавирное "Каприччо на отъезд возлюбленного брата" И. С. Баха. Представлена программность и в творчестве венских классиков. Среди их соч.: триада программных симфоний Й. Гайдна, характеризующих разл. времена суток (No 6, "Утро"; No 7, "Полдень"; No 8, "Вечер"), его же "Прощальная симфония"; "Пасторальная симфония" (No 6) Бетховена, все части к-рой снабжены программными подзаголовками и на партитуре к-рой значится пометка, важная для понимания типа программности у автора соч. - "Более выражение чувств, чем изображение", его же пьеса "Битва при Виттории", первоначально предназначавшаяся для механич. муз. инструмента пангармоникона, но затем исполнявшаяся в орк. редакции, и особенно его увертюры к балету "Творения Прометея", к трагедии "Кориолан" Коллина, увертюры "Леонора" No 1-3, увертюра к трагедии "Эгмонт" Гёте. Написанные как вступления к драм. или муз.-драм. произв., они вскоре же обрели самостоятельность. Позднее программные соч. также нередко создавались в качестве вступлений к к.-л. лит. произв., с течением времени утрачивая, однако, свои вступит. функции. Подлинный расцвет П. м. наступил в эпоху муз. романтизма. Сравнительно с представителями классицистской и даже просветительской эстетики художники-романтики глубже понимали специфику разл. иск-в. Они видели, что каждое из них отображает жизнь по-своему, используя свойственные только ему средства и отражая тот же предмет, явление с определённой, доступной ему стороны, что, следовательно, каждое из них в чём-то ограничено и даёт неполную картину действительности. Именно это привело художников-романтиков к мысли о синтезе иск-в ради более полного, многостороннего отображения мира. Муз. романтики провозгласили лозунг обновления музыки с помощью её связи с поэзией, нашедший претворение во мн. муз. произв. Программные соч. занимают важное место в творчестве Ф. Мендельсона-Бартольди (увертюра из музыки к "Сну в летнюю ночь" Шекспира, увертюры "Гебриды", или "Фингалова пещера", "Морская тишь и счастливое плавание", "Прекрасная Мелузина", "Рюи Блаз" и др.), Р. Шумана (увертюры к "Манфреду" Байрона, к сценам из "Фауста" Гёте, мн. фп. пьесы и циклы пьес и др.). Особенно большое значение П. м. приобретает у Г. Берлиоза ("Фантастическая симфония", симфония "Гарольд в Италии", драм. симфония "Ромео и Джульетта", "Траурно-триумфальная симфония", увертюры "Уиверли", "Тайные судьи", "Король Лир", "Роб Рой" и др.) и Ф. Листа (симфония "Фауст" и симфония к "Божественной комедии" Данте, 13 симф. поэм, мн. фп. пьесы и циклы пьес). В последующее время важный вклад в развитие П. м. внесли Б. Сметана (симф. поэмы "Ричард III", "Лагерь Валленштейна", "Гакон Ярл", цикл "Моя родина" из 6 поэм), А. Дворжак (симф. поэмы "Водяной", "Золотая прялка", "Лесной голубь" и др., увертюры - Гуситская, "Отелло" и др.) и Р. Штраус (симф. поэмы "Дон Жуан", "Смерть и просветление", "Макбет", "Тиль Уленшпигель", "Так говорил Заратустра", фантастич. вариации на рыцарскую тему "Дон Кихот", "Домашняя симфония" и др.). Программные соч. создавали также К. Дебюсси (орк. прелюдия "Послеполуденный отдых фавна", симф. циклы "Ноктюрны", "Море" и др.), М. Регер (4 симф. поэмы по Бёклину), А. Онеггер (симф. поэма "Песнь Нигамона", симф. движения "Пасифик 231", "Регби" и др.), П. Хиндемит (симфонии "Художник Матис", "Гармония мира" и др.).

Богатое развитие программность получила в рус. музыке. Для рус. нац. муз. школы обращение к программности диктовалось эстетич. установками её ведущих представителей, их стремлением к демократичности, общепонятности своих соч., а также "объективным" характером их творчества. От сочинений, осн. на песенных темах и потому заключающих в себе элементы синтеза музыки и слова, поскольку слушатель при их восприятии соотносит с музыкой тексты соответств. песен ("Камаринская" Глинки), рус. композиторы вскоре же пришли к собственно П. м. Ряд выдающихся программных соч. создали члены "Могучей кучки" - М. А. Балакирев (симф. поэма "Тамара"), М. П. Мусоргский ("Картинки с выставки" для фп.), Н. А. Римский-Корсаков (симф. картина "Садко", симфония "Антар"). Немалое число программных произв. принадлежит П. И. Чайковскому (1-я симфония "Зимние грёзы", симфония "Манфред", увертюра-фантазия "Ромео и Джульетта", симф. поэма "Франческа да Римини" и др.). Яркие программные произв. написали и А. К. Глазунов (симф. поэма "Стенька Разин"), А. К. Лядов (симф. картины "Баба-Яга", "Волшебное озеро" и "Кикимора"), Вас. С. Калинников (симф. картина "Кедр и пальма"), С. В. Рахманинов (симф. фантазия "Утёс", симф. поэма "Остров мёртвых"), А. Н. Скрябин (симф. "Поэма экстаза", "Поэма огня" ("Прометей"), мн. фп. пьесы).

Программность широко представлена и в творчестве сов. композиторов, в т.ч. С. С. Прокофьева ("Скифская сюита" для оркестра, симф. эскиз "Осеннее", симф. картина "Сны", фп. пьесы), Н. Я. Мясковского (симф. поэмы "Молчание" и "Аластор", симфонии No 10, 12, 16 и др.), Д. Д. Шостаковича (симфонии No 2, 3 ("Первомайская"), 11 ("1905 год"), 12 ("1917 год") и др.). Программные соч. создаются и представителями более молодых поколений сов. композиторов.

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

Важный вклад в освещение явления программности внесли сами композиторы, работавшие в этой области, - Ф. Лист, Г. Берлиоз и др. В последующее время, несмотря на исследования, прояснившие нек-рые частные вопросы, заруб. музыковедение не только не продвинулось вперёд в понимании явления П. м., но скорее отдалилось от него. Показательно, напр., что авторы статей о П. м., помещённых в крупнейших зап.-европ. муз. энциклопедиях и долженствующих обобщить опыт исследования проблемы, дают явлению программности очень расплывчатые определения (см. Grovйs Dictionary of music and musicians, v. 6, L.-N. Y., 1954; Riemann Musiklexikon, Sachteil, Mainz, 1967), порой же вообще отказываются от к.-л. определений (Die Musik in Geschichte und Gegenwart. Allgemeine Enzyklopдdie der Musik, Bd 10, Kassel u. a., 1962).

В России изучение проблемы программности началось ещё в период деятельности рус. классич. муз. школы, представители к-рой оставили важные высказывания по этому вопросу. Внимание к проблеме программности особенно усилилось в сов. время. В 1950-е гг. на страницах журн. "Советская музыка" и газ. "Советское искусство" прошла спец. дискуссия по вопросу о муз. программности. Эта дискуссия выявила и расхождения в понимании явления П. м. Высказывались, напр., мысли о "программности в строгом смысле слова" и в широком понимании термина, о программности "объявленной" и "необъявленной", о программности "для себя" (композитора) и для слушателей, о программности "осознанной" и "неосознанной", о программности в непрограммной музыке и др. Существо всех этих высказываний сводится к признанию возможности П. м. без программы, приданной соч. самим композитором. Подобная точка зрения неизбежно приводит к отождествлению программности с содержательностью, к объявлению программной всей музыки, к оправданию "отгадывания" необъявленных программ, т.е. произвольного истолкования композиторских замыслов, против к-рого всегда резко выступали сами композиторы. В 50-60-е гг. появилось немало работ, которые внесли определённый вклад в разработку проблем программности, в частности в область разграничения видов П. м. Однако единое понимание явления программности ещё не установилось.

Литература: Чайковский П. И., Письма к H. P. фон-Мекк от 17 февраля/1 марта 1878 и 5/17 декабря 1878, в кн.: Чайковский П. И., Переписка с Н.Ф.фон-Мекк, т. 1, М.-Л., 1934, то же, Полн. собр. соч., т. VII, М., 1961 с. 124-128, 513-514; его же, О программной музыке, М.-Л., 1952; Кюи Ц. A., Русский романс. Очерк его развития, СПБ, 1896, с. 5; Ларош, Нечто о программной музыке, "Мир искусства", 1900, т. 3, с. 87-98; его же, Предисловие переводчика к книге Ганслика "О музыкально-прекрасном", Собр. муз.-критич. статей, т. 1, М., 1913, с. 334-61; его же, Один из противников Ганслика, там же, с. 362-85; Стасов В. В., Искусство в XIX веке, в кн.: XIX век, СПБ, 1901, то же, в его кн.: Избр. соч., т. 3, М., 1952; Ястребцев В. В., Мои воспоминания о Н. А. Римском-Корсакове, вып. 1, П., 1917, Л., 1959, с. 95; Шостакович Д., О подлинной и мнимой программности, "СМ", 1951, No 5; Бобровский В. П., Сонатная форма в русской классической программной музыке, М., 1953 (автореферат дисс.); Сабинина М., Что такое программная музыка?, "МЖ", 1959, No 7; Арановский М., Что такое программная музыка?, М., 1962; Tюлин Ю. Н., О программности в произведениях Шопена, Л., 1963, М., 1968; Хохлов Ю., О музыкальной программности, М., 1963; Ауэрбах Л., Рассматривая проблемы программности, "СМ", 1965, No 11. См. также лит. при статьях Эстетика музыкальная, Музыка, Звукопись, Монотематизм, Симфоническая поэма.

Н. А. Римского-Корсакова «Шехеразада», перед нами возникают образы жестокого султана Шахрияра, искусной сказительницы Шехеразады, величественная картина моря и уплывающий вдаль корабль Синдбада-морехода. Арабские сказки «Тысяча и одна ночь» стали программой этого замечательного произведения. Римский-Корсаков кратко изложил ее в литературном предисловии. Но уже название сюиты направляет внимание слушателей на восприятие определенного содержания.

Г. Берлиоз.

К программным (от греческого «программа» - «объявление», «распоряжение») относятся музыкальные произведения, которые имеют определенный заголовок или литературное предисловие, созданное или избранное самим композитором. Благодаря конкретному содержанию программная музыка более доступна и понятна слушателям. Ее выразительные средства особенно рельефны и ярки. В программных произведениях композиторы широко используют оркестровую звукопись, изобразительность, сильнее подчеркивают контраст между образами-темами, разделами формы и др.

Богат и разнообразен круг образов и тем программной музыки. Это и картина природы - нежные краски «Рассвета на Москве-реке» в увертюре к опере М. П. Мусоргского «Хованщина»; мрачное Дарьяльское ущелье, Терек и замок царицы Тамары в симфонической поэме М. А. Балакирева «Тамара»; поэтичные пейзажи в произведениях К. Дебюсси «Море», «Лунный свет». Сочные, колоритные картины народных праздников воссозданы в симфонических произведениях М. И. Глинки «Камаринская» и «Арагонская хота».

Многие сочинения этого вида музыки связаны с замечательными произведениями мировой литературы. Обращаясь к ним, композиторы в музыке стремятся раскрыть те нравственные проблемы, над которыми размышляли поэты, писатели. К «Божественной комедии» Данте обращались П. И. Чайковский (фантазия «Франческа да Римини»), Ф. Лист («Симфония к „Божественной комедии" Данте»). Трагедией У. Шекспира «Ромео и Джульетта» вдохновлены одноименные симфония Г. Берлиоза и увертюра-фантазия Чайковского, трагедией «Гамлет» - симфония Листа. Одна из лучших увертюр Р. Шумана написана к драматической поэме Дж. Г. Байрона «Манфред». Пафос борьбы и победы, бессмертие подвига героя, отдавшего жизнь за свободу родины, выразил Л. Бетховен в увертюре к драме И. В. Гёте «Эгмонт».

К программным произведениям относятся сочинения, которые принято называть музыкальными портретами. Это фортепьянная прелюдия Дебюсси «Девушка с волосами цвета льна», пьеса для клавесина «Египтянка» Ж. Ф. Рамо, фортепьянные миниатюры Шумана «Паганини» и «Шопен».

Иногда программа музыкального сочинения бывает навеяна произведениями изобразительного искусства. В фортепьянной сюите «Картинки с выставки» Мусоргского отразились впечатления композитора от выставки картин художника В. А. Гартмана.

Масштабные, монументальные произведения программной музыки связаны с важнейшими историческими событиями. Таковы, например, симфонии Д. Д. Шостаковича «1905 год», «1917 год», посвященные 1-й русской революции 1905-1907 гг. и Октябрьской революции.

Программная музыка издавна привлекала многих композиторов. Изящные пьесы в стиле рококо писали для клавесина французские композиторы 2-й половины XVII - начала XVIII в. Л. К. Дакен («Кукушка»), Ф. Куперен («Сборщицы винограда»), Рамо («Принцесса»). Итальянский композитор А. Вивальди четыре скрипичных концерта объединил под общим названием «Времена года». В них созданы тонкие музыкальные зарисовки природы, пасторальные сценки. Содержание каждого концерта композитор изложил в развернутой литературной программе. И. С. Бах одну из пьес для клавира шутливо назвал «Каприччо на отъезд возлюбленного брата». В творческом наследии Й. Гайдна больше 100 симфоний. Среди них есть и программные: «Утро», «Полдень», «Вечер и буря».

Важное место заняла программная музыка в творчестве композиторов-романтиков . Портреты, жанровые сценки, настроения, тончайшие оттенки человеческих чувств тонко и вдохновенно раскрыты в музыке Шумана (фортепьянные циклы «Карнавал», «Детские сцены», «Крейслериана», «Арабеска»). Своеобразным музыкальным дневником стал большой фортепьянный цикл Листа «Годы странствий». Под впечатлением от поездки в Швейцарию написаны им пьесы «Часовня Вильгельма Телля», «Женевские колокола», «На Валлендштадском озере». В Италии композитора покорило искусство великих мастеров эпохи Возрождения . Поэзия Петрарки, картина Рафаэля «Обручение», скульптура Микеланджело «Мыслитель» стали своеобразной программой в музыке Листа.

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

К программной музыке часто обращались русские композиторы. Фантастические, сказочные сюжеты легли в основу симфонических картин: «Ночь на Лысой горе» Мусоргского, «Садко» Римского-Корсакова, «Баба-Яга», «Кикимора», «Волшебное озеро» А. К. Лядова. Созидательную силу человеческой воли и разума воспел А. Н. Скрябин в симфонической поэме «Прометей» («Поэма огня»).

Программная музыка занимает большое место в творчестве советских композиторов. Среди симфоний Н. Я. Мясковского есть «Колхозная», «Авиационная». С. С. Прокофьев написал симфоническое произведение «Скифская сюита», фортепьянные пьесы «Мимолетности», «Сарказмы»; Р. К. Щедрин - концерты для оркестра «Озорные частушки», «Звоны»; М. К. Койшибаев - поэму для оркестра казахских народных инструментов «Советский Казахстан»; З. М. Шахиди - симфоническую поэму «Бузрук».