«Парадигмы программирования», 2024, вводная лекция
YouTube/Yandex (YouTube, прямой эфир)
Что такое «программирование»?
Алгоритм — «это когда»
Алгоритм — «это когда» (∃ только операциональное определение)
- формализована задача (класс задач)
- формализованы однозначно интерпретируемые действия (правила, инструкции и т. п.) при решении задач
- формализован исполнитель этих действий:
- порядок (не обязательно «последовательность») исполнения,
- представление объектов из предметной области задачи
- и т. п.
- есть конечная запись действий (программа),
- приводящая к решению задачи за конечное число действий исполнителя
- для одной и той же задачи решение всегда одинаковое
Алгоритмически полные формализмы
Примеры:
Рекурсивная функция (теория вычислимости)
- Пример функции сложения и умножения (изначально сложения нет, есть только следование, которое можно понимать как +1)
Sum = I^1_1 <- s { I^3_3 }; Mul = o <- Sum { I^3_1, I^3_3 };
Примеры и учебники по SWI Prolog
В частности, пример с 8 ферзями
- …
Тезис Чёрча
⇒ Вещественных чисел ∄
Сверхтьюринговые вычисления — хайп или прогноз?
UPD 2024-09-01 — скорее всего, это был хайп: надежда на квантовые компьютеры не оправдалась (вспомнили, что ещё в 1997 году была доказана их PSPACE-приводимость)
Требования к алгоритмически полной системе (нечёткие)
- Соответствие операциональному определению алгоритма
+ Аллегируемые объекты
- + Действия, обусловленные свойствами объектов
Даже про эти нечёткие «требования» мы не знаем, обязательны они или нет.
Эквивалентность какой-либо актуальной алгоритмически полной системе
…ещё более строгое ограничение
Следствие: отсутствие концептуальных определений у общих терминов
Программа — это формальная запись алгоритма (того, у чего нет концептуального определения)
Программирование — практическая актуализация понятия «программа»
Парадигма программирования — термин тертьего уровня из той же пирамидки
Что такое «парадигма программирования»?
Конкретные направления подходов, правил и дисциплины разработки часто образуют некоторую достаточно отдельные, не всегда хорошо сосуществующие системы.
По аналогии с научной парадигмой их называют «парадигмами»
Нечто вроде определения: Парадигма программирования: дисциплина построения и актуализации алгоритмически полных формализмов.
- Как минимум ещё три определения
- Совокупность идей и понятий, определяющих стиль написания компьютерных программ
- «Такой способ думать»
Формализация исполнителя, задания и аллегирования объектов, порядка и обусловливания действий и удобные для такого формализма практики
- ⇒ Если аллегирование и обусловливание в ЯП похожи, скорее всего, они реализуют одну и ту же парадигму
- ⇒ Большинство современных ЯП мультипарадигмальны
Конкретнее? А конкретика всегда разная!
- Где в «требованиях» циклы?
Нужна ли последовательность выполнения инструкций?
- Нужен ли инструмент моделирования/абстракции произвольных данных (спойлер: нет)
Многие вопросы подразумевают несколько вариантов ответа, различные для разных парадигм:
- Существуют ли объекты, когда действия не выполняются?
- «Вычислитель» — это конкретная ЭВМ или что-то совсем иное?
- При повторном использовании алгоритма выполняется тот же самый код или другой?
- …
О чём будет этот курс?
Нет никакого конечного списка парадигм, а тем более единого критерия, который бы позволил составить такой список
- Парадигмы могут пересекаться, быть реализованы частично и т. п.
- Устоявшиеся парадигмы живы потому, что эффективно решают некоторые классы задач
- Языки программирования, как правило, хорошо отвечают не более, чем одной парадигме
- хотя зачастую имеют инструментарий для другой
- ⇒ Будем коротко изучать наиболее характерные некоторые ЯП, и как на них думать
- В числе прочего — ООП как основу для парадигмального сдвига
- …
- Процедурное окостенение алгоритмического мышления как недостаток современной программистской культуры
Бонус: о чём этот курс не будет
- Языки программирования с интересным/эффективным «способом думать», принадлежащие классическим парадигмам
Например, APL и его наследники (скажем, J)
На самом деле J всё равно очень интересный, вот учебник, а вот тут с ним можно поиграть
- Интерпретаторы на основе командной строки / скриптинга (как было в курсе А. В. Столярова) — увы, претензия та же
Некоторые подходы, традиционно считающиеся парадигмами (например, событийно-ориентированное программирование), трудно отыскать в чистом виде
- (вселенная велика)…