Название и автор статьи
Роберт В. Флойд. 1979. Парадигмы программирования. Сообщения ACM 22, 8 (1979), 455-460.

Резюме
Настали интересные времена! Мы находимся в середине бума языков программирования. Существует множество языков программирования, каждый со своей историей, предысторией, синтаксисом, семантикой и прагматикой. Многие из этих языков поддерживают различные парадигмы (декларативную, императивную, функциональную, объектно-ориентированную и т. Д.), А также многие концепции программирования (состояние и состояние имени, записи и индексированные структуры данных, замыкания с лексической областью видимости, лень / ленивое вычисление, рекурсия и хвост оптимизация, сборка мусора и т. д.).

Один из подходов к изучению компьютерного программирования - изучение языков программирования. Но существует огромное количество языков программирования, настолько большое, что изучать их все непрактично! Как справиться с этой необъятностью? Мы могли бы выбрать небольшое количество языков, которые представляют разные парадигмы программирования. Но это дает мало понимания программирования как единой дисциплины. Существует острая необходимость в четком пути к пониманию программирования как единой области, не обремененной бесчисленным множеством языков программирования.

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

  1. Парадигмы программирования.
  2. Влияние парадигм программ на наш успех как разработчиков программ.
  3. Как следует преподавать парадигмы программ.
  4. Как парадигмы должны воплощаться в наших языках программирования.

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

Парадигмы программирования

По словам Роберта Флойда, парадигмы программирования - это общие правила для решения схожих проблем, которые позволят разработчику программы подойти к данной проблеме наиболее эффективным способом с первого раза.

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

Роберт Флойд использует материал философа науки Томаса Хуна под названием Структура научных революций, чтобы подчеркнуть, что:

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

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

Влияние парадигм на наш успех как разработчиков программ

Обсуждение влияния парадигм программирования на успех разработчиков программ; Роберт Флойд привел два примера:

Случай 1
Роберт Флойд использует проблему синтаксического анализа контекстно-свободного языка, которая имеет первостепенное значение для разработки компиляторов и естественной лингвистики. .

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

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

Случай 2
Еще одним примером эффективной разработки парадигмы является работа Shortliffe и Davis над MYCIN Программа.

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

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

Флойд также поделился своим опытом и техникой расширения собственных возможностей при разработке сложных алгоритмов:
«После решения сложной проблемы я снова решаю ее с нуля, возвращаясь только к предыдущему решению. Я повторяю это до тех пор, пока решение не станет настолько ясным и прямым, насколько я могу надеяться. Затем я ищу общее правило для решения подобных проблем, которое привело бы меня к наиболее эффективному подходу к данной проблеме с первого раза ».

Как парадигмы программирования должны быть воплощены в новых языках программирования

Флойд начинает иллюстрировать важность того, как парадигмы должны воплощаться в новых языках программирования, заявляя, что:

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

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

Как следует преподавать парадигмы программ

Большинство классических алгоритмов, встречающихся в текстах по компьютерному программированию, можно рассматривать как примеры более широких парадигм. Например, алгоритм сортировки слиянием является примером парадигмы «разделяй и властвуй». Для каждого такого классического алгоритма можно спросить: «Как я мог это изобрести?» И восстановить то, что должно быть столь же классической парадигмой.

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

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

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

Вклады приветствуются, комментарии приветствуются.

Спасибо сообществу NP-CORE за возможность опубликовать этот бумажный обзор.