В статье рассказывается:
- Императивная парадигма программирования
- Принципы императивного программирования
- Сравнение императивного и декларативного программирования
- Языки императивного программирования
- Виды императивного программирования
- Парадигмы императивного стиля программирования
-
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.Бесплатно от Geekbrains
Императивное программирование – стиль написания кода, главной концепцией которого является создание инструкций для выполнения машинами. Данной парадигме присуще использование низкоуровневых языков, позже к ним подключили C++, Java. Такой код не требует компиляции и понимается машинами напрямую.
Вместе с усовершенствованием средств и подходов программирования предпочтительные парадигмы также менялись. На смену императивному стилю пришел декларативный (по-другому – функциональный). О том, что собой представляют эти парадигмы, чем отличаются, какие языки используют, вы узнаете из нашего материала.
Императивная парадигма программирования
Парадигма представляет собой подход к формированию исходного кода компьютерной программы. На данный момент есть несколько вариантов.
Большая часть вычислительных устройств имеют состояния и программируются с использованием инструкций. По этой причине изначальные языки программирования являлись императивными, то есть подразумевали поддержку лишь этой парадигмы.
Это более простой, т. е. понятный и логичный подход, когда задаётся последовательность действий (команд, инструкций), необходимых для получения результата – изменения состояния (информации, данных, памяти) программы с помощью переменных, операторов присваивания и составных выражений. Здесь имели место машинные коды, языки ассемблера и ранние языки высокого уровня, по типу Fortran, сейчас императивная парадигма – база C, C++, Java.
Особенности:
- Данная парадигма предполагает описания вычислений в форме инструкций, которые постепенно меняют состояние программы.
- В языках низкого уровня, например в ассемблерах, состояниями могут являться память, регистры и флаги. Инструкциями же выступают команды, которые поддерживаются целевым процессором.
- В языках более высокого уровня, например в Си, состоянием является исключительно память. Инструкции в таком случае могут быть более сложными, а также приводить к выделению и высвобождению памяти по мере своего функционирования.
Основные понятия:
- Инструкция.
- Состояние.
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Скачивайте и используйте уже сегодня:
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Порожденные понятия:
- Присваивание.
- Переход.
- Память.
- Указатель.
Почти все современные основные языки сочетают в себе элементы и декларативного, и функционального программирования. То есть они при необходимости могут поддерживать императивную парадигму. Огромное влияние оказывает такое программирование на JavaScript, Java, C++, C# и т. д.
Принципы императивного программирования
Описание расчета в императивном методе происходит на основе последовательности команд. В этом случае программирование предопределяет точную процедуру (алгоритм) решения задачи. При этом законченный компьютерный код имеет вид определенного количества переменных, которые, исходя из оценки условий, меняются в своем состоянии при помощи команд.
Императивный подход к программированию может быть понятен и обычным людям. Примером программы, написанной по такому образцу, для всех может послужить любой рецепт (последовательность работы с объектами-продуктами: купить, помыть, нарезать и т. д.) приготовления блюда. После того, как он найден или создан, повар (или аппаратное обеспечение – ассемблер как машинно-ориентированный язык низкого уровня) исполняет последовательную цепочку действий (команд). Результат – готовое блюдо (программное решение поставленной задачи).
Читайте также!
Лишь определенные команды представляют собой инструкции машинного кода, которые выполняются устройствами. При этом текущее состояние отражает содержимое памяти. В более высокоуровневых императивных языках следом добавляются переменные и усложненные команды (выражения и функции), но они также наследуют в своей структуре императивную парадигму.
Сравнение императивного и декларативного программирования
Декларативное программирование представляет собой парадигму, в системе которой нужный результат описывается без учета детализированного алгоритма его получения. Примерами можно считать современные HTML и SQL.
Скачать файлВ процессе создания HTML программист использует теги, которые описывают конкретную веб-страницу в браузере, а не способ отражения наименования статьи на экране, а также оглавления и самого текста. В SQL при необходимости определения численности сотрудников с фамилией «Иванов», нужно написать SELECT count(*) FROM employee WHERE last_name = ‘Иванов’;. Здесь нет информации касательно конкретного файла или области памяти, в которых имеются данные о сотрудниках, каким образом отобрать именно Ивановых, и необходимо ли это для расчета их численности. Декларативные языки подразделяются на функциональные и логические.
Разберем еще один пример, на основе которого будут понятны отличия императивного и декларативного методов программирования. Предположим, нам необходимо приготовить обед.
В случае использования императивной парадигмы это может выглядеть следующим образом (несколько уточним представленный выше пример с рецептом):
- приобрести рыбу, овощи, приправы;
- нарезать продукты, посыпать приправы;
- разогреть духовку и т. п.
На первый взгляд отличия видны вполне отчетливо. Но преимущество императивного программирования заключается в том, что этот язык не затрудняет обобщение и автоматизацию конкретных задач. Имеется возможность привести в действие некий «слой» кода, библиотеки. Этот слой будет реализовывать отдельные этапы алгоритма: как в нашем кулинарном примере – находить по рецепту требующиеся продукты, заказывать их доставку, использовать духовку и пр. Таким образом, программный код императивного языка программирования, обладающий такими библиотеками, не будет иметь столь весомые отличия от декларативного метода.
В действительности в процессе создания кода и выбора подхода, программист основывается не только на возможностях и границах языка, но и на степени удобства применения определенной парадигмы в имеющихся условиях.
на обучение «Программист Java» до 01 декабря
Языки императивного программирования
Изначальными императивными языками программирования являлись только машинные языки отдельных устройств. Этими языками были описаны простейшие инструкции, возможности которых распространялись лишь на реализацию аппаратного обеспечения. Сложные программы создавались в этом случае с большим трудом.
Первый язык, в котором не было границ машинного кода для конструирования сложных программ, был FORTRAN. Его создал Джон Бэкус в IBM в 1954 году. FORTRAN подарил разработчикам новые возможности (именование переменных, составные выражения, подпрограммы и т. д.), которые и сейчас являются неотъемлемой частью императивных языков.
Следом появились новые формальные правила для создания программ более высокого уровня. К концу 50–60-х годов ХХ в. формируется язык АЛГОЛ, сделавший более легким использование математических алгоритмов. В то время языки COBOL (1960) и BASIC (1964) представляли собой способы адаптации синтаксиса программирования под синтаксис естественного языка (английского). В 70-х годах прошлого века специалисты Bell Labs создали: Никлаус Вирт – Паскаль, а Деннис Ритчи (работают в) – язык C. После этого Вирт приступил к работе над языками Модула-2 и Оберон. В конце 1960-х был сформирован первый объектный язык Simula.
Для решения задач Министерства обороны США в 1978 году Джин Ичбиа совместно с командой Honeywell начали формировать язык Ada. В 1983 году был выпущен документ, который отражал требования языка, а в 1995 и 2006 гг. он видоизменялся.
В 1980-х годах заинтересованность в объектно-ориентированном программировании стала возрастать. Создаваемые языки в то время были императивными, но имели поддержку объектов, можно было наблюдать весомое количество таких языков. В 1980 году Palo Alto Research Center Xerox опубликовала Smalltalk-80 языка, который изначально задумывался Аланом Кеем в 1969 г.
К концу 1990-х было сформировано множество императивных языков, которые базировались на фундаменте объектно-ориентированного программирования. Широко использовались Perl (Ларри Уолл, 1987), Python (Гвидо ван Россум, 1990), PHP (Расмус Лердорф, 1994), Java (Sun Microsystems, 1994) и C # (Microsoft, 2000).
3 вида императивного программирования
Императивное программирование с ХХI веке подразделяется на несколько основных групп:
- Наивная парадигма. В некоторых случаях воспринимается как отдельный тип или даже вовсе не упоминается как подход к программированию. Таким языкам присуща хаотичность, отсутствие систематизированного синтаксиса и семантики. Фактически можно провести параллель с похожими бесструктурными языками. К примеру, первые версии BASIC не обладали развитым механизмом организации подпрограмм, поэтому его принято относить к этой парадигме и называть одним из операциональных языков.
- Неструктурированная парадигма. Схожа с ассемблером. Такие программы имеют вид линейных цепочек команд. Переходы осуществляются за счет команды по типу «перейти к…» т. е. «перейти к (строке)». Между тем в первых языках этой группы каждая строка программы была наделена своим номером, а переходы можно было совершать исключительно за счет выбора нужного из всех. Это было довольно неудобно и требовало лишнего времени. Позднее стали формироваться языки, имеющие специфичные элементы — метки. Они представляли собой текстовые описания мест, в которые должна переходить программа. Типичными представителями были, к примеру, изначальные версии FORTRAN и COBOL.
- Структурная парадигма. Вследствие трудоемкости действия команды «перейти к…» был сформирован метод структурного императивного программирования и разработана соответствующая парадигма. Её главным плюсом было то, что она осуществляла замену оператора перехода с условными петлями («повторить до тех пор, пока условие истинно») и прочих упорядоченных по своей структуре инструкций, которые находятся в оболочке друг друга. Яркими примерами являются: C, Pascal и Ada.
Парадигмы императивного стиля программирования
Стилистика программирования эволюционировала довольно много лет, в течение которых образовались практики и методы, сформировавшиеся в отдельные парадигмы, активно функционирующие сегодня:
Процедурное программирование
Функция onlyOdd, похожа на одну схему процедурного программирования. Данная парадигма включает в себя последовательные команды, образующие подпрограммы. Связь между последними осуществляется за счет общей памяти. Из подпрограмм образовалось понятие модулей, но по своей сути процедурное программирование неудобно в плане повторного использования кода.
Объектно-ориентированное программирование
Наиболее распространенная сейчас парадигма императивного подхода — объектно-ориентированное программирование (ООП).
ООП представляет собой парадигму, в которой любая сущность представляется в виде объекта. Каждый из них — экземпляр определенного класса, некой абстрактной сущности, в которой описано поведение.
ООП включает в себя несколько основных характеристик:
- Абстракция — выделение таких атрибутивных качеств объекта, которые могут в точности описать его поведение, но не включают в себя детали.
- Инкапсуляция — размещение данных в рамках того объекта, который их применяет.
- Полиморфизм — возможность взаимодействовать с различными видами объектов или данных.
- Наследование — свойство объекта, благодаря которому он может наследовать различные параметры «родителей». Важно понимать, что такое преемство имеет ряд неразрешимых трудностей, вследствие наличия которых разработчики чаще используют наследование композиции.
Основное преимущество ООП — удобное моделирование систем. В этом случае все компоненты системы представляются в форме объектов, взаимосвязь между которыми легче установить и закрепить. Кроме того, данный подход хорошо изучен, на эту тему имеется множество литературы и различных советов.
Как уже ранее упоминалось, важнейшая характеристика ООП – инкапсуляция, из-за которой могут формироваться ограничения доступа к данным. Если необходимо поделиться данными, то можно столкнуться с ситуацией, когда допуск к ним хотят получить сразу несколько объектов. С прочтением затруднений обычно не возникает, но если речь идет об изменении данных определенными объектами, то сразу появляется проблема в виде конкурентных вычислений.
Читайте также!
Вообразим, будто Google Docs сконструированы без учета этого нюанса. Тогда в ситуации, где два пользователя единовременно подвергнут изменениям один и тот же документ, поправки одного могут удалить варианты, внесенные другим.
Следующий недостаток — наследование. К сожалению, оно не во всех случаях демонстрирует взаимоотношения компонентов. К примеру, наследование светильника с таймером должно происходить от светильника или от таймера? Приемлемый вариант ответа – и от того, и от другого (многовариантное наследование). Оптимальный ответ – наследование лучше заменить композицией.
Помните, что программирование не обязано быть либо императивным, либо декларативным. Почти все современные сложные компьютерные программы будут совмещать в себе оба типа. Следовательно, навык использования декларативного подхода безусловно полезен, но вам все же придется освоить и императивный метод программирования.