В 1970-х годах с появлением ЭВМ третьего поколения возникает новый подход к разработке алгоритмов и программ, который получает название структурного проектирования программ . Одним из первых инициаторов структурного программирования был профессор Э.Дейкстра. В 1965 он высказал предположение, что оператор GoTo (оператор безусловного перехода) вообще может быть исключён из языков программирования.
По мнению Дейкстры «квалификация программиста обратно пропорциональна числу операторов GoTo в его программах». Достоинства структурного программирования по сравнению с интуитивным неструктурным программированием: 1) Уменьшение трудностей тестирования программ. 2) Более высокая производительность программистов. 3) Ясность и читаемость программ, что упрощает их сопровождение. 4) Эффективность программ.
3.1. Теория структурного программирования
К концепциям структурного программирования относится отказ от использования оператора безусловного перехода ( GoTo ), замена его рядом других структурированных операторов и использование идей нисходящего проектирования программ. Основное назначение нисходящего проектирования – служить средством разбиения большой задачи на меньшие подзадачи так, чтобы каждую подзадачу можно было рассматривать независимо.
Теория музыки — о Музыке
В предыдущем разделе кратко была описана суть метода нисходящего проектирования. Напомним, что при его использовании вначале проектируется общая структура алгоритма, без детальной проработки его отдельных частей. Затем разрабатываются блоки алгоритма, не детализированные на предыдущем шаге.
В результате на каждом шаге разработки детализируется фрагмент алгоритма, то есть решается более простая задача. В основу структурного программирования положено требование , чтобы каждый модуль алгоритма (программы) проектировался с единственным входом и единственным выходом. Программа представляется в виде множества вложенных модулей, каждый из которых имеет один вход и один выход. 46
Базой для реализации структурированных программ является принцип Бома и Джакопини , в соответствии с которым всякая реальная программа может быть построена с использованием лишь двух управляющих конструкций . По Бому и Джакопини логическая структура программы может быть выражена комбинациями трех базовых структур : 1) Функциональный блок; 2) Конструкция принятия двоичного (дихотомического) решения. 3) Конструкции обобщенного цикла.
Функциональный блок – это отдельный вычислительный оператор или любая другая реальная последовательность вычислений с единственным входом и единственным выходом. Изображается с помощью символа «Процесс» (рисунок 3.1).
Вычисления Рисунок 3.1 – Графическое представление функционального блока Конструкция принятия двоичного (дихотомического) решения обычно называется элементом If-Then-Else (если-то-иначе), разветвлением или ветвлением – структура, обеспечивающая выбор между двумя альтернативными путями вычислительного процесса в зависимости от выполнения некоторого условия. Изображается с помощью символов «Решение» и «Процесс» (рисунок 3.2).
Синтаксический разбор предложения. Как выполнить синтаксический разбор по членам предложения?
Конструкция обобщенного цикла – в качестве базовой конструкции структурного программирования используется цикл с предусловием, называемый циклом «Пока» ( Do-While ). Изображается с помощью символов «Решение» и «Процесс» (рисунок 3.3). Рисунок 3.2 – рисунок 3.3 показывают, что логические конструкции (конструкция принятия двоичного решения и конструкция обобщенного цикла) имеют только один вход и один выход. Поэтому они могут рассматриваться как функциональные блоки. C учётом этого вводится преобразование логических блоков в функциональный блок. 47
да | Условие | нет |
Первая | Вторая | |
подзадача | подзадача | |
Рисунок 3.2 – Графическое представление конструкции принятия | ||
двоичного решения |
нет ? да Тело цикла Рисунок 3.3 – Графическое представление конструкции обобщенного цикла Кроме того, всякая последовательность функциональных элементов, называемая конструкцией следования (рисунок 3.4), также может быть приведена к одному функциональному блоку. Данные преобразования называются преобразованиями БомаДжакопини . Их основу составляет принцип “чёрного ящика” (что-то с одним входом и одним выходом). 48
Рисунок 3.4 – Графическое представление конструкции следования Таким образом, всякая программа (или алгоритм), состоящая из функциональных блоков, конструкций цикла и элементов If-Then-Else, поддаётся последовательному преобразованию к единственному функциональному блоку. Эта последовательность преобразований может быть использована как средство понимания программы, доказательство ее правильности и структурированности. Обратная последовательность преобразований может быть использована в процессе проектирования алгоритма (программы) по методу нисходящего проектирования – алгоритм (программа) разрабатывается, исходя из единственного функционального блока, который постепенно раскрывается в сложную структуру основных элементов. 49
Источник: studfile.net
Обобщённое программирование
Обобщённое программирование (англ. generic programming ) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования. Возможности обобщённого программирования впервые появились в виде дженериков (обобщённых функций) в 1970-х годах в языках Клу и Ада, затем — в виде параметрического полиморфизма в ML и его потомках, а затем — во многих объектно-ориентированных языках, таких как C++, Python [1] , Java, Object Pascal [2] , D, Eiffel, языках для платформы .NET и других.
- 1 Методология обобщённого программирования
- 2 Общий механизм
- 3 Обобщённое программирование в языках
- 3.1 C++
- 3.2 Haskell
- 3.3 Java
- 3.4 .NET
- 3.5 Пример на C#
- 3.6 D
- 3.7 Object Pascal
- 3.8 Nim
Методология обобщённого программирования
Обобщённое программирование рассматривается как методология программирования, основанная на разделении структур данных и алгоритмов через использование абстрактных описаний требований [3] . Абстрактные описания требований являются расширением понятия абстрактного типа данных. Вместо описания отдельного типа в обобщённом программировании применяется описание семейства типов, имеющих общий интерфейс и семантическое поведение (англ. semantic behavior ). Набор требований, описывающий интерфейс и семантическое поведение, называется концепцией (англ. concept ). Таким образом, написанный в обобщённом стиле алгоритм может применяться для любых типов, удовлетворяющих его своими концепциями. Такая возможность называется полиморфизмом.
Говорят, что тип моделирует концепцию (является моделью концепции), если он удовлетворяет её требованиям. Концепция является уточнением другой концепции, если она дополняет последнюю. Требования к концепциям содержат следующую информацию: [4]
- Допустимые выражения (англ. valid expressions ) — выражения языка программирования, которые должны успешно компилироваться для типов, моделирующих концепцию.
- Ассоциированные типы (англ. associated types ) — вспомогательные типы, имеющие некоторое отношение к моделирующему концепцию типу.
- Инварианты (англ. invariants ) — такие характеристики типов, которые должны быть постоянно верны во время исполнения. Обычно выражаются в виде предусловий и постусловий. Невыполнение предусловия влечёт непредсказуемость соответствующей операции и может привести к ошибкам.
- Гарантии сложности (англ. complexity guarantees ) — максимальное время выполнения допустимого выражения или максимальные требования к различным ресурсам в ходе выполнения этого выражения.
В C++ ООП реализуется посредством виртуальных функций и наследования, а ОП (обобщённое программирование) — с помощью шаблонов классов и функций. Тем не менее, суть обеих методологий связана с конкретными технологиями реализации лишь косвенно. Говоря более формально, ООП основано на полиморфизме подтипов, а ОП — на параметрическом полиморфизме. В других языках то и другое может быть реализовано иначе. Например, мультиметоды в CLOS имеют сходную с параметрическим полиморфизмом семантику.
Массер и Степанов выделяют следующие этапы в решении задачи по методологии ОП:
- Найти полезный и эффективный алгоритм.
- Определить обобщённое представление (параметризовать алгоритм, минимизировав требования к обрабатываемым данным).
- Описать набор (минимальных) требований, удовлетворяя которые всё ещё можно получить эффективные алгоритмы.
- Создать каркас на основе классифицированных требований.
Минимизация и создание каркаса ставят целью создание такой структуры, при которой алгоритмы не зависят от конкретных типов данных. Этот подход отражён в структуре библиотеки STL. [5]
Альтернативный подход к определению обобщённого программирования, который можно назвать обобщённым программированием типов данных (англ. datatype generic programming ), был предложен Ричардом Бёрдом и Ламбертом Меертенсом. В нём структуры типов данных являются параметрами обобщённых программ. Для этого в язык программирования вводится новый уровень абстракции, а именно параметризация по отношению к классам алгебр с переменной сигнатурой. Хотя теории обоих подходов не зависят от языка программирования, подход Массера — Степанова, делающий упор на анализ концепций, сделал C++ своей основной платформой, тогда как обобщённое программирование типов данных используют почти исключительно Haskell и его варианты [6] .
Общий механизм
Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.
В тех местах программы, где обобщённый тип или функция используется, программист должен явно указать фактический параметр-тип, конкретизирующий описание. Например, обобщённая процедура перестановки местами двух значений может иметь параметр-тип, определяющий тип значений, которые она меняет местами. Когда программисту нужно поменять местами два целых значения, он вызывает процедуру с параметром-типом «целое число» и двумя параметрами — целыми числами, когда две строки — с параметром-типом «строка» и двумя параметрами — строками. В случае с данными программист может, например, описать обобщённый тип «список» с параметром-типом, определяющим тип хранимых в списке значений. Тогда при описании реальных списков программист должен указать обобщённый тип и параметр-тип, получая, таким образом, любой желаемый список с помощью одного и того же описания.
Компилятор, встречая обращение к обобщённому типу или функции, выполняет необходимые процедуры статического контроля типов, оценивает возможность заданной конкретизации и при положительной оценке генерирует код, подставляя фактический параметр-тип на место формального параметра-типа в обобщённом описании. Естественно, что для успешного использования обобщённых описаний фактические типы-параметры должны удовлетворять определённым условиям. Если обобщённая функция сравнивает значения типа-параметра, любой конкретный тип, использованный в ней, должен поддерживать операции сравнения, если присваивает значения типа-параметра переменным — конкретный тип должен обеспечивать корректное присваивание.
Обобщённое программирование в языках
C++
Основная статья: Шаблоны C++
В языке C++ обобщённое программирование основывается на понятии «шаблон», обозначаемом ключевым словом template. Широко применяется в стандартной библиотеке C++ (см. STL), а также в сторонних библиотеках boost, Loki. Большой вклад в появление развитых средств обобщённого программирования в C++ внёс Александр Степанов.
В качестве примера приведём шаблон (обобщение) функции, возвращающей большее значение из двух.
// Описание шаблона функции 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); .
или шаблон (обобщение) класса связного списка:
template class List < /* . */ public: void Add( const T bool Find( const T /* . */ >;
Haskell
Язык Haskell предоставляет обобщённое программирование типов данных. В следующем примере a — параметрическая переменная типа.
data List a = Nil | Cons a (List a) length :: List a -> Int length Nil = 0 length (Cons _ tl) = 1 + length tl
length (Cons 1 (Cons 2 Nil)) == 2
Java
Java предоставляет средства обобщённого программирования, синтаксически основанные на C++, начиная с версии J2SE 5.0. В этом языке имеются generics или «контейнеры типа T» — подмножество обобщённого программирования.
.NET
На платформе .NET средства обобщённого программирования появились в версии 2.0.
// Объявление обобщенного класса. public class GenericList < void Add(T input) < >> class TestGenericList < private class ExampleClass < >static void Main() < GenericListlist1 = new GenericList(); GenericList list2 = new GenericList(); GenericList list3 = new GenericList(); > >
Пример на C#
interface IPerson < string GetFirstName(); string GetLastName(); >class Speaker < public void SpeakTo(T person) where T : IPerson < string name = person.GetFirstName(); this.say(«Hello, » + name); >>
D
Пример рекурсивной генерации на основе шаблонов D:
// 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 +++++++++++++++/
Object Pascal
Поддержка обобщённого программирования компилятором Free Pascal появилась начиная с версии 2.2 в 2007 году [7] . В Delphi — с октября 2008 года.
Основа поддержки обобщённых классов сначала появилась в Delphi 2007 .NET в 2006 году, но она затрагивала только .NET Framework. Более полная поддержка обобщённого программирования была добавлена в Delphi 2009. Обобщённые классы также поддерживаются в Object Pascal в системе PascalABC.NET.
Nim
import typetraits proc getType[T](x: T): string = return x.type.name echo getType(21) # напечатает int echo getType(21.12) # напечатает float64 echo getType(«string») # напечатает string
Примечания
- ↑Python Generic(неопр.) . Дата обращения: 28 мая 2020.Архивировано 9 февраля 2021 года.
- ↑ В Delphi и PascalABC.NET
- ↑Сик, Ли, Ламсдэйн, 2006, p. 39.
- ↑Сик, Ли, Ламсдэйн, 2006, p. 47-48.
- ↑Сик, Ли, Ламсдэйн, 2006, p. 40-45.
- ↑ Gabriel Dos Reis, Jaakko Järvi. What is Generic Programming?
- ↑Freepascal.Generics(неопр.) . Дата обращения: 1 февраля 2011.Архивировано 15 декабря 2010 года.
Ссылки
- generic-programming.org(англ.)
- Gabriel Dos Reis and Jaakko Järvi, What is Generic Programming?
- Обобщённое программирование в Delphi(рус.)
Литература
- Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. C++ Boost Graph Library. — Питер, 2006. — 304 с. — ISBN 5-469-00352-3.
- Степанов Александр А., Роуз Дэниэл Э. От математики к обобщённому программированию. — ДМК Пресс, 2016. — 264 с. — ISBN 978-5-97060-379-6.
- Страницы, использующие устаревший тег source
- Страницы с ошибками в подсветке синтаксиса
- Руниверсалис:Cite web (не указан язык)
- Статьи с примерами кода C++
- Статьи с примерами кода C Sharp
- Статьи с примерами кода D
- Руниверсалис:Статьи с текстом из источников со свободной лицензией
- Руниверсалис:Статьи начального уровня
Источник: xn--h1ajim.xn--p1ai
Что такое программная музыка? Примеры и определение программной музыки
Конкретика и синтез
По идее, вся музыка в той или иной степени программна, разве что почти невозможно в точности обозначить ни предметы, ни понятия, которые вызывают те или иные чувства у слушателя. Такими способностями обладает только речь, устная или письменная. Поэтому композиторы нередко снабжают свои произведения программой, таким образом заставляя словесную или литературную предпосылку работать в синтезе со всеми применёнными им музыкальными средствами.
Единству литературы и музыки помогает то, что оба эти вида искусства способны показывать развитие и рост образа во времени. Различные виды творческих действий были объединены ещё с древности, поскольку искусство родилось и развивалось в синкретическом виде, связываясь с ритуалами и трудовой деятельностью. В средствах оно было очень ограниченным, поэтому по отдельности и без прикладных задач просто не могло существовать.
Размежевание
Постепенно бытовой уклад человечества совершенствовался, искусство становилось изощрённее, и появилась тенденция к разъединению его основных родов и видов. Действительность обогащалась, и отображение этого уже достигалось во всём многообразии, хотя синкретическим искусство навсегда осталось в обрядовых, духовных, вокально-инструментальных, драматических аспектах. Совместные действия музыки и слова, однако, определяющие программность, тоже никогда от музыки далеко не уходили.
Это могут быть названия, которые предусматривает программная музыка. Примеры – в сборнике фортепианных пьес П. И. Чайковского «Детский альбом», где у каждой пьесы есть не только «говорящее», но и «рассказывающее» название: «Утренняя молитва», «Нянина сказка», «Болезнь куклы» и все остальные маленькие произведения. Это его же сборник для детей постарше «Времена года», где к названию Пётр Ильич присовокупил и яркий поэтический эпиграф. Композитор позаботился о конкретном содержании музыки, тем и объясняя, что такое программная музыка и как нужно исполнять данное произведение.
Музыка плюс литература
Программная музыка для детей особенно понятна, если у произведения есть и название, и сопроводительное слово, которое составляет сам композитор или писатель, вдохновивший его, как сделал Римский-Корсаков в симфонической сюите «Антар» по сказке Сенковского или Свиридов в музыке к повести Пушкина «Метель».
Тем не менее программа музыку лишь дополняет, не являясь точным разъяснением. Просто объект вдохновения один и тот же у писателя и композитора, а средства всё-таки разные.
Музыка минус литература
Определение
«Три кита» и национальные черты в программе
Также помогают понять, что такое программная музыка, определённые черты прикладных жанров: песни («Полюшко», например), марша во всём жанровом разнообразии («Марш Черномора» и «Марш деревянных солдатиков»), а также танца — народного, классического, фантастического. Это, с лёгкой руки Д.Б. Кабалевского, в музыке – «три кита», определяющие жанровую принадлежность.
Характерные черты национальной музыки тоже обычно служат программности музыкального произведения, задавая общую концепцию, темп, ритм сочинения («Танец с саблями» Хачатуряна, например, «Два еврея. » и «Гопак» Мусоргского).
Пейзажная и сюжетная программность
Отображение одного или ряда образов, которые на протяжении всего сочинения не претерпевают изменений, – тоже программная музыка. Примеры произведений можно найти повсеместно: «В полях» Глиэра, «По скалам и фьордам» Грига и так далее. Сюда же можно отнести картины праздников и битв, музыкальные изображения пейзажные и портретные.
Даже одни и те же литературные сюжеты композиторы воплощают в музыке по-разному: например, «Ромео и Джульетта» Шекспира у Чайковского вылилась в увертюру, где программность обобщённая, а у Берлиоза – последовательная. И то, и другое, разумеется, программная музыка. Название чаще всего может рассматриваться как сюжетная программа, например «Битва гуннов» Листа по одноимённой фреске Каульбаха или его же этюды «Хоровод гномов» и «Шум леса». Иногда произведения скульптуры, архитектуры, живописи помогают понять, что такое программная музыка, поскольку участвуют в выборе изобразительных средств для музыкальной картины.
Вывод
Программность обогащает музыку новыми выразительными средствами, помогает в поиске новых форм произведения, дифференцирует жанры. Если композитор обращается к программе в своём сочинении, это сближает его слушателя с действительностью, одухотворяет быт, способствует постижению глубинных духовных начал. Однако, если программность довлеет над остальными задачами, то восприятие музыки заметно снижается, то есть слушателю необходим простор для собственного творческого восприятия.
Источник: fb.ru