sonyps4.ru

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

нем. 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. См. также лит. при статьях Эстетика музыкальная, Музыка, Звукопись, Монотематизм, Симфоническая поэма.

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

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

В языке С++ пользовательские типы могут быть наделены свойствами наследования и полиморфизма. Это позволяет программисту разрабатывать иерархические программные системы.

Важным является то обстоятельство, что имеется стандарт, утвержденный в 1998 поду, который определяет синтаксис языка С++ и его стандартную библиотеку.

Отметим, что в объектно-ориентированном программировании в центре внимания являются данные, а не алгоритмы как это имеет место в процедурном программировании.

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

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

template void swap(T &a, T &b) { T temp = a; a = b; b = temp; } int main() { double x = 2; double y = 3; swap(x, y); printf(“x= %0.4g y= %0.4g\n”, x, y); int n = 4; int m = 5; swap(n, m); printf(“n= %d m= %d\n”, n, m); return 0; }

Приведенный выше программный код начинается с определения шаблона функции swap(). Шаблон функции отличается от определения обычной функции наличием дополнительного префикса, который начинается с зарезервированного словаtemplate. В угловых скобках содержится так называемый список параметров шаблона. В рассматриваемом примере этот список содержит только один элемент, состоящий из зарезервированного словаclassимени параметра шаблонаT. Зарезервированное словоclassпоказывает, что параметр шаблонаTотносится к категории обобщенных типов (имеются и другие разновидности шаблонных параметров).

В вызывающей функции, которой

На пути к объектно-ориентированному программированию

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

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

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

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

Существуют два основных вида абстракций:

    Абстракция действия (процедурная абстракция).

    Абстракция сущности (абстрактный тип данных).

Абстракция действия, или процедурная абстракция реализуется в языке C++ с помощью аппарата функций. Используя функции, программист имеет возможность расширять то множество встроенных операций, которые предусмотрены языком.

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

    наличие специальной синтаксической конструкции, предназначенной для реализации абстракции (определение функции).

    возможность отделения интерфейса от реализации.

    сокрытие реализации алгоритма, реализующего действие, от клиента.

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

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

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

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

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

Способы реализации

Известно два основных способа реализации поддержки обобщённого программирования в компиляторе.

  • Порождение нового кода для каждой конкретизации. В этом варианте компилятор рассматривает обобщённое описание как текстовый шаблон для создания вариантов конкретизаций. Когда компилятору требуется новая конкретизация обобщённого типа или процедуры, он создаёт новый экземпляр типа или процедуры, чисто механически добавляя туда тип-параметр. То есть, имея обобщённую функцию перестановки элементов, компилятор, встретив её вызов для целого типа, создаст функцию перестановки целых чисел и подставит в код её вызов, а затем, встретив вызов для строкового типа - создаст функцию перестановки строк, никак не связанную с первой. Этот метод обеспечивает максимальное быстродействие, поскольку варианты конкретизаций становятся разными фрагментами программы, каждый из них может быть оптимизирован для своего типа-параметра, к тому же в код не включаются никакие лишние элементы, связанные с проверкой или преобразованием типов на этапе исполнения программы. Недостатком его является то, что при активном использовании обобщённых типов и функций с различными типами-параметрами размер откомпилированной программы может очень сильно возрастать, поскольку даже для тех фрагментов описания, которые для разных типов не различаются, компилятор всё равно генерирует отдельный код. Этот недостаток можно затушевать путём частичной генерации общего кода (часть обобщённого описания, которая не зависит от типов-параметров, оформляется специальным образом и по ней компилятор генерирует единый для всех конкретизаций код). Зато данный механизм даёт естественную возможность создания специальных (обычно - сильно вручную оптимизированных) конкретизаций обобщённых типов и функций для некоторых типов-параметров.
  • Порождение кода, который во время исполнения выполняет преобразование фактических параметров-типов к одному типу, с которым фактически и работает. В этом случае на этапе компиляции программы компилятор лишь проверяет соответствие типов и включает в код команды преобразования конкретного типа-параметра к общему типу. Код, определяющий функционирование обобщённого типа или функции, имеется в откомпилированной программе в единственном экземпляре, а преобразования и проверки типов выполняются динамически, во время работы программы. В этом варианте порождается, как правило, более компактный код, но программа оказывается в среднем медленнее, чем в первом варианте, из-за необходимости выполнения дополнительных операций и меньших возможностей оптимизации. Кроме того, в компилированный код для типов-параметров далеко не всегда включается динамическая информация о типах (в первом варианте она есть, если вообще поддерживается, поскольку конкретизации для каждого типа-параметра различны), что определяет некоторые ограничения на применение обобщённых типов и функций. Подобные ограничения есть, например, в Java.

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

C++

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

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

// Описание шаблонной функции template 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 ) ; ...

Java

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

.NET

Пример на

D

В языке «D» средства обобщённого программирования значительно эволюционировали в сравнении с С++, как в процедурной, так и в объектно ориентированной составляющей. Значительно проще стало и лингвистическое представление.

Пример рекурсивной генерации на основе шаблонов D:

// http://digitalmars.com/d/2.0/template.html template Foo(T, R...) // T - тип, R - набор типов { void Foo(T t, R r) { writefln(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 +++++++++++++++/


Wikimedia Foundation . 2010 .

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

    обобщенное программирование - — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN generalized programmingGP … Справочник технического переводчика

    Modern C++ Design

    Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Условные обозначения … Википедия

    У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия

    У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

    См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия

    У этого термина существуют и другие значения, см. F (значения). Правильный заголовок этой статьи F#. Он показан некорректно из за технических ограничений. F# Класс языка: мультипарадигменный: функциональное, объектно ориентированное,… … Википедия

    Этим сочетанием символов также часто обозначают аккорд или тональность Фа диез мажор F♯ это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F♯ во многом… … Википедия

    F# это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F# во многом схожа со структурой библиотек и среды исполнения.NET. Некоторые задачи решаются… … Википедия

    У этого термина существуют и другие значения, см. Loki (значения). Библиотека Loki для языка программирования C++ написана Андреем Александреску как часть книги «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны… … Википедия

Книги

  • Программирование. Принципы и практика с использованием C++ , Страуструп Бьярне. Эта книга не является учебником по языку C++, это учебник по программированию. Несмотря на то что ее автор - автор языка С++, книга не посвящена этому языку программирования; он играет в…

Которое можно применять к различным типам данных , не меняя само это описание. В том или ином виде поддерживается разными языками программирования . Возможности обобщённого программирования впервые появились в виде дженериков (обобщённых функций) в 1970-х годах в языках Клу и Ада , затем в виде параметрического полиморфизма в и его потомках, а затем во многих объектно-ориентированных языках, таких как C++ , Java , Object Pascal , , Eiffel , языках для платформы .NET и других.

Энциклопедичный YouTube

  • 1 / 5

    Обобщённое программирование рассматривается как методология программирования , основанная на разделении структур данных и алгоритмов через использование абстрактных описаний требований . Абстрактные описания требований являются расширением понятия абстрактного типа данных . Вместо описания отдельного типа в обобщённом программировании применяется описание семейства типов, имеющих общий интерфейс и семантическое поведение (англ. 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 ); ...

    Java

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



Загрузка...