- Парадигма
(Paradigm)
Определение парадигмы, история возникновения парадигмы
Информация об определении парадигмы, история возникновения парадигмы
Содержание
Содержание
История возникновения
Частные случаи
Парадигма (лингвистика)
Управленческая парадигма
Парадигма программирования
- История термина
- Различные определения
- Основные модели программирования:
- Императивное программирование
- Структурное программирование
- Функциональное программирование
- Логическое программирование
- Объектно-ориентированное программирование
- Подходы и приёмы
Томас Сэмюэл Кун
Смена парадигм
- Структура научных революцій
- Теория научных революцій
- Общие положення
- Примеры смен парадигм в науке
Паради́гма это (от греч. παράδειγμα, «пример, модель, образец») — универсальный метод принятия эволюционных решений, гносеологическая модель эволюционной деятельности.
Парадигма может быть абсолютной, научной, государственной, личной (индивидуальной, субъективной) и общепринятой.
К общепринятым парадигмам относятся образцовый метод принятия решений, модели мира или его частей (отраслей, областей знаний, сфер жизни и деятельности), принимаемые большим количеством людей. Примеры: благотворная парадигма конституционного курса Российской Федерации образца 1993 года, общая парадигма программирования.
Личная парадигма — это сущностный метод принятия решений, ментальная модель конкретного человека. Неверно бытующее утверждение, что «естественным образом она обязательно будет отличаться от общепринятой, поскольку учитывает личный опыт субъекта, а также не является полной — никто не может знать все обо всем». Дело в том, что общепринятая парадигма определяет не «знание всего», а только сущностное знание, необходимое для обеспечения эволюционной деятельности личности в социальной действительности и обретения разума.
Термин «парадигма» происходит от греческого «paradeigma» — пример, образец и означает совокупность явных и неявных (и часто не осознаваемых) предпосылок, определяющих научные исследования и признанных на данном этапе развития науки.
Это понятие, в современном смысле слова, введено американским физиком и историком науки Томасом Куном [1922-1996], который выделял различные этапы в развитии научной дисциплины: — допарадигмальный (предшествующий установлению парадигмы); — владычества парадигмы (т. н. «нормальная наука»); — кризис нормальной науки; — научной революции, заключающейся в смене парадигмы, переходе от одной к другой. Согласно Т. Куну парадигма — это то, что объединяет членов научного сообщества и, наоборот, научное сообщество состоит из людей, признающих определенную парадигму. Как правило, парадигма фиксируется в учебниках, трудах ученых и на многие годы определяет круг проблем и методов их решения в той или иной области науки, научной школе. К парадигме Т. Кун относит, например, взгляды Аристотеля, ньютоновскую механику и т. п.
Пример парадигмы: «Во всех сложившихся научных дисциплинах есть свои традиционные способы членения, которые выступают овеществленной „нормой“ человеческой деятельности, как своеобразный эталон, который мы, грубо говоря, как трафарет накладываем на реальный объект, тем самым, выделяя в нем определенные элементы, необходимые для решения задач данной науки. В этом плане огромную роль играет традиция. Многие расчленения возникли в результате многовековой практики решения конкретных задач. Эти расчленения стали общепринятыми, канонизировались, и при логическом анализе очень трудно отделить их от самих объектов, осознать, что они являются лишь особым инструментом человеческого познания, необходимым для решения традиционных задач. Например, в результате многовековой медицинской практики человеческий организм представляется как система органов: мозга, почек, печени и т. д. Мы с детства усваиваем такое расчленение, и нам очень трудно допустить, что если бы по каким-то причинам медицинская практика сложилась иначе, то членение человеческого организма на канонические элементы было бы иным, то есть, человеческий организм состоял бы из иных органов».
Пример парадигмы: «Разными группами работников нужно управлять по-разному; одной и той же группой работников следует управлять по-разному в разных ситуациях. Все чаще „служащими“ следует управлять как „партнерами“, а партнерство уже исключает „управление“, поскольку предполагает равенство участников. Партнеры не могут приказывать друг другу. Они могут только убеждать друг друга. Следовательно, можно сказать, что менеджмент все больше становится похожим на „маркетинговую деятельность“. А в анализе конъюнктуры рынка никто не начинает с вопроса „Чего мы хотим?“ Все начинается с вопросов: „Чего хочет другая сторона? Каковы ее ценности? В чем состоят ее цели? Каких результатов она хочет достичь?“ И тут уже не подходит ни „теория X“, ни „теория Y“, ни любая другая теория управления персоналом».
История возникновения
С конца 60-х годов 20-го века этот термин в философии науки и социологии науки используется для обозначения исходной концептуальной схемы, модели постановки проблем и их решения, методов исследования, господствующих в течение определённого исторического периода в научном сообществе.
Первоначально слово использовалось в грамматике. Так, например, ЭСБЕ определяет этот термин следующим образом: «в грамматике слово, служащее образцом склонения или спряжения; в риторике — пример, взятый из истории и приведенный с целью сравнения».
Словарь Merriam-Webster 1900 года дает аналогичное определение его использования только в контексте грамматики или как терминам для иллюстрирующей притчи или басни.
В лингвистике Фердинанд Соссюр использовал термин парадигма для обозначения класса элементов, имеющих схожие свойства.
Смена парадигм представляет собой научную революцию и эволюционный переход. К примеру — парадигма социального поведения — это парадигма, заключающаяся в понимании поведения человека в виде ответной реакции на внешние раздражители. При этом внимание обращается на степень вознаграждения ожидаемого и наказания нежелательного социального поведения.
Частные случаи
Парадигма в методологии науки — совокупность ценностей, методов, подходов, технических навыков и средств, принятых в научном сообществе в рамках устоявшейся научной традиции в определенный период времени.
Парадигма в политологии — совокупность познавательных принципов и приемов отображения политической реальности, задающих логику компании знаний, модель теоретического истолкования данной группы социальных явлений.
Парадигма (лингвистика)
Парадигма, словоизменительная парадигма — в лингвистике список словоформ, принадлежащих одной лексеме и имеющих разные грамматические значения. Обычно представлена в виде таблицы.
Слово παράδειγμα по-гречески значит «пример, модель, образец»; словоизменительная парадигма выступает образцом того, как строятся словоизменительные формы для целых классов лексем (склонений существительных, спряжений глаголов и т. п.).
Построение парадигм — одно из первых лингвистических достижений человечества; вавилонские глиняные таблички с перечнями парадигм обычно считаются первым памятником лингвистики как науки.
Обычно парадигмы упорядочены в некотором традиционном порядке граммем, например, парадигма русского склонения записывается в порядке падежей И — Р — Д — В — Т — П:
Рука
Руки
Руке
Руку
Рукой
о руке
Парадигма личного спряжения в европейских языках записывается обычно в порядке «иду-идёшь-идёт» (и соответственно лица называются первым, вторым и третьим), а, например, в арабском языке порядок обратный.
Существуют морфологические теории, считающие именно парадигмы центральным понятием морфологии, а членение слова на морфемы — факультативным или вторичным.
Управленческая парадигма
Управленческая парадигма — система концепций, методологий и методов, образующая модель постановки и решения проблем управления, принятую в конкретной социально-экономической системе.
Генезис управленческой парадигмы. Категорию «парадигма» в науку ввёл Т. Кун (Kuhn T.S.) в следующем концепте: «Под парадигмой я подразумеваю признанные всеми научные достижения, которые в течение определённого времени дают научному сообществу модель постановки проблем и их решений». Центральным признаком парадигмы следует считать общепризнанность, в том числе концепций и методов в определённых областях деятельности конкретного социального института. В развитии общего концепта парадигмы появились концепции парадигм различных институциональных направлений, в том числе управленческой парадигмы. Научная и управленческая парадигмы имеют идеальную природу. Неадекватное толкование концепта понятия «управленческая парадигма», что в решающей степени обусловлено отсутствием теоретической модели, способной системно и целостно интерпретировать её идеальную сферу. Сложность структурирования её концепта усиливается методологическим противоречием между условием общепризнанности как сущности парадигмы и неоднозначности толкования формирующих её понятий разными учёными.
К наиболее хорошо структурируемым институтам модели управленческой парадигмы можно отнести научные теории и обобщения различных школ и направлений в области науки и практики управления. Однако эти научные институты обычно рассматриваются как самодостаточные и вне связи с другими институтами социально-экономической среды и с конкретными носителями управленческой парадигмы. Вместе с тем, атрибутом управления в общественном производстве является целенаправленность и управления, и производственных процессов; эта целенаправленная деятельность происходит в условиях ограниченных ресурсов. И здесь появляется концепция эффективности управления, определяемого как принятием решений по использованию ресурсов, так и — методологического инструментария, обеспечивающего выбор наиболее эффективной альтернативы при принятии управленческого решения. Из этого следует центральное условие эффективного управления — адекватность используемого инструментария управления условиям социально-экономической системы, в которой функционирует общественное производство. Вместе с тем факторы и инструменты управленческого решения, будучи взаимосвязаны в социально-экономической системе, развиваются по законам эволюции своих институтов, что приводит определённому уровню их взаимной неадекватности, для преодоления которой необходимо внешнее целенаправленной воздействие. Выявить эту неадекватность и определить характер воздействий для её устранения можно только в границах управленческой парадигмы, в связи с чем возникает проблема идентификации управленческой парадигмы, имманентной конкретной социально-экономической системе функционирования общественного производства.
Научная парадигма имеет объективный, всеобщий характер, и её изменения определяются раскрытием явлений природы и развитием методов их исследований. Управленческая парадигма имеет субъективную, уникальную природу, которая определяется социально-экономической системой. Её изменения обусловлены развитием общественного производства и методов его управления.
Отсюда вытекает одно из принципиальных структурных различий институциональных факторов научной и управленческой парадигм, заключающееся в разном уровне формальных (в виде научных теорий и законодательных актов) и неформальных (добровольно принятых в обществе) составляющих их структур. В случае научной парадигмы неформальная составляющая практически отсутствует. В то же время природа управленческой парадигмы обусловливает наличие значительного проявления неформальных и идеологических факторов в её структуре. Неформальные факторы могут иметь как историческую природу, то есть быть фактически существующими, но ещё не получить научного, идеологического или какого-либо иного обобщения, так и субъективную природу в виде фактически применяемых концепций и методов управления, но не декларируемых для предотвращения формальной идентификации противоречия с официально продекларированными целями и концепциями государственной стратегии и целями общественного производства. Последний случай не исключает ситуации фактической поддержки неформальных институций управленческой парадигмы официальными государственными и производственными структурами управления как снижающих степень влияния проблем, возникающих в процессе достижения формальных и неформальных целей государства, предприятия и конкретных руководителей.
Институты социально-экономической среды и научной парадигмы определяют выбор методологического инструментария менеджмента для принятия управленческих решений. Идентификация и исследование парадигмы могут быть проведены по её внешним проявлениям — институциям — в виде получивших распространение в реальном менеджменте концепций, теорий, инструментария и методов, образовательных программ и учебников. Эти институции, будучи общепризнанными по определению, одновременно могут быть, как уже отмечалось, и хорошо структурированными, сформулированными и официально (в той или иной имманентной для конкретного института форме) признанными, и неформальными — в виде слабоструктурированных и непродекларированных форм фактически применяемых взглядов, концепций и методов. Отсюда, в частности, вытекает необходимость в институциональных исследованиях фактов теоретической и практической деятельности для выявления возможных противоречий между декларативной и содержательной частью состояния интеллектуального капитала менеджмента всех уровней и влияния этих противоречий на экономические отношения и результаты.
В формате модели генезиса противоречий институтов менеджмента принципиальное значение приобретает тот факт, что и научные теории в области социальных наук, являющиеся одним из институтов управленческой парадигмы, в отличие от моделей естественных наук, так же подвержены идеологическому влиянию. В специальной методологической литературе сегодня всё чаще звучит мысль о том, что действие механизма смитовой (Адам Смит) «невидимой руки» на саму экономическую науку не распространяется. Факт лидерства тех или иных научных школ и концепций — вовсе не доказательство их объективного превосходства по значимым критериям научного или социального прогресса. Их приоритетный статус с неменьшим успехом может поддерживаться научной модой, властными полномочиями в институтах научного сообщества или связями с влиятельными центрами власти.
В целом формирование институций может иметь как экономически обусловленную с позиций развития общественного производства природу, так и идеологическую природу. Последняя определяется целенаправленным воздействием институтов власти на людей для привития им тех или иных мировоззренческих понятий. В Российской Федерации, в частности, как отмечал академик А. А. Никонов: «до конца 20-х годов (прошлого века) отечественная наука шла в ногу с мировой, находилась на её передовых позициях и в экономике, и в биологии. Так кто же прервал нормальное развитие нашей науки? Всякая эпоха имеет своих трубадуров и знаменосцев. Первым из них был Трофим Лысенко, который заявлял, что вообще нет такой науки „экономика“, а кибернетика — буржуазная лженаука. Все эти люди в общественном отношении были весьма влиятельны, и политическая партия их поддерживала всем своим авторитетом. По их книжкам училось по крайней мере два поколения наших специалистов, семена были брошены в души молодых людей. Мы и сейчас нередко сталкиваемся с рецидивами. Положение в науке определяется прежде всего девальвацией высшего образования, которая прошла несколько этапов, начиная с массовых репрессий и гонений на экономистов, а затем генетиков».Вместе с тем, в условиях экономики рыночного типа, согласно утверждению П. Друкера, «не подлежит сомнению, что, выполняя свою основную функцию и действуя в соответствии с политическими и этическими принципами общества, предприятие укрепляет экономическую мощь этого общества».
Парадигма имеет институциональную природу вследствие определяющего её атрибута общепризнанности, а в случае управленческой парадигмы как институционального фактора общественного производства — широкого применения конкретной системы концепций и методов управления. Вследствие этого управленческую парадигму (так же как и институт) создать нельзя, так как она только отражает общепризнанные институциональные факторы и институции менеджмента.
Институциональную структуру, формирующую управленческую парадигму в данной социально-экономической системе, образуют научные знания и прикладные исследования, государственные, правовые, социальные, идеологические и образовательные институты, подсистема общественного производства, а также внешние социально-экономические системы.
Институциональный категорийно-понятийный аппарат управленческой парадигмы может быть представлен следующими атрибутами: институциональные факторы осуществляют функциональное воздействие на формирование управленческой парадигмы в виде научных разработок по теории управления, макро- и микроэкономики, методологического и практического инструментария менеджмента, целевых установок основных общественных институтов, учебных программ и учебников по бизнес-образованию; институции менеджмента представляют внешнее проявление управленческой парадигмы в виде целевых установок, концепций, методов и другого инструментария принятия управленческих решений, фактически используемых менеджерами в своей практической деятельности. Сопоставление полученных концептов и категорий, формирующих понятия «интеллектуальный капитал» и «управленческая парадигма», доказывает их общий генезис, при этом управленческая парадигма отражает процедурную составляющую интеллектуального капитала. В терминах системного подхода в иерархии подсистем, формирующих управленческую парадигму, институциональные факторы являются «входами», соответствующая институциональная структура — «процессором», а институции — «выходом» этой подсистемы.
Как уже отмечалось, атрибутом научной парадигмы является её общепризнанный характер на определённом временном промежутке. Управленческая парадигма — стохастический результат развития общественного производства в данной социально-экономической системе и научных методов его исследований. Эти две системы взаимодействуют — социально-экономическая система качественно определяет содержание парадигмы, а парадигма воздействует на степень и эффективность достижения целей социально-экономической системы в сфере материального производства. Последние определяются степенью адекватности методологического инструментария парадигмы условиям социально-экономической системы. Одновременно факторы, определяющие изменение социально-экономической системы, воздействуют на изменение управленческой парадигмы, но уже опосредованно, через произведённые ими изменения в социально-экономической среде, что и обусловливает инерционность управленческой парадигмы по отношению к темпам изменения среды и сложности производственных систем. При высоких темпах эволюции и тем более при революционных изменениях социально-экономических систем, выраженных в изменениях форм связей и составе ее элементов, эти изменения не могут оперативно влиять на составляющие управленческой парадигмы, имеющие идеальную природу. Сформировавшиеся в этом случае противоречия уровней в системе «управленческая парадигма — общественное производство» приводят к снижению эффективности достижения целей производственных систем. В случае же революционных процессов в социально-экономических системах, приводящих к максимизации уровня разнообразия — хаосу, эти противоречия приводят к полной потере управляемости общественного производства. Выходом из этой ситуации являются целенаправленные действия по понижению уровня разнообразия управляемой системы.
В кибернетике управляющую систему рассматривают как машину для перевода управляемой системы из одного класса в другой, более примитивный и приводят пример с дирижёром — регулятором — и оркестром — управляемой системой: «приведите оркестр в действие и вы увидите, что он обладает естественной тенденцией порождать разнообразие за счёт внесения ошибок в интерпретацию музыкальной пьесы отдельными музыкантами. Кроме того, оркестр будет вносить дополнительные элементы случайности в исполнение из-за недостаточной связи между музыкантами. Дирижёр (или регулятор) ставит перед собой цель уменьшить сложность управляемой им системы, заставляя примерно восемьдесят пять человек играть так, как будто они являются только определёнными знаками в партитуре». Исключением из закона необходимого разнообразия, является ситуация, когда целью управления является именно разрушение управляемой системы. Тогда управляющая система может иметь не только относительно, но и абсолютно простую структуру и быть более примитивной по отношению к управляемой. В. И. Ленин, рассматривая государственный аппарат как машину для подавления, подчёркивал: «Народ подавить эксплуататоров может и при очень простой „машине“, почти что без „машины“, без особого аппарата, простой компанией вооружённых масс».
В целом, изменения в системе «управленческая парадигма — общественное производство» могут осуществляться сочетанием процессов созидания и разрушения различного уровням. В революционных изменениях социально-экономических систем подавляющее влияние оказывают разрушительные процессы. Разрушаются связи и иногда физически уничтожаются организационные структуры и формирующие их элементы — люди. Причём чем более объект изменения/уничтожения связан с материальным миром, тем более простым может быть средство его изменения/уничтожения.
Управленческая парадигма имеет идеальную природу, однако носителями её институций являются материальные объекты — люди, книги и другие источники информации, которые также сравнительно легко могут быть уничтожены. В отличие от большинства социально-экономических систем, для уничтожения (прекращения функционирования) которых может оказаться достаточным изменения даже одной связи или одного элемента, для уничтожения парадигмы необходимо физическое устранение большинства её носителей. При этом в случае параллельного разрушения социально-экономической системы и управленческой парадигмы в новом состоянии элементы в системе «управленческая парадигма — общественное производство» не обязательно будут адекватны друг другу.
Более высокий уровень инерционности созидательных процессов, формирующих новую парадигму управления по сравнению с созданием новой социально-экономической системы, по нашему мнению, обусловлен двумя причинами:
- длительностью процессов формирования таких идеальных понятий, как знания, методология у подавляющего большинства явных или неявных носителей этой парадигмы;
- формирование управленческой парадигмы всегда вторично и происходит с большим временным лагом по отношению к формированию социально-экономической системы, так как является следствием процессов, протекающих при создании и функционировании последней.
В современной Российской Федерации, несмотря на произошедшие разрушение прежней социально-экономической системы, в настоящее время не ставится задача и не делается каких-либо попыток целенаправленного воздействия на институты и институции управленческой парадигмы по их изменению для повышения уровня их адекватности производственным системам и новым условиям их функционирования. Вместе с тем уровень инерционности можно понизить, используя концепцию активного формирования управленческой парадигмы. Для целенаправленного воздействия на институты управленческой парадигмы необходимо:
- выявить формы проявления противоречий управленческой парадигмы и управляемых систем;
- выявить контролируемые факторы, формирующие парадигму, и через них целенаправленно воздействовать на её изменения вначале внешним принуждением, а затем и путём создания системы саморегулирования, основанной на кибернетическом принципе гомеостазиса, обеспечивающем соблюдение эквифинальности — достижения запланированного результата при любых колебаниях условий внешней среды и управляемой системы, — и императиве экономической эффективности производства.
Парадигма программирования
Паради́гма программи́рования — это совокупность идей и понятий, определяющая стиль написания программ. Парадигма, в первую очередь, определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы выступают определение (декларативное, функциональное программирование), действие (императивное программирование), правило (продукционное программирование), диаграмма переходов (автоматное программирование) и др. сущности. В современной индустрии программирования очень часто парадигма программирования определяется набором инструментов программиста, а именно, языком программирования и используемыми библиотеками.
Парадигма программирования определяет то, в каких терминах программист описывает логику программы. Например, в императивном программировании программа описывается как последовательность действий, а функциональном программировании представляется в виде выражения и множества определений функций (слово определение (англ. definition) следует понимать в математическом смысле). В популярном объектно-ориентированном программировании программу принято рассматривать как набор взаимодействующих объектов. ООП есть по сути императивное программирование, дополненное принципом инкапсуляции данных и методов в объект (принцип модульности) и наследованием (принципом повторного использования разработанного функционала).
Важно отметить, что парадигма программирования не определяется однозначно языком программирования — многие современные языки программирования являются мультипарадигменными, то есть допускают использование различных парадигм. Так на языке Си, который не является объектно-ориентированным, можно писать объектно-ориентированным образом, а на Ruby, в основу которого в значительной степени положена объектно-ориентированная парадигма, можно писать согласно стилю функционального программирования.
Приверженность определённого человека какой-то одной парадигме иногда носит настолько сильный характер, что споры о преимуществах и недостатках различных парадигм относятся в околокомпьютерных кругах к разряду так называемых «религиозных» войн.
История термина
Своим современным значением в научно-технической области термин «парадигма» обязан, по-видимому, Томасу Куну и его книге «Стрпреимуществахх революций». Кун называл парадигмами устоявшиеся системы научных взглядов, в рамках которых ведутся исследования. Согласно Куну, в процессе развития научной дисциплины может произойти замена одной парадигмы на другую (как, например, геоцентрическая небесная механика Птолемея сменилась гелиоцентрической системой Коперника), при этом старая парадигма ещё продолжает некоторое время существовать и даже развиваться благодаря тому, что многие её сторонники оказываются по тем или иным причинам неспособны перестроиться для работы в другой парадигме.
Термин «парадигма программирования» впервые применил Роберт Флойд в своей лекции лауреата премии Тьюринга.
Флойд отмечает, что в программировании можно наблюдать явление, подобное парадигмам Куна, но, в отличие от них, парадигмы программирования не являются взаимоисключающими.
Если прогресс искусства программирования в целом требует постоянного изобретения и усовершенствования парадигм, то совершенствование искусства отдельного программиста требует, чтобы он расширял свой репертуар парадигм.
Таким образом, по мнению Роберта Флойда, в отличие от парадигм в научном мире, описанных Куном, парадигмы программирования могут сочетаться, обогащая инструментарий программиста.
Различные определения
Далеко не все авторы, использующие термин «парадигма программирования», решаются дать интенсиональное определение данному термину. Однако и те определения, которые удаётся найти, серьезно отличаются друг от друга.
Диомидис Спинеллис даёт следующее определение:
Слово «парадигма» используется в программировании для определения семейства обозначений (нотаций), разделяющих общий способ (методику) реализаций программ. (В оригинале: The word paradigm is used in computer science to talk about a family of notations that share a common way for describing program implementations).
Для сравнения тот же автор приводит определения из других работ. В статье Дэниела Боброва парадигма определяется как «стиль программирования как описания намерений программиста». Брюс Шрайвер (Bruce Shriver) определяет парадигму программирования как «модель или подход к решению проблемы», Линда Фридман (Linda Friedman) — как «подход к решению проблем программирования».
Памела Зейв (Pamela Zave) даёт определение парадигмы как «способа размышления о компьютерных системах» (в оригинале «way of thinking about computer systems»).
Питер Вегнер (Peter Wegner) предлагает другой подход к определению термина парадигмы программирования. В его работе «Concepts and paradigms of object-oriented programming» парадигмы определяются как «правила классификации языков программирования в соответствии с некоторыми условиями, которые могут быть проверены».
Тимоти Бадд предлагает понимать термин «парадигма» как «способ концептуализации того, что значит „производить вычисления“, и как задачи, подлежащие решению на компьютере, должны быть структурированы и организованы».
Основные модели программирования
Императивное программирование— это парадигма программирования, которая, в отличие от декларативного программирования, описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер.
Императивные языки программирования противопоставляются функциональным и логическим языкам программирования. Функциональные языки, например, Haskell, не представляют собой последовательность инструкций и не имеют глобального состояния. Логические языки программирования, такие как Prolog, обычно определяют что надо вычислить, а не как это надо делать.
Первыми императивными языками были машинные коды - нативный язык программирования для компьютера. В этих языках инструкции были крайне просты, что снижало нагрузку на компьютеры, однако затрудняло написание крупных программ. В 1954 появился первый "человеческий" язык программирования - FORTRAN, разработанный Джоном Бэкусом в IBM. FORTRAN является компилируемым языком программирования и позволяет использовать именованные переменные, составные выражения, подпрограммы и многие другие элементы распространённых сейчас императивных языков. В конце 1950х годов с целью упростить выражение математических алгоритмов был разработан ALGOL; в дальнейшем он послужил базой для написания операционных систем для некоторых моделей компьютеров. COBOL (1960) и BASIC (1964) являлись первыми попытками сделать программирование более похожим на обычный английский язык. В 1970х годах Никлаус Вирт разработал язык Pascal. Язык C был создан Денисом Ритчи. Команда разработчиков из Honeywell начала разработку языка Ada в 1978, и через четыре года опубликовала требования для его работы. Спецификация увидела свет в 1983 и была обновлена в 1995 и 2005/6 годах.
В 1980х резко возрос интерес к объектно-ориентированному программированию.
Smalltalk-80, впервые разработанный Аланом Кэем в 1969, был обновлён в 1980 исследовательским центром Xerox PARC. По образу и подобию языка Simula (предположительно, первого в мире ООП-языка, разработанного ещё в 1960х) Бьерн Страуструп разработал C++, основанный на C. C++ был впервые реализован в 1985. В 1987 Уолл, Ларри выпустил язык Perl; Python был выпущен в 1990 Гвидо ван Россумом; в 1994 Расмус Лердорф разработал PHP; Java, была разработана в Sun Microsystems в 1994; Ruby, был выпущен в 1995.
Структурное программирование
Структурное программирование - методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.
В соответствии с данной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:
- последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
- ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
- цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).
В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т. н. подпрограмм (процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы.
Разработка программы ведётся пошагово, методом «сверху вниз».
Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «затычки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.
Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что «интуитивная» (неструктурированная, или «рефлекторная») разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ.
Наиболее сильной критике со стороны разработчиков структурного подхода к программированию подвергся оператор GOTO (оператор безусловного перехода), имевшийся тогда почти во всех языках программирования. Неправильное и необдуманное использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ (т.н. спагетти-кода), по тексту которых практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
Следование принципам структурного программирования сделало тексты программ, даже довольно крупных, нормально читаемыми. Серьёзно облегчилось понимание программ, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты. Это позволило разрабатывать достаточно крупные для того времени программные комплексы силами коллективов разработчиков, и сопровождать эти комплексы в течение многих лет, даже в условиях неизбежных изменений в составе персонала.
Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов». После этого слово «структурный» стало модным в отрасли, и его начали использовать везде, где надо и где не надо. Появились работы по «структурному проектированию», «структурному тестированию», «структурному дизайну» и так далее. В общем, произошло примерно то же самое, что происходило в 90-х годах и происходит в настоящее время с терминами «объектный», «объектно-ориентированный» и «электронный».
Перечислим некоторые достоинства структурного программирования:
1. Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и, что ещё важнее, облегчает понимание её другими разработчиками.
2. В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные — дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой).
3. Сильно упрощается процесс тестирования и отладки структурированных программ.
Функциональное программирование
Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Противопоставляется парадигме императивного программирования, которая описывает процесс вычислений как последовательность изменения состояний (в значении, подобном таковому в теории автоматов). Функциональное программирование не предполагает изменяемость данных (в отличие от императивного, где одной из базовых концепций является переменная).
На практике отличие математической функции от понятия «функции» в императивном программировании заключается в том, что императивные функции взаимодействуют и изменяют уже определённые данные. Таким образом, в императивном программировании, при вызове одной и той же функции с одинаковыми параметрами можно получить разные данные на выходе, из-за влияния на функцию внешних факторов. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат в обоих случаях, входные данные не могут измениться, выходные данные зависят только от них.
λ-исчисления являются основой для функционального программирования, многие функциональные языки можно рассматривать как «надстройку» над ними.
Наиболее известными языками функционального программирования являются:
1. XQuery
2. Haskell — чистый функциональный. Назван в честь Хаскелла Карри.
3. LISP (Джон МакКарти, 1958, множество его потомков, наиболее современные из которых — Scheme и Common Lisp).
4. ML (Робин Милнер, 1979, из ныне используемых диалектов известны Standard ML и Objective CAML).
5. Miranda (Дэвид Тёрнер, 1985, который впоследствии дал развитие языку Haskell).
6. Erlang — (Joe Armstrong, 1986) функциональный язык с поддержкой процессов.
7. Nemerle — гибридный функционально/императивный язык.
8. F# - функциональный язык для платформы.NET
Ещё не полностью функциональные изначальные версии и Lisp и APL внесли особый вклад в создание и развитие функционального программирования. Более поздние версии Lisp, такие как Scheme, а так же различные варианты APL поддерживали все свойства и концепции функционального языка.
Как правило, интерес к функциональным языкам программирования, особенно чисто функциональным, был сугубо научный, нежели коммерческий. Однако, таким примечательным языкам как Erlang, OCaml, Haskell, Scheme (после 1986) а так же специфическим R (статистика), Mathematica (символическая математика), J и K (финансовый анализ), и XSLT (XML) находили применение в индустрии коммерческого программирования. Такие широко распространенные декларативные языки как SQL и Lex/Yacc содержат некоторые элементы функционального программирования, они остерегаются использовать переменные. Языки работы с электронными таблицами также можно рассматривать как функциональные.
Многие нефункциональные языки, такие как C, C++ и C# могут вести себя как функциональные при использовании указателей на функцию, в соответствие с библиотекой и λ-исчислениями.
λ-исчисления позволили осуществить теоретическое описание функции и её вычисление. Хотя функция чаще рассматривается как математическая абстракция, а не понятие из языка программирования, она составила базис всех языков функционального программирования на сегодняшний день. Сходное теоретическое понятие, комбинаторная логика, является более абстрактной нежели λ-исчисления и было основано раньше. Эта логика используется в некоторых эзотерических языках, например в Unlambda. И λ-исчисления, и комбинаторная логика были разработаны для более ясного и точного описания принципов и основ математики.
Первым функциональным языком был Lisp, созданный Джоном МакКарти в период его работы в Массачусетском технологическом институте в начале пятидесятых. Lisp ввел множество понятий функционального языка, хотя при этом исповедовал не только парадигму функционального программирования. Более поздние Scheme и Dylan были попытками упростить и усовершенствовать Lisp.
Язык обработки информации (ИПЛ) иногда определяется как самый первый машинный функциональный язык. Это язык ассемблерного типа для работы со списком символов. У него было понятие «генератор», использующий функцию в качестве аргумента, а так же, поскольку язык ассемблерного уровня, он может позиционироваться как язык имеющих функции высшего порядка. Хотя в целом ИПЛ акцентирован на использование императивных понятий.
Кеннет Е. Айверсон разработал язык APL в начале шестидесятых, документировав его в своей книге A Programming Language. APL оказал значительное влияние на FR-язык, созданный Джоном Бэкусом. В начале девяностых Айверсон и Роджер Хьюи создали преемника APL — язык программирования J. В середине девяностых Артур Витни, ранее работавший с Айверсоном, создал язык K, который впоследствии использовался в финансовой индустрии на коммерческой основе.
В семидесятых в университете Эдинбурга Робин Милнер создал язык ML, а Дэвид Тернер начинал разработку языка SASL в университете Сент-Эндрюса и, впоследствии, язык Miranda в университете города Кент. В конечном итоге на основе ML были созданы несколько языков, среди которых наиболее известные Objective Caml и Standard ML. Так же в семидесятых осуществлялась разработка языка программирования по принципу Scheme (реализация не только функциональной парадигмы), получившего описание в известной работе «Lambda Papers», а так же в книге восемьдесят пятого года «Structure and Interpretation of Computer Programs», в которой принципы функционального программирования были донесены до более широкой аудитори
В восьмидесятых Пер Мартин-лоф создал теорию интуиционного типа(также называемую конструктивной). В ней функциональное программирование получило конструктивное доказательство того, что ранее было известно как зависимый тип. Это дало мощный толчок к развитию диалогового доказательства теорем и к последующему созданию множества функциональных языков. Haskell был создан в конце восьмидесятых в попытке соединить множество идей, полученных в ходе исследования функционального программирования.
Функции высших порядков — это такие функции, которые могут принимать в качестве аргументов и возвращать другие функции. Примерами таких функций в математическом анализе являются производная и первообразная.
Функции высших порядков весьма схожи с функциями первого класса, оба типа позволяют иметь на выходе и в качестве аргумента функцию. Грань между этими типами функций довольно тонкая: функции высших порядков это математическая концепция функций, оперирующих другими функциями, а функции первого класса — термин компьютерных наук, описывающий конструкцию языка, не имеющую ограничений на свое использование (функция первого порядка может использоваться всюду в программе, как и другие сущности первого класса, к примеру число, включая возможность быть аргументом других функций и быть на выходе у них).
Функции высших порядков позволяют использовать карринг — преобразование функции от пары аргументов в функцию, берущую свои аргументы по одному. Это преобразование получило свое название в честь Х. Карри.
Чистые функции не имеют побочных эффектов ввода-вывода и памяти (они зависят только от своих параметров и возвращают только свой результат). Чистые функции обладают несколькими полезными свойствами, многие из которых можно использовать для оптимизации кода:
Если результат чистой функции не используется, он может быть удален без вреда для других выражений.
Если чистая функция вызывается с параметрами без побочных эффектов, то результат в виде константы заносится в таблицу параметров (иногда это называется принципом прозрачности ссылок), то есть если функция снова вызывается с этим параметром, то возвращается этот же результат.
Если нет никакой зависимости по данным между двумя чистыми функциями, то порядок их вычисления можно поменять или распараллелить (говоря иначе вычисление чистых функций удовлетворяет принципам thread-safe)
Если весь язык не допускает побочных эффектов, то можно использовать любую политику вычисления. Это предоставляет свободу компилятору комбинировать и реорганизовывать вычисление выражений в программе (например, исключить древовидные структуры).
До тех пор пока большинство компиляторов императивных языков программирования распознают чистые функции и удаляют общие подвыражения для вызовов чистых функций, они не смогут делать это всегда для предварительно скомпилированных библиотек, которые, как правило, не предоставляют эту информацию. Некоторые компиляторы, такие как gcc, в целях оптимизации предоставляют программисту ключевые слова для обозначения чистых функций. Fortran 95 позволяет обозначать функции как «pure» (чистые).
В функциональных языках цикл обычно реализуется в виде рекурсии. Строго говоря, в функциональной парадигме программирования нет такого понятия как цикл. Рекурсивные функции вызывают сами себя, позволяя операции выполняться снова и снова. Для использования рекурсии может потребоваться большой стек, но этого можно избежать в случае хвостовой рекурсии. Хвостовая рекурсия может быть распознана и оптимизирована компилятором в код, получаемый после компиляции аналогичной итерации в императивном языке программирования. Стандарты языка Scheme требуют распознавать и оптимизировать хвостовую рекурсию. Оптимизировать хвостовую рекурсию можно путём преобразования программы в стиле использования продолжений при её компиляции, как один из способов.
Рекурсивные функции можно обобщить с помощью функций высших порядков, используя, например, катаморфизм и анаморфизм (или «свертка» и «развертка»). Функции такого рода играют роль такого понятия как цикл в императивных языках программирования.
Функциональные языки можно классифицировать по тому, как обрабатываются аргументы функции в процессе её вычисления. Технически различие заключается в детонационной семантике выражения. К примеру выражение:
print length([2+1, 3*2, 1/0, 5-4])
При строгом подходе к вычислению на выходе будет ошибка, так как в третьем элементе присутствует деление на ноль. А при нестрогом подходе функция вернет значение 4. При строгом вычислении заранее подсчитываются значения всех аргументов перед вычислением самой функции. При нестрогом подходе значение аргументов не вычисляется до тех пор, пока их значение не понадобится при вычислении функции.
Как правило нестрогий подход реализуется в виде редукции графа. Нестрогое вычисление используется по умолчанию в нескольких чисто функциональных языках, в том числе Miranda, Clean и Haskell.
Принципиально нет препятствий для написания программ в функциональном стиле на языках, которые традиционно не считаются функциональными (точно так же, как программы в объектном стиле можно писать на обычных структурных языках). Некоторые императивные языки поддерживают типичные для функциональных языков конструкции, такие как функции высшего порядка и дополнение списков (list comprehensions), что облегчает использование функционального стиля в этих языках.
В языке C указатели на функцию могут быть использованы для получения эффекта функций высшего порядка. Функции высшего порядка и отложенная списковая структура реализованы в библиотеках С++. В языке C# версии 3.0 и выше можно использовать λ-функции для написания программы в функциональном стиле. В сложных языках, типа Алгол-68, имеющиеся средства метапрограммирования (фактически — дополнения языка новыми конструкциями) позволяют создать специфичные для функционального стиля объекты данных и программные конструкции, после чего можно писать функциональные программы с их использованием.
Недостатки функционального программирования вытекают из тех же самых его особенностей. Отсутствие присваиваний и замена их на порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти, поэтому в системе исполнения функциональной программы обязательным компонентом становится высокоэффективный сборщик мусора.
Для преодоления недостатков функциональных программ уже первые языки функционального программирования включали не только чисто функциональные средства, но и механизмы императивного программирования (присваивание, цикл, «неявный PROGN» были уже в LISPе). Использование таких средств позволяет решить некоторые практические проблемы, но это означает отход от идей (и преимуществ) функционального программирования и написание императивных программ на функциональных язиках.
Логическое программирование
Логи́ческое программи́рование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций.
Самым известным языком логического программирования является Prolog.
Первым языкомлогического программирования был язык Planner, в котором была заложена возможность автоматического вывода результата из данных и заданных правил перебора вариантов (совокупность которых называлась планом). Planner использовался для того, чтобы понизить требования к вычислительным ресурсам (с помощью метода backtracking) и обеспечить возможность вывода фактов, без активного использования стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Planner.
От языка Planner также произошли логические языки программирования QA-4, Popler, Conniver и QLISP. Языки программирования Mercury, Visual Prolog, Oz и Fril произошли уже от языка Prolog. На базе языка Planner было разработано также несколько альтернативных языков логического программирования, не основанных на методе backtracking, например, Ether.
Объектно-ориентированное программирование
Объе́ктно-ориенти́рованное программи́рование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием, — прототипов).
Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т.н. объекта.
Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и линковки) исходного кода на выполнение).
Прототип — это объект-образец, по образу и подобию которого создаются другие объекты.
Объектное и объектно-ориентированное программирование (ООП) возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Кроме того, в современном объектно-ориентированном программировании часто большое значение имеют понятия события (так называемое событийно-ориентированное программирование) и компонента (компонентное программирование).
Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.
В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мультиплатформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++.
Структура данных «класс», представляющая собой объектный тип данных, внешне похожа на типы данных процедурно-ориентированных языков, такие как структура в языке Си или запись в Паскале или QuickBasic. При этом элементы такой структуры (члены класса) могут сами быть не только данными, но и методами (то есть процедурами или функциями). Такое объединение предприятий называется инкапсуляцией.
Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.
Но даже наличие инкапсуляции и наследования не делает язык программирования в полной мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм.
Язык Self, соблюдая многие исходные положения объектно-ориентированного программирования, ввёл альтернативное классам понятие прототипа, положив начало прототипному программированию, считающемуся подвидом объектного.
Абстракция даннях. Объекты представляют собою упрощенное, идеализированное описание реальных сущностей предметной области. Если соответствующие модели адекватны решаемой задаче, то работать с ними оказывается намного удобнее, чем с низкоуровневым описанием всех возможных свойств и реакций объекта.
Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.
Сокрытие данных — неотделимая часть ООП, управляющая областями видимости. Является логическим продолжением инкапсуляции. Целью сокрытия является невозможность для пользователя узнать или испортить внутреннее состояние объекта.
Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (прародителя, иногда его называют суперклассом) и добавляя, при необходимости, новые свойства и методы. Набор классов, связанных отношением наследования, называют иерархией. Наследование призвано отобразить такое свойство реального мира, как иерархичность.
Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами — из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.
Подходы и приёмы
Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Процедурные языки программирования:
- Аda (язык общего назначения)
- Basic (версии начиная с Quick Basic до появления Visual Basic)
- Си
- КОБОЛ
- Фортран
- Модула-2
- Pascal
- ПЛ/1
- Рапира
- REXX.
Декларативное программирование — термин с двумя различными значениями.
Согласно первому определению, программа «декларативна», если она описывает каково́ нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают что должна содержать страница, а не как отображать страницу на экране. Этот подход отличается от языков императивного программирования, требующих от программиста указывать алгоритм для исполнения.
Согласно второму определению, программа «декларативна», если она написана на исключительно функциональном, логическом или константном языке программирования. Выражение «декларативный язык» иногда употребляется для описания всех таких языков программирования как группы, чтобы подчеркнуть их отличие от императивных языков.
Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования. Возможности обобщённого программирования впервые появились в 70-х годах в языках CLU и Ada, а затем во многих объектно-ориентированных языках, таких как C++, Java, Object Pascal, D и языках для платформы.NET.
Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.
В тех местах программы, где обобщённый тип или функция используется, программист должен явно указать фактический параметр-тип, конкретизирующий описание. Например, обобщённая процедура перестановки местами двух значений может иметь параметр-тип, определяющий тип значений, которые она меняет местами. Когда программисту нужно поменять местами два целых значения, он вызывает процедуру с параметром-типом «целое число» и двумя параметрами — целыми числами, когда две строки — с параметром-типом «строка» и двумя параметрами — строками. В случае с данными программист может, например, описать обобщённый тип «список» с параметром-типом, определяющим тип хранимых в списке значений. Тогда при описании реальных списков программист должен указать обобщённый тип и параметр-тип, получая, таким образом, любой желаемый список с помощью одного и того же описания.
Компилятор, встречая обращение к обобщённому типу или функции, выполняет необходимые процедуры статического контроля типов, оценивает возможность заданной конкретизации и при положительной оценке генерирует код, подставляя фактический параметр-тип на место формального параметра-типа в обобщённом описании. Естественно, что для успешного использования обобщённых описаний фактические типы-параметры должны удовлетворять определённым условиям. Если обобщённая функция сравнивает значения типа-параметра, любой конкретный тип, использованный в ней, должен поддерживать операции сравнения, если присваивает значения типа-параметра переменным — конкретный тип должен обеспечивать корректное присваивание.
Известно два основных способа реализации поддержки обобщённого программирования в компиляторе.
Порождение нового кода для каждой конкретизации. В этом варианте компилятор рассматривает обобщённое описание как текстовый шаблон для создания вариантов конкретизаций. Когда компилятору требуется новая конкретизация обобщённого типа или процедуры, он создаёт новый экземпляр типа или процедуры, чисто механически добавляя туда тип-параметр. То есть, имея обобщённую функцию перестановки элементов, компилятор, встретив её вызов для целого типа, создаст функцию перестановки целых чисел и подставит в код её вызов, а затем, встретив вызов для строкового типа — создаст функцию перестановки строк, никак не связанную с первой. Этот метод обеспечивает максимальное быстродействие, поскольку варианты конкретизаций становятся разными фрагментами программы, каждый из них может быть оптимизирован для своего типа-параметра, к тому же в код не включаются никакие лишние элементы, связанные с проверкой или преобразованием типов на этапе исполнения программы. Недостатком его является то, что при активном использовании обобщённых типов и функций с различными типами-параметрами размер откомпилированной программы может очень сильно возрастать, поскольку даже для тех фрагментов описания, которые для разных типов не различаются, компилятор всё равно генерирует отдельный код. Этот недостаток можно затушевать путём частичной генерации общего кода (часть обобщённого описания, которая не зависит от типов-параметров, оформляется специальным образом и по ней компилятор генерирует единый для всех конкретизаций код). Зато данный механизм даёт естественную возможность создания специальных (обычно — сильно вручную оптимизированных) конкретизаций обобщённых типов и функций для некоторых типов-параметров.
Порождение кода, который во время исполнения выполняет преобразование фактических параметров-типов к одному типу, с которым фактически и работает. В этом случае на этапе компиляции программы компилятор лишь проверяет соответствие типов и включает в код команды преобразования конкретного типа-параметра к общему типу. Код, определяющий функционирование обобщённого типа или функции, имеется в откомпилированной программе в единственном экземпляре, а преобразования и проверки типов выполняются динамически, во время работы программы. В этом варианте порождается, как правило, более компактный код, но программа оказывается в среднем медленнее, чем в первом варианте, из-за необходимости выполнения дополнительных операций и меньших возможностей оптимизации. Кроме того, в компилированный код для типов-параметров далеко не всегда включается динамическая информация о типах (в первом варианте она есть, если вообще поддерживается, поскольку конкретизации для каждого типа-параметра различны), что определяет некоторые ограничения на применение обобщённых типов и функций. Подобные ограничения есть, например, в Java.
Аспектно-ориентированное программирование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.
Методология аспектно-ориентированного программирования была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кичалеса (Gregor Kiczales). Ими же был разработан аспектно-ориентированное расширение для языка Java, получившее название AspectJ — (2001 год).
Существующие парадигмы программирования, такие как процедурное, модульное и объектно-ориентированное программирование, предоставляют определённые способы для разделения и выделения функциональности (функции, классы, модули), но некоторую функциональность с помощью предложенных методов невозможно выделить в отдельные сущности. Такую функциональность называют сквозной (англ. scattered, разбросанная или tangled, переплетённая), так как её реализация рассыпана по различным модулям программы. Сквозная функциональность приводит к рассредоточенному и запутанному коду, сложному для понимания и сопровождения.
Ведение лога и обработка ошибок — типичные примеры сквозной функциональности. Другие примеры: трассировка; авторизация и проверка прав доступа; контрактное программирование (в частности, проверка пред- и постусловий). Для программы, написанной в парадигме ООП, любая функциональность, по которой не была проведена декомпозиция, является сквозной.
Однако как утверждают некоторые авторы, АОП может успешно применяться и для решения задач защиты, многопоточности, управления транзакциями и многих других.
Все языки АОП предоставляют средства для выделения сквозной функциональности в отдельную сущность. Так как AspectJ является родоначальником этого направления, используемые в этом расширении концепции распространились на большинство языков АОП.
Основные понятия АОП:
Аспект (англ. aspect) — модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом.
Совет (англ. advice) — средство оформления кода, который должен быть вызван из точки соединения. Совет может быть выполнен до, после или вместо точки соединения.
Точка соединения (англ. join point) — точка в выполняемой программе, где следует применить совет. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения.
Срез (англ. pointcut) — набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-cигнатуры) и позволяют их повторное использование с помощью переименования и комбинирования.
Внедрение (англ. introduction, введение) — изменение структуры класса и/или изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола (англ. metaobject protocol, MOP).
Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи.
Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.
Определение в логике, использующее рекурсию, называется индуктивным.
Примеры. Метод Гаусса — Жордана для решения Системы линейных алгебраических уравнений является рекурсивным.
Факториал целого неотрицательного числа n обозначается n! и определяется как
при n > 0 и n! = 1 при n = 0
Числа Фибоначчи определяются с помощью рекуррентного соотношения:
Первое и второе числа Фибоначчи равны 1.
Для n > 2, n − e число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи.
Практически все геометрические фракталы задаются в форме бесконечной рекурсии. (например, треугольник Серпинского).
Задача «Ханойские башни». Её содержательная постановка такова:
В одном из буддийских монастырей монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
Рекурсивный вариант решения задачи можно описать так:
Алгоритм по передвижению башни, алгоритм передвинет нужное количество дисков из пирамиды «источник» на пирамиду «задание» используя «запасную» пирамиду.
Если число дисков равно одному, тогда:
Передвиньте диск из источника в задание
В противном случае:
Рекурсивно передвиньте все диски кроме одного из источника в запас, используя задание как запас
Передвиньте оставшийся диск из источника в задание
Передвиньте все диски из запаса в задание используя источник как запас.
Автома́тное программи́рование — это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого-либо формального автомата.
В зависимости от конкретной задачи в автоматном программировании могут использоваться как конечные автоматы, так и автоматы более сложной структуры.
Определяющими для автоматного программирования являются следующие особенности:
- временно́й период выполнения программы разбивается на шаги автомата, каждый из которых представляет собой выполнение определённой (одной и той же для каждого шага) секции кода с единственной точкой входа; такая секция может быть оформлена, например, в виде отдельной функции и может быть разделена на подсекции, соответствующие отдельным состояниям или категориям состояний
- передача информации между шагами автомата осуществляется только через явно обозначенное множество переменных, называемых состоянием автомата; между шагами автомата программа (или её часть, оформленная в автоматном стиле) не может содержать неявных элементов состояния, таких как значения локальных переменных в стеке, адреса возврата из функций, значение текущего счётчика команд и т.п.; иначе говоря, состояние программы на любые два момента входа в шаг автомата могут различаться между собой только значениями переменных, составляющих состояние автомата (причём такие переменые должны быть явно обозначены в качестве таковых).
Полностью выполнение кода в автоматном стиле представляет собой цикл (возможно, неявный) шагов автомата.
Название автоматное программирование оправдывается ещё и тем, что стиль мышления (восприятия процесса исполнения) при программировании в этой технике практически точно воспроизводит стиль мышления при составлении формальных автоматов (таких как машина Тьюринга, автомат Маркова и др.)
Автоматное программирование широко применяется при построении лексических анализаторов (классические конечные автоматы) и синтаксических анализаторов (автоматы с магазинной памятью).
Кроме того, мышление в терминах конечных автоматов (то есть разбиение исполнения программы на шаги автомата и передача информации от шага к шагу через состояние) необходимо при построении событийно-ориентированных приложений. В этом случае программирование в стиле конечных автоматов оказывается единственной альтернативой порождению множества процессов или потоков управления (тредов).
Часто понятие состояний и машин состояний используется для спецификации программ. Так, при проектировании программного обеспечения с помощью UML для описания поведения объектов используются диаграммы состояний (state machine diagrams). Кроме того, явное выделение состояний используется в описании сетевых протоколов.
Мышление в терминах автоматов (шагов и состояний) находит применение и при описании семантики некоторых языков программирования. Так, исполнение программы на языке Рефал представляет собой последовательность изменений поля зрения Рефал-машины или, иначе говоря, последовательность шагов Рефал-автомата, состоянием которого является содержимое поля зрения (произвольное Рефал-выражение, не содержащее переменных).
Механизм продолжений языка Scheme для своей реализации также требует мышления в терминах состояний и шагов, несмотря на то что сам язык Scheme никоим образом не является автоматным. Тем не менее, чтобы обеспечить возможность «замораживания» продолжения, приходится при реализации вычислительной модели языка Scheme объединять все компоненты среды исполнения, включая список действий, которые осталось выполнить для окончания вычислений, в единое целое, которое также обычно называется продолжением. Такое продолжение оказывается состоянием автомата, а процесс выполнения программы состоит из шагов, каждый из которых выводит следующее значение продолжения из предыдущего.
Александр Оллонгрен в своей книге описывает так называемый Венский метод описания семантики языков программирования, основанный целиком на формальных автоматах.
В качестве одного из примеров применения автоматной парадигмы можно назвать систему STAT; эта система, в частности, включает встроенный язык STATL, имеющий чисто автоматную семантику.
Существуют также предложения по использованию автоматного программирования в качестве универсального подхода к созданию комьютерных программ вне зависимости от предметной области. Так, авторы статьи утверждают, что автоматное программирование способно сыграть роль легендарной серебряной пули.
Событийно-ориентированное программирование (англ. event-driven programming) — это способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.
Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автоматное программирование.
Компонентно-ориентированное программирование (англ. component-oriented programming) возникло как своего рода дисциплина, то есть набор определенных ограничений, налагаемых на механизм ООП, когда стало ясно, что бесконтрольное использование ООП приводит к проблемам с надежностью больших программных комплексов.
Это так называемая проблема хрупких базовых типов (fragile base class problem); проблема может проявиться при попытке изменить реализацию типа-предка, когда может оказаться, что изменить реализацию типа-предка даже при неизменных интерфейсах его методов невозможно, не нарушив корректность функционирования типов-потомков.
Следует отметить, что структурное программирование ранее тоже возникло как некоторая дисциплина использования структур управления, исключающая бесконтрольные неупорядоченные переходы управления с помощью оператора GOTO.
Томас Сэмюэл Кун
(англ. Thomas Samuel Kuhn; 18 июля 1922, Цинциннати, Огайо — 17 июня 1996, Кембридж, Массачусетс) — американский историк и философ науки, считавший, что научное знание развивается скачкообразно, посредством научных революций. Любой критерий имеет смысл только в рамках определённой парадигмы, исторически сложившейся системы воззрений. Научная революция — это смена научным сообществом психологических парадигм.
Наиболее известной работой Томаса Куна считается — «Структура научных революций» (The Structure of Scientific Revolutions, 1962), в которой рассматривается теория, что науку следует воспринимать не как постепенно развивающуюся и накапливающую знания по направлению к истине, но как явление, проходящее через периодические революции, называемые в его терминологии «сменами парадигм» (англ. Paradigm shift). Изначально «Структура научных революций» была опубликована в виде статьи для «Международной энциклопедии унифицированной науки» («International Encyclopedia for Unified Science»), издаваемой Венским кружком логических позитивистов, или неопозитивистов. Огромное влияние, которое оказало исследование Куна, можно оценить по той революции, которую она спровоцировала даже в тезаурусе истории науки: помимо концепции «смены парадигм», Кун придал более широкое значение слову «парадигма», использовавшемуся в лингвистике, ввёл термин «нормальная наука» для определения относительно рутинной ежедневной работы учёных, действующих в рамках какой-либо парадигмы, и во многом повлиял на использование термина «научные революции» как периодических событий, происходящих в различное время в различных научных дисциплинах, — в отличие от единой «Научной Революции» позднего Ренессанса.
1 -При переходе к зрелой науке на основе идей одной (или нескольких) научных школ возникает общепринятая парадигма;
2 - одно из главных направлений деятельности нормальной науки -- обнаружение и объяснение фактов как фактов, подтверждающих парадигму;
3 - при таком исследовании часть фактов трактуется как аномалии -- факты, противоречащие парадигме;
4 - в период кризиса доверие к парадигме в известной степени подорвано, но она еще сохраняет свое значение;
5 - для объяснения аномальных фактов возникает новая теория как реакция на кризис;
6 - в ряде случаев новая теория может быть отринута, а часть аномальных фактов путем "решения задач-головоломок" объясняется старой парадигмой;
7, 8 - новая теория приобретает статус парадигмы и, в результате научной революции, полностью (или частично) замещает старую парадигму.
Допарадигмальный период в развитии науки характеризуется наличием большого числа школ и различных направлений. Каждая школа по-своему объясняет различные явления и факты, лежащие в русле конкретной науки, причем в основе этих интерпретаций могут находиться различные методологические и философские предпосылки. В качестве примера можно рассмотреть историю физической оптики. От глубокой древности до конца XVII века не было периода, для которого была бы характерна единственная и общепринятая в научном сообществе точка зрения на природу света. Вместо этого было множество противоборствующих школ, большинство из которых придерживалось какой-либо разновидности теории Эпикура, Аристотеля или Платона. Одно из направлений рассматривало свет как частицы, испускаемые материальным телом; для другого свет был модификацией среды, находящейся между этим телом и человеческим глазом; кроме того, свет объяснялся в терминах взаимодействия среды с излучением самих глаз. Хотя представители всех этих школ физической оптики до Ньютона были учеными, результат их деятельности нельзя в полной мере назвать научным. Не имея возможности принять какую-либо общую основу для своих убеждений, представители каждой школы пытались строить свою собственную физическую оптику заново, начиная с наблюдений.
Ученые свои труды адресовали не к своим коллегам, а скорее к оппонентам из других школ в данной области исследований и ко всякому, кто заинтересуется предметом их исследования. С современной точки зрения, их труды можно отнести в разряд научно-популярных изданий.
Допарадигмальный период, по мнению Куна, характерен для зарождения любой науки. Ситуация, описанная выше, типична в развитии каждой науки, прежде чем эта наука выработает свою первую всеми признанную теорию вместе с методологией исследований -- то, что Кун называет парадигмой. На ранних стадиях развития любой науки различные исследователи, сталкиваясь с одними и теми же категориями явлений, далеко не всегда одинаково описывают и интерпретируют одни и те же явления. Исключение могут составить такие науки, как математика или астрономия, в которых первые прочные парадигмы относятся к их предыстории, а также дисциплины, подобные биохимии, возникающие на стыке уже сформировавшихся отраслей знания. Одновременно с тем, начало астрономии характеризовалось "многопарадигмальностью". В таких разделах биологии, как, например, учение о наследственности, первые парадигмы появились лишь в XX веке.
На смену допарадигмальной науки приходит, по мнению Куна, зрелая наука. Зрелая наука характеризуется тем, что в данный момент в ней существует не более одной общепринятой парадигмы.
Первоначальные расхождения, характерные для ранних стадий развития науки, с появлением общих теоретических и методологических предпосылок и принципов постепенно исчезают, сначала в весьма значительной степени, а затем и окончательно. Более того, их исчезновение обычно вызвано триумфом одной из допарадигмальных школ, например, общественным признанием парадигмы Франклина в области исследования электрических явлений.
Существование парадигмы предполагает и более четкое определение области исследования в зрелой науке (или профессионализм). Именно благодаря принятию парадигмы школа, интересовавшаяся ранее изучением природы из простого любопытства, становится вполне профессиональной научной школой, а предмет ее интереса превращается в научную дисциплину.
В наши дни такие парадигмы или научные достижения, которые в течение долгого времени признаются определенным научным сообществом как основа для развития его дальнейшей деятельности, излагаются в учебниках. Учебники разъясняют сущность принятой теории, иллюстрируют многие ее применения и сравнивают эти применения с типичными наблюдениями и экспериментами. Они определяют правомерность проблем и методов исследования каждой области науки для последующих поколений ученых. До того как подобные учебники стали общераспространенными, аналогичную функцию выполняли знаменитые классические труды ученых: "Начала" и "Оптика" Ньютона, "электричество" Франклина, "Химия" Лавуазье и многие другие. Их создание было в достаточной мере беспрецедентным, чтобы на долгое время отвратить ученых от конкурирующих концепций, и, в то же время, они были достаточно открытыми, чтобы новые поколения ученых могли в их рамках найти для себя нерешенные проблемы любого вида.
Зрелая наука в своем развитии последовательно проходит несколько этапов. Период нормальной науки сменяется периодом кризиса, который либо разрешается методами нормальной науки, либо приводит к научной революции, которая заменяет парадигму. С полной или частичной заменой парадигмы снова наступает период нормальной науки.
Согласно концепции Куна, развитие науки идет не путем плавного наращивания новых знаний на старые, а через смену ведущих представлений -- через периодически происходящие научные революции. Однако, действительного прогресса, связанного с возрастанием объективной истинности научных знаний, Кун не признает, полагая, что такие знания могут быть охарактеризованы лишь как более или менее эффективные для решения соответствующих задач, а не как истинные или ложные.
В этой связи следует отметить, что Кун не связывает явно смену парадигм с преемственностью в развитии науки, с движением по спирали от неполного знания к более полному и совершенному. По моему мнению, Кун опускает вопрос о качественном соотношении старой и новой парадигмы: является ли новая парадигма, пришедшая на смену старой, лучше с точки зрения прогресса в научном познании? Спираль развития зрелой науки у Куна не направлена вверх к высотам "абсолютной истины", она складывается стихийно в ходе исторического развития науки.
"Нормальной наукой" Кун называет исследование, прочно опирающееся на одно или несколько прошлых научных достижений, которые в течение некоторого времени признаются определенным научным сообществом в качестве основы для развития, то есть это исследование в рамках парадигмы и направленное на поддержание этой парадигмы. При ближайшем рассмотрении "создается впечатление, будто бы природу пытаются втиснуть в парадигму, как в заранее сколоченную и довольно тесную коробку", "явления, которые не вмещаются в эту коробку, часто, в сущности, вообще упускаются из виду".
Нормальная наука не ставит своей целью создание новой теории, и успех в нормальном научном исследовании состоит не в этом. Исследование в нормальной науке направлено на разработку тех явлений и теорий, существование которых парадигма заведомо предполагает. Кратко деятельность ученых в рамках нормальной науки можно охарактеризовать как наведение порядка (ни в коем случае не революционным путем).
По мнению Куна, "три класса проблем -- установление значительных фактов, сопоставление фактов и теории, разработка теории -- исчерпывают... поле нормальной науки, как эмпирической, так и теоретической"2. Подавляющее большинство проблем, поднятых даже самыми выдающимися учеными, обычно охватывается этими тремя категориями. Существуют также экстраординарные проблемы, но они возникают лишь в особых случаях, к которым приводит развитие нормального научного исследования. Работа в рамках парадигмы не может протекать иначе, а отказаться от парадигмы значило бы прекратить те научные исследования, которые она определяет. В случае отказа от парадигмы мы приходим к научной революции.
Понятие "нормальной науки", введенное Куном, подверглось острой критике сторонниками критического рационализма во главе с Карлом Поппером. Поппер согласен с тем, что нормальная наука существует, но если Куну этот феномен представляется как нормальный, то Поппер в работе "Нормальная наука и ее опасности" (1970) рассматривает его как опасный для науки в целом.
В критике понимания Куном нормальной науки можно выделить два направления. Во-первых, полное отрицание самого существования нормальной науки. С этой точки зрения наука никогда бы не сдвинулась с места, если бы основной деятельностью ученых была нормальная наука, как ее представляет Кун. Сторонники этого направления в критике Куна полагают, что нормальной науки, предполагающей только кумулятивное накопление знания, вообще не существует; что из нормальной науки Куна не может вырасти революции. "Нормальная наука" отождествляется с теоретическим застоем или стагнацией в науке.
Второе направление в критике нормальной науки представлено К.Поппером. Он признает существование нормальной науки, но вместе с тем принижает ее роль. Нормальная наука Куна, как считает Поппер, представляет опасность для самого существования науки. "Нормальный" ученый вызывает у Поппера чувство жалости: он не привык к критическому мышлению. На самом деле, хотя ученый и работает обычно в рамках какой-то теории, при желании он может в любой момент выйти за эти рамки. Неверно, однако, на этом основании говорить об истории науки как о непрерывной революции, к чему склоняется Поппер, и принижать роль нормальной науки как периода эволюционного развития в науке.
Действительно, в понимании Куна "самая удивительная особенность проблем нормальной науки... состоит в том, что они в очень малой степени ориентированы на крупные открытия, будь то открытие новых фактов или создание новой теории"3. Ученые в русле нормальной науки не ставят себе цели создания новых теорий, каких-то значительных качественных (революционных) преобразований в своей научной дисциплине. Для них результат научного исследования значителен уже потому, что он расширяет область применения парадигмы и уточняет некоторые параметры. Такие результаты, особенно в математике, могут быть предсказаны, но сам способ получения результата или доказательство остается в значительной мере сомнительным. Возникающие проблемы часто оказываются трудными для разрешения, хотя предшествующая практика нормальной науки дала все основания считать их решенными или почти решенными в силу существующей парадигмы. Завершение проблемы исследования требует решения всевозможных сложных инструментальных, концептуальных и математических задач-головоломок.
Таким образом, нормальная наука предстает у Куна как "решение головоломок". Ученый, который преуспеет в этом, становится специалистом своего рода по решению задач-головоломок, и стремление к разрешению все новых и новых задач-головоломок становится стимулом его дальнейшей активности, хотя он и не выходит за рамки нормальной науки. Среди главных мотивов, побуждающих к научному исследованию, можно назвать желание решить головоломку, которую до него не решал никто или в решении которой никто не добился убедительного успеха.
Во Франции концепция Куна стала соотноситься с теориями Мишеля Фуко (соотносились термины «парадигма» Куна и «эпистема» Фуко) и Луи Альтюссера, хотя те скорее занимались историческими «условиями возможного» научного дискурса. (В действительности мировоззрение Фуко было сформировано под влиянием теорий Гастона Башляра, который независимо разработал точку зрения на историю развития науки, схожую с кунновской.) В отличие от Куна, рассматривающего различные парадигмы в качестве несопоставимых, по концепции Альтюссера, наука имеет кумулятивную природу, хоть данная кумулятивность и дискретна.
Работа Куна весьма широко используется в социальных науках — например, в постпозитивистско-позитивистской дискуссии в рамках теории международных отношений.
Ход научной революции по Куну:
- нормальная наука — каждое новое открытие поддаётся объяснению с позиций господствующей теории;
- экстраординарная наука. Кризис в науке. Появление аномалий — необъяснимых фактов. Увеличение количества аномалий приводит к появлению альтернативных теорий. В науке сосуществует множество противоборствующих научных школ;
- научная революция — формирование новой парадигмы.
Смена парадигм
Смена парадигм (англ. Paradigm shift) — термин, впервые введённый историком науки Томасом Куном в книге «Структура научных революций» (1962) для описания изменения базовых посылок в рамках ведущей теории науки (парадигмы). Впоследствии термин стал широко применяться и в отношении других сфер человеческого опыта.
Теория научных революций
Парадигма. По определению Томаса Куна, данному в «Структуре научных революций», научная революция — эпистемологическая смена парадигмы.
Под парадигмами я подразумеваю признанные всеми научные достижения, которые в течение определенного времени дают модель постановки проблем и их решений научному сообществу. (Т. Кун)
Согласно Куну, научная революция происходит тогда, когда учёные обнаруживают аномалии, которые невозможно объяснить при помощи универсально принятой парадигмы, в рамках которой до этого момента происходил научный прогресс. С точки зрения Куна, парадигму следует рассматривать не просто в качестве текущей теории, но в качестве целого мировоззрения, в котором она существует вместе со всеми выводами, совершаемыми благодаря ей.
Можно выделить, по меньшей мере, три аспекта парадигмы:
Парадигма — это наиболее общая картина рационального устройства природы, мировоззрение;
Парадигма — это дисциплинарная матрица, характеризующая совокупность убеждений, ценностей, технических средств и т. д., которые объединяют специалистов в данное научное сообщество;
Парадигма — это общепризнанный образец, шаблон для решения задач-головоломок. (Позднее, в связи с тем, что это понятие парадигмы вызвало толкование, неадекватное тому, какое ему придавал Кун, он заменил его термином «дисциплинарная матрица» и тем самым ещё более отдалил это понятие по содержанию от понятия теории и теснее связал его с механической работой ученого в соответствии с определенными правилами.)
Смена парадигм. Конфликт парадигм, возникающий в периоды научных революций, — это, прежде всего, конфликт разных систем ценностей, разных способов решения задач-головоломок, разных способов измерения и наблюдения явлений, разных практик, а не только разных картин мира.)))
Для любых парадигм можно найти аномалии, по мнению Куна, которые отметаются в виде допустимой ошибки либо же просто игнорируются и замалчиваются (принципиальный довод, который использует Кун для отказа от модели фальсифицируемости Карла Поппера как главного фактора научного достижения). Кун считает, что аномалии скорее имеют различный уровень значимости для учёных в отдельно взятое время. Например, в контексте физики начала XX века, некоторые учёные столкнулись с тем, что задача подсчитать апсиду Меркурия воспринималась ими как более сложная, чем результаты эксперимента Михелсона—Морли, а другие видели картину вплоть до противоположной. Куновская модель научного изменения в данном случае (и во многих других) отличается от модели неопозитивистов в том, что акцентирует значительное внимание на индивидуальности учёных, а не на абстрагировании науки в чисто логическую или философскую деятельность.
физикиD0%B7%D0%BE%D0%BC">
Когда накапливается достаточно данных о значимых аномалиях, противоречащих текущей парадигме, согласно теории научных революций, научная дисциплина переживает кризис. В течение этого кризиса испытываются новые идеи, которые, возможно, до этого не принимались во внимание или даже были отметены. В конце концов, формируется новая парадигма, которая приобретает собственных сторонников, и начинается интеллектуальная «битва» между сторонниками новой парадигмы и сторонниками старой.
Увеличение конкурирующих вариантов, готовность опробовать что-либо ещё, выражение явного недовольства, обращение за помощью к философии и обсуждение фундаментальных положений — все это симптомы перехода от нормального исследования к экстраординарному. (Т. Кун).
Примером из физики начала XX века может служить переход от максвелловского электромагнетического мировоззрения к эйнштейновскому релятивистскому мировоззрению, который не произошёл ни мгновенно, ни тихо, а вместо этого произошёл вместе с серией горячих дискуссий с приведением эмпирических данных и риторических и философских аргументов с обеих сторон. В итоге, теория Эйнштейна была признана более общей. И вновь, как и в других случаях, оценка данных и важности новой информации прошла через призму человеческого восприятия: некоторые учёные восхищались простотой уравнений Эйнштейна, тогда как другие считали, что они более сложны, чем теория Максвелла. Аналогично, некоторые учёные находили изображения Эддингтона света, огибающего Солнце, убедительными, тогда как другие сомневались в их точности и интерпретации. Зачастую в качестве силы убеждения выступает само время и естественное исчезновение носителей старого убеждения; Томас Кун в данном случае цитирует Макса Планка:
Новая научная истина не достигает триумфа путём убеждения своих оппонентов и их просветления, но это, скорее, происходит оттого, что её оппоненты в конце концов умирают и вырастает новое поколение, с ней знакомое. (Т. Кун)
Когда научная дисциплина меняет одну парадигму на другую, по терминологии Куна, это называется «научной революцией» или «сдвигом парадигмы».
Решение отказаться от парадигмы всегда одновременно есть физикие принять другую парадигму, а приговор, приводящий к такому решению, включает как сопоставление обеих парадигм с природой, так и сравнение парадигм друг с другом. (Т. Кун)
В разговорной речи термин «смена (или сдвиг) парадигмы» используется при описании зачастую радикального изменения мировоззрения без отсылки к особенностям кунновской исторической аргументации.
Общие положення
Некоторые общие положения теории Куна можно суммировать следующим образом:
Движущей силой развития науки являются люди, образующие научное сообщество, а не нечто, заложенное в саму логику развития науки;
Развитие знания определяется сменой господствующих парадигм, а не простым суммированием знаний, то есть происходят не только (и не столько) количественные, но и качественные изменения в структуре научных знаний;
Наука развивается по принципу чередования периодов «нормальной» и «революционной» науки, а не путем накопления знаний и присоединения их к уже имеющимся.
Примеры смен парадигм в науке
Есть ряд классических примеров для теории Куна о смене парадигм в науке. Наиболее распространённая критика Куна со стороны историков науки, однако, состоит в утверждении, что наблюдение чистой смены парадигм можно рассматривать только на весьма абстрактном срезе истории любого теоретического изменения. Согласно данным критическим замечаниям, если взглянуть на всё в деталях, становится очень трудно определить момент смены парадигм, если не исследовать лишь педагогические материалы (такие, как учебники, изучая которые Кун и разрабатывал свою теорию). Следующие события попадают под определение кунновской смены парадигм:
Смена птолемеевской космологии коперниковской.
Объединение предприятий классической физики Ньютоном в связанное механистическое мировоззрение.
Замена максвелловского электромагнетического мировоззрения эйнштейновским релятивистским мировоззрением.
Развитие квантовой физики, переопределившей классическую механику.
Развитие теории Дарвина об эволюции путём естественного отбора, отбросившей креационизм с позиций главенствующего научного объяснения разнообразия жизни на Земле.
Принятие теории тектонических плит в качестве объяснения крупномасштабных геологических изменений.
Принятие теории химических реакций и окисления Лавуазье вместо теории флогистона (химическая революция).
Когнитивное направление в психологии, заключившееся в отходе от бихевиористского подхода к психологическим исследованиям и переходе к изучению когнитивных способностей человека как главного фактора для изучения поведения, и трансперсональное движение, предложившее новый взгляд на надличностный опыт и человеческое развитие.
Теория Джеймса Лавлока о биосфере как единой живой органической системе.
Замена в теории Дарвина концепции синхронной эволюции на асинхронную.
физики%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8_%D0%A2%D0%BE%D0%BC%D0%B0%D1%81%D0%B0_%D0%9A%D1%83%D0%BD%D0%B0_%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BD%D0%B0%D1%83%D1%87%D0%BD%D1%8B%D1%85_%D1%80%D0%B5%D0%B2%D0%BE%D0%BB%D1%8E%D1%86%D0%B8%D0%B9">
Источники
Лефевр В. А., Рефлексия, М., «Когито-Центр», 2003 г., с. 96.
Питер Друкер, Задачи менеджмента в XXI веке, М., «Вильямс», 2001 г., с. 39-40.
Акофф Р. Планирование будущего корпораций.- М.: Прогресс, 1985. — 328 с.
Ансофф И. Новая корпоративная стратегия.- СПб.: ПитерКом, 1999.- 416 с.
Ансофф И. Стратегическое управление.- М.: Экономика, 1989. — 519 с.
Бир Ст. Кибернетика и управление производством. — М.: Наука,1965.- 392 с.
Блауг М. Методология экономической науки, или как экономисты объясняют. — М.: НП «Журнал Вопросы экономики», 2004.
http://ru.wikipedia.org/
Энциклопедия инвестора. 2013.