Парадигмы программирования
| English | Русский |
|---|---|
| paradigm/ˈpærədaɪm/ | парадигма |
| low-level/ləʊ ˈlevl/ | низкоуровневая |
| imperative/ɪmˈperətɪv/ | императивная |
| declarative/dɪˈklærətɪv/ | декларативная |
| functional/ˈfʌŋkʃənl/ | функциональным |
| pure functions/pjʊə ˈfʌŋkʃnz/ | чистые функции |
| logic/ˈlɒdʒɪk/ | логика |
Та же программа, написанная четырьмя способами
- Запрос всех клиентов в Великобритании: программист на C пишет цикл по массиву. Программист на Haskell пишет фильтр. Программист на Prolog формулирует правило и задает вопрос. Пользователь SQL пишет
SELECT * FROM Customer WHERE Country = 'UK'. - Только первое говорит как это сделать. Остальные говорят что нужно получить, оставляя «как» машине, которая может упорядочить работу произвольно, использовать индекс или запустить её на восьми ядрах.
- Ни один из подходов не лучше в целом. Разница заключается в том, какие решения язык берет на себя, и именно это является сутью парадигмы.
- Этот урок о парадигмах, названных в учебной программе: низкоуровневая, императивная и декларативная.
Низкоуровневое программирование
- Низкоуровневое программирование работает близко к аппаратному обеспечению, на машинном коде или языке ассемблера, с прямым доступом к регистрам, адресам памяти и отдельным инструкциям.
- Преимущества: максимальный контроль и скорость, а также минимально возможный размер кода, что важно при наличии лишь килобайтов памяти.
- Недостатки: код зависит от архитектуры, поэтому его необходимо переписывать для другого процессора; к тому же он пишется медленно и трудно поддерживается.
- Используется там, где требуется точное управление аппаратным обеспечением: драйверы устройств, прошивка, встраиваемые контроллеры и внутренний цикл систем реального времени.
- Отработайте непосредственную, косвенную, индексную и относительную адресацию в уроке по языку ассемблера. Его пошаговый разбор показывает, почему один и тот же операнд может давать разные результаты.
Что верно для низкоуровневого программирования? Выберите все подходящие варианты.
Контроль достигается ценой усилий: ассемблер сложно писать и трудно поддерживать, поэтому он используется преимущественно для драйверов и прошивок.
Императивное программирование
- Императивное программирование, также называемое процедурным, представляет собой последовательность команд, изменяющих состояние программы: присваивания, условные операторы, циклы и вызовы процедур.
- Программист указывает как должен быть вычислен результат, шаг за шагом. Переменные, хранящие состояние, являются центральным элементом.
- Это стиль Python, C, Java и псевдокода, и именно так учит почти каждый.

Одна команда за другой, каждая из которых изменяет хранимые данные
Императивное (процедурное) программирование основано на:
Императивный код дает пошаговые команды (присваивания, циклы, вызовы), которые изменяют состояние.
Декларативное программирование
- Декларативное программирование определяет что нужно вычислить, а не как. Среда выполнения сама определяет шаги.
- Функциональное программирование использует чистые функции, не имеющие побочных эффектов: одинаковый вход всегда дает одинаковый выход, и ничего вне функции не меняется. Примеры: Haskell и Lisp.
- Логическое программирование формулирует факты и правила, а движок отвечает на запросы путем логического вывода. Пример: Prolog.
- SQL — декларативный язык, с которым знаком почти каждый: запрос указывает, какие строки нужны, а база данных решает, как их найти.
Лабораторная работа по программированию
Сопоставьте примеры с показанной ими программной идеей.
Декларативное программирование означает, что вы указываете:
Декларативный код (функциональный, логический, SQL) описывает цель; среда выполнения определяет шаги.
Чистая функция (функциональное программирование):
Чистота означает отсутствие побочных эффектов и детерминированный результат, что делает функциональный код простым для анализа.
Декларативные парадигмы (функциональная, логическая, SQL) указывают ЧТО вычислить и оставляют ВЫ как выбрать среду выполнения, тогда как императивный код расписывает каждый шаг.
SQL-запрос говорит, какие строки вам нужны, а не как сканировать таблицы — это противоположность пошаговому императивному коду.
Чистая функция всегда дает одинаковый выходной результат для одного и того же входного результата и не имеет ____.
Именно это позволяет тестировать её изолированно, безопасно запускать параллельно и кэшировать результат.
Разобранный пример: определите парадигму
FOR i ← 1 TO n : total ← total + A[i] : NEXT i— императивное: последовательность команд, изменяющих состояние, хранящееся вtotal.SELECT Name FROM Customer WHERE Country = 'UK'— декларативное: оно указывает, какие строки нужны, а не как их искать.LDD 200 : ADD 201 : STO 202— низкоуровневое: инструкции ассемблера, обращающиеся напрямую к ячейкам памяти.parent(X, Y) :- father(X, Y).— декларативное, конкретно логическое программирование: правило, из которого движок выводит ответы.- Назовите парадигму и признак кода, который это демонстрирует.
Сопоставьте каждый фрагмент с его парадигмой.
Команды, изменяющие состояние, заявление о том, что требуется, инструкции, обращающиеся к памяти, и правило для вывода.
Сравнение парадигм
| Парадигма | Указывает | Сильные стороны | Типичное применение |
|---|---|---|---|
| низкоуровневая | точные инструкции | контроль, скорость, компактность | драйверы, прошивка |
| императивная | как, шаг за шагом | прямое понимание, привычность | общее программирование |
| декларативная | что нужно получить | лаконичность, оптимизация средой выполнения | запросы, правила, преобразование данных |
- Современные языки сочетают их. Python императивен, но имеет функциональные возможности; SQL находится внутри программ, написанных императивно. Парадигма — это стиль, а не стена.
Сопоставьте каждую парадигму с её основной идеей.
Императивная говорит КАК пошагово; ОО моделирует объекты; функциональная использует чистые функции; декларативная формулирует цель.
В чем заключается фундаментальная разница между императивным и декларативным программированием?
Поскольку декларативная версия не фиксирует ВЫ, среда выполнения может изменить порядок работы, использовать индекс или распараллелить её.
Разобранный пример: почему важны побочные эффекты
- Чистая функция не имеет побочных эффектов. Объясните одно преимущество.
- Поскольку одинаковый вход всегда дает одинаковый выход и ничего вне функции не меняется, чистую функцию можно протестировать изолированно: без подготовки и скрытого состояния, которое нужно настроить.
- Её также можно безопасно запускать параллельно, так как два вызова не будут мешать друг другу, а результат можно кэшировать.
- Контраст: императивная процедура, обновляющая глобальную переменную, ведет себя по-разному в зависимости от того, что выполнено ранее, что делает такие ошибки трудными для обнаружения.
Потерянные баллы
- Императивное программирование говорит как; декларативное говорит что. Это различие является ответом на большинство вопросов здесь.
- Недостаток низкоуровневого программирования в том, что оно зависит от архитектуры и трудно поддерживается, а не в том, что оно «старое».
- Чистая функция не имеет побочных эффектов и дает одинаковый выход для одинакового входа. Нужны обе половины определения.
- SQL является декларативным. Он является примером, который чаще всего встречается на экзаменах, поэтому его нужно уметь распознавать.
Вы поняли
- Парадигма — это стиль структурирования кода, а современные языки сочетают несколько парадигм.
- Низкоуровневое: машинный код или ассемблер, прямой доступ к аппаратному обеспечению, максимальный контроль и скорость, но зависимость от архитектуры и сложность поддержки
- Императивное: последовательность команд, изменяющих состояние, указывающая как; стиль Python, C и псевдокода
- Декларативное: указывает что нужно получить, оставляя «как» среде выполнения, как в функциональном программировании с чистыми функциями, логическом программировании с фактами и правилами, а также в SQL