ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ – ЧЕРЕЗ ПРИЗМУ МОДЕЛИ ТОМАСА КУНА - Студенческий научный форум

X Международная студенческая научная конференция Студенческий научный форум - 2018

ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ – ЧЕРЕЗ ПРИЗМУ МОДЕЛИ ТОМАСА КУНА

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

В 1979 году Роберт Флойд в лекции лауреата премии Тьюринга обратился к работе Томаса Куна «Структура научных революций», впервые обозначив программирование как науку, введя в широкое использование новый термин: «парадигма программирования» [9]. Уже седьмая, по счету, парадигма, аспектно-ориентированная, теснит предыдущую парадигму, а видные деятели Computer Science так и не смогли принять решение относительно единого определения этого понятия.

Так что же такое парадигма в программировании? И почему этот термин так удачно был принят сообществом? Ответы на эти вопросы позволят приблизиться к пониманию вектора развития науки программирования и будут рассмотрены в данной статье.

Томас Кун в книге «Структура научных революций» описывает модель развития науки. Ключевым понятием данной модели является понятие «парадигма». Парадигма охватывает множество базовых основополагающих теорий и методологий (правил вывода новых законов), действующих в некоторой области науки, принимаемых научным сообществом на данном этапе. Это понятие выведено из рассмотрения истории развития наук, которая по Т. Куну, состоит из циклически повторяющихся нескольких этапов.

1. Стадия фундаментальных разногласий. Характерная черта этого этапа существование нескольких теорий, частично или полностью противоречащих друг другу. Понятие «теории» близко к понятию «парадигмы», однако существуют ключевые различия: работа учёных в рамках парадигмы направлена на расширение знаний о предметной области, установление новых законов и закономерностей; в то время как работа в рамках теории на этапе фундаментальных разногласий направлена на доказательство состоятельности данной теории или опровержение правильности противоречащей теории.

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

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

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

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

Обратимся к истории развития программирования с целью ознакомления с понятием «парадигма программирования». В 1979 году, в самом начале своей лекции лауреата премии Тьюринга, Роберт Флойд обратился к словам Роберта Бэлзера о состоянии искусства программирования: «Хорошо известно, что программное обеспечение находится в жалком виде. Оно ненадежно, появляется с опозданием, не реагирует на происшедшие перемены, неэффективно и дорого. Более того, поскольку в настоящее время его создание трудоемко, то ситуация будет и дальше ухудшаться по мере возрастания спроса и увеличения расходов на рабочую силу». Употребив фразу «кризис программного обеспечения» Флойд сослался на труд «Структура научных революций» Томаса Куна [2], впервые рассмотрев программирование как науку, привнеся термин парадигмы: «Кун описывает научные революции … как возникающие изменения в доминирующих парадигмах. Некоторые из наблюдений Куна выглядят применимым к нашей области» [9].

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

Диомидис Спинеллис: парадигма – это термин, «использующийся для определения семейства обозначений (нотаций), разделяющих общий способ (методику) реализаций программ» [14];

– Дэниел Бобров: парадигма – это «стиль программирования как описания намерений программиста [10];

– Питер Вегнер: парадигма – это «правила классификации языков программирования в соответствии с некоторыми условиями, которые могут быть проверены» [11];

– Памела Зейв: парадигма – это «способ размышления о компьютерных системах» [12];

– Линда Фридман: парадигма – это «подход к решению проблем программирования» [13].

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

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

В 1954 году компания IBM представила IBM 704 – первый компьютер, аппаратно-поддерживающий вычисления с плавающей точкой. Как и все прочие ЭВМ, она поддерживала язык Ассемблера, но этого оказалось недостаточно: вычисление дискриминанта квадратного уравнения занимало целых десять строк, что сводило на нет все преимущества машины. Осознав это, один из инженеров IBM – Джон Бэкус – организовал группу из девяти человек, чтобы из концепции независимого от архитектуры ЭВМ языка программирования, позволяющего изящно реализовывать формулы, получить в 1957 году FORmula TRANslator. FORTRAN и его идеологический наследник Algol стали первыми языками программирования второго поколения, до конца оформив процедурную парадигму: «Реализацию алгоритмов вычислений необходимо создавать с помощью мелких, не зависимых друг от друга процедур, которые вызывают друг друга в соответствии с логикой программы». С тех самых пор программисты получили возможность синхронизировать декомпозицию задачи с декомпозицией программы, иными словами, научились нарезать мир тонкими ломтиками.

Парадигмы программирования всегда появлялись как реакция на возникновение определённой задачи. Во время второй мировой войны возникла задача расчета траекторий баллистических ракет. Собранные для этой цели группы математиков не справлялись с задачей осуществления столь быстрых математических расчетов, ввиду чего для вычислений стали использовать вычислительные машины. Спустя 10 лет проблема не стала менее актуальной: машиноориентированные языки были неудобны для математических вычислений, ввиду их ориентированности на управление аппаратурой компьютера и даже Fortran не особо помог, поскольку основывался на императивной парадигме – детище концепции машины Тьюринга, неудобной для математика. В 1958 году профессор Массачусетского технологического института Джон Маккарти, представил язык обработки списков LISt Processor – первом языке, действие которого основывалось на концепции лямбда-исчислений Алонзо Чёрча. В Lisp не было самого понятия переменных: функции принимали в качестве аргументов другие функции, образуя модульную программу, описывающую в виде алгоритма последовательность вычисления заданного результата. Данный язык программирования дал начало функциональной парадигме программирования, описывающей алгоритм работы программы в виде последовательности вычисления математических функций.

Новый виток противоречийвозник с необходимостью обработки символьной информациинеформализованных с математической точки зрения данных. При решении задач такого рода требовалось не вычислить значение по некоторой формуле, а выдать логическое заключение по определённому высказыванию. Иными словами, необходимо было реализовать исчисление предикатов – логику первого порядка. Первым языком, реализующим «логическую» парадигму, стал Planner, разработанный Карлом Хьюитом в лаборатории искусственного интеллекта Массачусетского технологического института в 1969 году. Согласно новому подходу, предметная область описывалась в виде фактов, устанавливающих базовые зависимости между некоторыми сущностями, и правил, используемых для получения фактов недостающих. В такой среде поиск решения сводился не к последовательности вычислений, а к обработке информации о предметной области и поиску необходимого факта.

Вернемся к императивной парадигме. В марте 1968 года Эдсгер Дейкстра написал статью-воззвание с заголовком «Доводы против оператора GoTo», переименованную с подачи Никлауса Вирта в «Оператор GoTo считается вредным» [15]. Тезис «квалификация программистов – функция, обратно зависящая от частоты появления операторов GoTo в их программах» настолько взбудоражил умы общественности, что даже привел к формированию новой парадигмы – структурной. Основной задачей «структурной парадигмы» стало избавление от «спагетти-кода» – кода, ход выполнения которого был похож на миску спагетти. Безусловно, запутанный код, мог работать правильно, и, быть может, даже работал оптимально, однако, его сопровождение оказывалось очень затратным. Новая парадигма стала концепцией перераспределения приоритетов между производительностью и близостью к исходной идее, алгоритму.

По состоянию на 2017 год самым популярным языком программирования (по версии GitHub) является Java, реализующий объектно-ориентированную парадигму. Первое понимание ООП было сформировано еще при разработке Кристеном Ньюгордом и Оле-Йоханом Далем языка программирования Simula в первой половине 1960-х годов. Помимо введения революционных языковых свойств будущие командоры ордена Святого Олафа сосредоточились на идее моделирования реальных явлений в коде программы, а именно, на концепции представления идей в виде классов и объектов классов с ярко выраженными иерархическими отношениями. К сожалению, посредственная реализация и чрезмерная революционность, привели к непопулярности Simula как языка программирования, однако, сама идея не только не умерла, но и была развита Бьярне Страуструпом. Начав в 1979 году разработку «С с классами» он в 1985 году выпускает первую коммерческую версию языка С++, а после начинает его стандартизацию. «Одни языки люди разрабатывали, чтобы доказать свою правоту, а другие – для того, чтобы решить задачу». Сформулировав три столпа ООП (инкапсулирование, наследование и полиморфизм) Бьярне Страуструп завершил сближение мира реального с миром программным, ибо невозможно решить задачу реального мира в отрыве от него.

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

Рассмотрим сходства и различия парадигм Куна и парадигм программирования.

По своему смыслу данные понятия схожи. Помимо определения через научное сообщество Кун вводит «парадигму» как «дисциплинарную матрицу» [2]. Парадигма дисциплинарная, поскольку учитывает принадлежность ученых к определенной дисциплине, и является матрицей, поскольку составлена из упорядоченных элементов разного рода. Докажем, что объектно-ориентированная Флойдовская парадигма является парадигмой с точки зрения Т. Куна. Дисциплинарная матрица – понятие, с помощью которого Кун конкретизировал понятие парадигмы, состоит из:

Символических обобщений – выражений, используемых членами научной группы без сомнений и разногласий. Обобщением в ООП (объектно-ориентированная парадигма) можно считать само понятие объекта. Объект класса инкапсулирует внутри себя данные, предоставляя публичные методы для взаимодействия с ними. Класс может быть наследником другого класса, переопределение методов которого позволит активировать механизм полиморфизма.

Метафизических частей парадигм – моделей. Основополагающей идеей ООП является предположение, что мир представляет собой набор взаимодействующих объектов – экземпляров того или иного класса.

Ценностных установок. Как ценность в ООП можно рассмотреть «правила хорошего тона». Привитые со студенческой статьи они помогают в решении «головоломок» – реализации алгоритмов.

Общепринятых образцов принятия решения в определенных ситуациях. Это есть паттерны проектирования, прекрасно изложенные в «книге банды четырех» [2;16].

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

Машиноориентированные языки создавались для управления отдельными компонентами вычислительной системы.

Ассемблерные языки были признаны упростить программирование путём замены кодов команд их мнемоническим описанием и, в некоторой степени, абстрагироваться от архитектуры конкретной вычислительной машины.

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

Логическая парадигма создана для обработки символьной неформализованной с точки зрения математики информации.

Процедурная парадигма позволяла декомпозировать объёмные программы на отдельные вычислительные модули и облегчить разработку и обслуживание ПО.

Объектно-ориентированная парадигма программирования позволяет описать объекты реального мира в виде объектов в программе, определив правила безопасной работы с ними.

Основное различие между данными понятиями касается их места в науке. Парадигма Куна – единственная в определенной науке в определенный момент времени. В то время как парадигмы программирования существуют одновременно, дополняя друг друга.

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

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

Можно сделать вывод, что понятие парадигмы Томаса Куна и понятие парадигмы программирования тождественны, когда мы отмечаем их роль. Можно найти и различие в традиционно используемой, в куновском смысле, парадигме, и в используемых парадигмах программирования. Согласно модели развития Т. Куна, парадигма всегда единственная для определённой области науки и принимается научным сообществом на текущем этапе её развития, а парадигмы программирования совместно сосуществуют, разделяя науку программирования на несколько предметных подобластей по роду решаемых подзадач: а) программирование микроконтроллеров – машинно-ориентированная и процедурная парадигмы; б) информационно-вычислительные центры – функциональная парадигма программирования; в) экспертные, интеллектуальные системы – логическая парадигма; г) десктопные и веб-приложения – объектно-ориентированная парадигма.

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

Список литературы

[1]. Бостром, Н. Искусственный интеллект. Этапы. Угрозы. Стратегии; пер. с англ. С. Филина. – М.: Манн, Иванов и Фербер, 2016. – 496 с.

[2]. Кун, Т. Структура научных революций. С вводной статьей и дополнениями 1969 г.; пер. с англ. И.З. Налетовой. – М.: Прогресс, 1977. – 300с.

[3]. Кун, Т. После «Структура научных революций»; пер. А.Л. Никифорова. – М.: АСТ, 2014. – 443 с.

[4]. Михайлова, Т.Л. От модели Т. Куна – к конструированию концептуальной истории науки, или об одном учебном проекте // Революция и эволюция: модели развития в науке, культуре, социуме; сборник научных статей; под общей ред. И.Т. Касавина, А.М. Фейгельмана. – Н.Новгород. 2017. – С.62-65.

[5]. Мындреску, А.В. Эвристический потенциал книги Томаса Куна «Структура научных революций» в формировании специалиста по направлению «Информационный сервис» / А.В. Мындреску, Т.Л. Михайлова // Будущее технической науки: сборник материалов XIV Международной молодежной научно-практической конференции. 2015. – С. 581-582.

[6]. Парадигма программирования [Электронный ресурс]. – URL: www: // http: // ru. Wikipedia.org /wiki

[7]. www: // http: // math.csu.ru /~rusear /SKT_MT 401_Liter / ProgrammingParadigm (Wikepedia).ttm

[8]. www: // http: //xreff.ru /81822.html

[9]. R. W. Floyd. The Paradigms of Programming CommunicationsoftheACM, 22(8):455-460, 1979. – Русский перевод см. в кн.: Лекции лауреатов премии Тьюринга за первые двадцать лет (1966-1985), М.: МИР, 1993.

[10]. D. G. Bobrow. If Prolog is the answer, what is the question. // Fifth Generation of Computer Systems, pages 138-145, Tokyo, Japan, November 1984. Institute for New Generation Computer Technology (ICOT), North-Holland.

[11]. P. Wegner. Concepts and paradigms of object-oriented programming. {OOPS} messenger}, 1(1): 7-87, August 1990.

[12]. P. Zave. A compositional approach to multiparadigm programming. IEEE Software, 6(5): 15-25, September 1989.

[13]. L. W. Friedman. Comparative programming languages: generalizing the programming function. Prentice Hall, 1991, page 188.

[14]. D. D. Spinellis. Programming paradigms as object classes: a structuring mechanism for multiparadigm programming. PhD thesis, University of London, London SW7 2BZ, United Kingdom, February 1994.

[15]. ЭдсгерВ. Дейкстра «Доводыпротивоператора goto» Communications of the ACM, Vol. 11, No. 3, March 1968, pp. 147-148.

[16]. Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес Design Patterns:

Elements of Reusable Object-Oriented Software; переводА. Слинкин: «Питер» 1994. 395 c.

Просмотров работы: 345