В чем состоит особенность процедурно и проблемно ориентированных систем программирования ответ
В чем разница между процедурным программирование и объектно-ориентированным?
Процедурное программирование подразумевает возможность создания в
рамках программы локальных переменных, функций и процедур. Любая
программа оперирует данными и содержит код для обработки этих данных. В
языках, поддерживающих парадигму процедурного программирования,
приоритет остается за кодом для обработки данных.
Другими словами,
функциональность программы определяется в основном набором процедур и
функций для обработки данных. Сами данные при этом имеют второстепенное
значение. Одни и те же процедуры применяются к данным разного рода.
Хотя такой подход имеет право на существование и долгое время был самым
прогрессивным, с помощью процедурных языков программирования очень
большие проекты создавать сложно. Поэтому на замену процедурному
программированию пришло программирование объектно-ориентированное.
Основная идея, положенная в основу объектно-ориентированного
программирования, проста и элегантна и состоит в том, чтобы подчинить
код, используемый для обработки данных, этим самим данным. В
объектно-ориентированных языках данные играют решающую роль при
определении методов обработки. Здесь следует четко понимать, что
необходимость перехода к объектно-ориентированному программированию
связана в первую очередь с проблемой читабельности программного кода.
Если уметь хорошо структурировать код и ввести для этого общепринятый стандарт, то ПП во многом сможет заменить ООП и будет даже удобнее.
Что такое процедурное программирование?
Что такое процедурное программирование?
Процедурное программирование может быть первой парадигмой программирования, которую изучит новый разработчик. По сути, процедурный код — это тот, который непосредственно инструктирует устройство о том, как завершить задачу в логических шагах.
Эта парадигма использует линейный нисходящий подход и рассматривает данные и процедуры как два разных объекта. Основываясь на концепции вызова процедуры, процедурное программирование делит программу на процедуры, которые также известны как процедуры или функции, просто содержащие последовательность шагов, которые необходимо выполнить.
Проще говоря, процедурное программирование включает в себя запись списка инструкций, чтобы сообщить компьютеру, что он должен делать шаг за шагом, чтобы завершить задачу под рукой.
Ключевые особенности процедурного программирования
Ключевые особенности процедурного программирования приведены ниже:
Передача параметров: Передача параметров — это механизм, используемый для передачи параметров в функции, подпрограммы или процедуры. Передача параметров может быть выполнена через «передача по значению», «передача по ссылке», «передача по результату», «передача по значению-результату» и «передача по имени».
Преимущества и недостатки процедурного программирования
Процедурное программирование имеет свои плюсы и минусы, некоторые из которых упомянуты ниже.
Преимущества
Недостатки
Как мы уже упоминали, существуют разные типы парадигмы программирования, которые являются не чем иным, как стилем программирования. Важно понимать, что парадигма ориентирована не на конкретный язык, а на способ написания программы. Ниже приведено сравнение между процедурным программированием и объектно-ориентированным программированием.
Что такое объектно-ориентированное программирование (ООП)
ООП — это подход к программированию, который распознает жизнь в том виде, в каком мы ее знаем, как совокупность объектов, которые работают в тандеме друг с другом для решения конкретной проблемы под рукой. Главное, что нужно знать об ООП, — это инкапсуляция, то есть идея, что каждый объект, содержащий программу, самодостаточен, что означает, что все компоненты, составляющие объект, находятся внутри самого объекта. Теперь, поскольку каждый модуль в рамках этой парадигмы самодостаточен, объекты могут быть взяты из одной программы и использованы для решения другой имеющейся проблемы с небольшими изменениями или без изменений.
Преимущества
Недостатки
Процедурное программирование против объектно-ориентированного программирования: сравнение между собой
С другой стороны, процедурное программирование, в отличие от ООП, не фокусируется на шагах, которые будут выполняться для выполнения задачи, а не на взаимодействии между объектами. Задачи разбиты на подпрограммы, переменные и структуры данных. В любой момент времени эти процедуры могут быть вызваны при выполнении программы.
Процедурное программирование | Объектно-ориентированного программирования |
Использует неизменные данные | Использует изменяемые данные |
Следует декларативной модели программирования | Следует модели императивного программирования |
Расширяет поддержку параллельного программирования | Не подходит для параллельного программирования |
Порядок выполнения операторов не является основным направлением | Порядок выполнения операторов очень важен |
Управление потоком осуществляется с помощью вызовов функций | Управление потоком осуществляется через условные операторы и циклы |
Использует концепцию рекурсии для итерации коллективных данных | Использует концепцию цикла для итерации сбора данных |
Нет таких побочных эффектов его функций | Метод может иметь определенные побочные эффекты |
В процедурном программировании основное внимание уделяется тому, что вы делаете. | Основное внимание в объектно-ориентированном программировании уделяется теме «Как вы это делаете» |
Недостатки
Вывод
Как мы уже говорили в этой статье, процедурное программирование — это больше, чем вы делаете, а не то, как вы это делаете. Это стандартный подход, используемый во многих компьютерных языках, таких как C, Pascal и BASIC. Хотя идеальной парадигмы программирования не существует, важно понимать, что правильная парадигма всегда будет зависеть от типа используемого вами языка и программы, которую вы хотите создать. Рекомендуется, чтобы для достижения максимальных результатов и сильного портфеля, нужно было владеть всеми тремя основными парадигмами программирования. Лучший способ попытаться стать лучше в программировании — это, конечно пройти курсы программирования.
Большая Энциклопедия Нефти и Газа
Проблемно-ориентированные системы программирования наиболее полно учитывают специфику данного класса задач и наличие в них типовых схем обработки информации и вследствие этого оказываются более эффективными по сравнению с машинно-ориентированными и процедурно-ориентированными. Следует отметить, что само понятие эффективности системы программирования в последнее время существенно изменилось. С появлением ЭВМ третьего поколения фактор затрат машинного времени на решение задач приобретает се меньшее значение в сравнении С фактором затрат ручного труда на подготовку задач к решению, поэтому эффективнее считается та система программирования, которая позволяет максимально сократить затраты ручного труда при проектировании задач на ЭВМ при незначительном увеличении времени выполнения рабочей программы. [1]
Проблемно-ориентированные системы программирования являются аффективным средством разработки и отладки программ. Они описывают алгоритмы решения задач в общепринятых математических обозначениях или в символах, привычных для восприятия человеком. [3]
БАСТАЙ представляет собой проблемно-ориентированную систему программирования по организации и ведению банка данных, включая загрузку данных, их корректировку и реорганизацию. В системе имеются программные компоненты для поиска информации в банке данных при разработке программ пользователя. Являясь, по существу, универсальным генератором программ для создания банков данных, БАСТАЙ вместе с тем ограничена по своим возможностям: массивы банка данных могут включать основные и наиболее взаимосвязанные данные фонда НСИ ( сведения о составе изделия, технологических маршрутов, оборудования, материалах и др.), но не в состоянии одновременно содержать информацию всех нормативно-справочных документов ( НСД), которые подвергаются автоматизированной обработке при создании АСУП. Кроме того, в процессе эксплуатации АСУП иногда требуется создать отдельные массивы для корректировки л разработки новых задач. [4]
В качестве примера проблемно-ориентированной системы программирования по организации и ведению банка данных может быть представлена система БАСТАЙ. [5]
Формирование больших интегрированных блоков информации на МЛ предполагает предварительное разбиение последних на рабочие массивы для решения отдельных задач. В некоторых случаях компромиссное решение находят в создании специальных проблемно-ориентированных систем программирования для обработки интегрированных массивов при решении задач АСУП. [10]
Рассмотренные примеры не исчерпывают всего многообразия систем программирования, так как ежегодно в этой области появляются новые системы, пополняющие арсенал робототехники. Следует отметить, однако, что, изучив основные операторы, например языка VAL, можно представить себе уровень существующих проблемно-ориентированных систем программирования и оценить возможность адаптивного робота, оснащенного таким программным обеспечением. [12]
Рассмотренные примеры не исчерпывают всего многообразия систем программирования, так как ежегодно в этой области появляются новые системы, пополняющие арсенал робототехники. Следует отметить, однако, что, изучив основные операторы, например языка VAL, можно представить себе уровень существующих проблемно-ориентированных систем программирования и оценить возможность адаптивного робота, оснащенного таким программным обеспечением. [14]
«Забытые» парадигмы программирования
Получилось так, что те парадигмы, которые раньше потом и кровью пробивались в свет через орды приверженцев традиционных методов постепенно забываются. Эти парадигмы возникли на заре программирования и то, почему они возникали, какие преимущества они давали и почему используются до сих пор полезно знать любому разработчику.
Ладно. Введение это очень весело, но вы его все равно не читаете, так что кому интересно — добро пожаловать под кат!
Императивное программирование
Исторически сложилось так, что подавляющее большинство вычислительной техники, которую мы программируем имеет состояние и программируется инструкциями, поэтому первые языки программирования в основном были чисто императивными, т.е. не поддерживали никаких парадигм кроме императивной.
Это были машинные коды, языки ассемблера и ранние высокоуровневые языки, вроде Fortran.
Ключевые моменты:
В этой парадигме вычисления описываются в виде инструкций, шаг за шагом изменяющих состояние программы.
В низкоуровневых языках (таких как язык ассемблера) состоянием могут быть память, регистры и флаги, а инструкциями — те команды, что поддерживает целевой процессор.
В более высокоуровневых (таких как Си) состояние — это только память, инструкции могут быть сложнее и вызывать выделение и освобождение памяти в процессе своей работы.
В совсем высокоуровневых (таких как Python, если на нем программировать императивно) состояние ограничивается лишь переменными, а команды могут представлять собой комплексные операции, которые на ассемблере занимали бы сотни строк.
Основные понятия:
Порожденные понятия:
— Присваивание
— Переход
— Память
— Указатель
Языки поддерживающие данную парадигму:
Как основную:
— Языки ассемблера
— Fortran
— Algol
— Cobol
— Pascal
— C
— C++
— Ada
Как вспомогательную:
— Python
— Ruby
— Java
— C#
— PHP
— Haskell (через монады)
Стоит заметить, что большая часть современных языков в той или иной степени поддерживает императивное программирование. Даже на чистом функциональном языке Haskell можно писать императивно.
Структурное программирование
Структурное программирование — парадигма программирования (также часто встречающееся определение — методология разработки), которая была первым большим шагом в развитии программирования.
Основоположниками структурного программирования были такие знаменитые люди как Э. Дейкстра и Н. Вирт.
Языками-первопроходцами в этой парадигме были Fortran, Algol и B, позже их приемниками стали Pascal и C.
Ключевые моменты:
Эта парадигма вводит новые понятия, объединяющие часто используемые шаблоны написания императивного кода.
В структурном программировании мы по прежнему оперируем состоянием и инструкциями, однако вводится понятие составной инструкции (блока), инструкций ветвления и цикла.
Благодаря этим простым изменениям возможно отказаться от оператора goto в большинстве случаев, что упрощает код.
Иногда goto все-же делает код читабельнее, благодаря чему он до сих пор широко используется, несмотря на все заявления его противников.
Основные понятия:
— Блок
— Цикл
— Ветвление
Языки поддерживающие данную парадигму:
Как основную:
Как вспомогательную:
— C#
— Java
— Python
— Ruby
— JavaScript
Поддерживают частично:
— Некоторые макроассемблеры (через макросы)
Опять-же большая часть современных языков поддерживают структурную парадигму.
Процедурное программирование
Опять-же возрастающая сложность программного обеспечения заставила программистов искать другие способы описывать вычисления.
Собственно еще раз были введены дополнительные понятия, которые позволили по-новому взглянуть на программирование.
Этим понятием на этот раз была процедура.
В результате возникла новая методология написания программ, которая приветствуется и по сей день — исходная задача разбивается на меньшие (с помощью процедур) и это происходит до тех пор, пока решение всех конкретных процедур не окажется тривиальным.
Ключевые моменты:
Процедура — самостоятельный участок кода, который можно выполнить как одну инструкцию.
В современном программировании процедура может иметь несколько точек выхода (return в C-подобных языках), несколько точек входа (с помощью yield в Python или статических локальных переменных в C++), иметь аргументы, возвращать значение как результат своего выполнения, быть перегруженной по количеству или типу параметров и много чего еще.
Основные понятия:
Порожденные понятия:
— Вызов
— Аргументы
— Возврат
— Рекурсия
— Перегрузка
Языки поддерживающие данную парадигму:
Как основную:
— C
— C++
— Pascal
— Object Pascal
Как вспомогательную:
— C#
— Java
— Ruby
— Python
— JavaScript
Поддерживают частично:
— Ранний Basic
Стоит отметить, что несколько точек входа из всех этих языков поддерживаются только в Python.
Модульное программирование
Который раз увеличивающаяся сложность программ заставила разработчиков разделять свой код. На этот раз процедур было недостаточно и в этот раз было введено новое понятие — модуль.
Забегая вперед скажу, что модули тоже оказались неспособны сдержать с невероятной скоростью растущую сложность ПО и в последствии появились пакеты (это тоже модульное программирование), классы (это уже ООП), шаблоны (обобщенное программирование).
Программа описанная в стиле модульного программирования — это набор модулей. Что внутри, классы, императивный код или чистые функции — не важно.
Благодаря модулям впервые в программировании появилась серьезная инкапсуляция — возможно использовать какие-либо сущности внутри модуля, но не показывать их внешнему миру.
Ключевые моменты:
Модуль — это отдельная именованная сущность программы, которая объединяет в себе другие программные единицы, близкие по функциональности.
Например файл List.mod включающий в себя класс List
и функции для работы с ним — модуль.
Папка Geometry, содержащая модули Shape, Rectangle и Triangle — тоже модуль, хоть и некоторые языки разделяют понятие модуля и пакета (в таких языках пакет — набор модулей и/или набор других пакетов).
Модули можно импортировать (подключать), для того, чтобы использовать объявленные в них сущности.
Основные понятия:
Порожденные понятия:
Языки поддерживающие данную парадигму:
Как основную:
— Haskell
— Pascal
— Python
Как вспомогательную:
— Java
— C#
— ActionScript 3
Поддерживают частично:
— C/C++
В некоторых языках для модулей введены отдельные абстракции, в других же для реализации модулей можно использовать заголовочные файлы (в C/C++), пространства имен, статические классы и/или динамически подключаемые библиотеки.
Вместо заключения
В данной статье я не описал популярные сейчас объектно-ориентированное, обобщенное и функциональное программирование. Просто потому, что у меня есть свое, довольно радикальное мнение на этот счет и я не хотел разводить холивар. По крайней мере сейчас. Если тема окажется полезной для сообщества я планирую написать несколько статей, изложив основы каждой из этих парадигм подробно.
Также я ничего не написал про экзотические парадигмы, вроде автоматного, аппликативного, аспект/агент/компонент-ориентированного программирования. Я не хотел делать статью сильно большой и опять-же если тема будет востребована, я напишу и об этих парадигмах, возможно более подробно и с примерами кода.
В чем суть процедурного программирования?
Добрый день, года 3 я пишу только в ООП стиле, очень редко приходится что-то накидать в процедурном стиле, что-то маленькое и по быстрому
Не понимаю, в чем плюсы и как вообще можно сравнивать процедурный стиль с ООП
Простой 3 комментария
alex4answ, процедурный стиль использует только понятия модель памяти, типы, инструкции, программа и подпрограмма.
Вот и всё. Никаких составных типов. Концепция «состояние» в коде никак не выражается. Держите её если хотите в голове либо в комментариях.
Никаких сущностей в коде. Держите из в голове или в комментариях.
Нет понятия функции. Функция это слишком сложно в рамках процедурного программирования. Это какие-то особые требования к подпрограмме должны быть, тем более требуется вводить понятие аргументов и параметров функции, что требует какой-то сложной модели памяти с понятиями статический, константный, передача по значению, передача по ссылке и т.д.
Но это всё уже вводится в структурном программировании.
Да, понятия область видимости нет, придется его выражать в коде таким вот образом самостоятельно.
Ну, и поскольку ОС не даст лезть за пределы одного процесса, подпрограмму придется положить в сорцы выше, чем ваш код.
А максимум абстрагирования, которое вводит процедурное программирование, это символьное произвольное именование адреса в памяти. Да и вместо типов, скорее, используется смещение байтов для коллекции, которым просто даны имена.
Дело в том, что о процедурной парадигме можно говорить только ретроспективно. В основном, процедурная парадигма это классический ассемблер.
IDE может в качестве статического анализа помочь решать многие вопросы, но проще один раз сделать умный компилятор и перейти к языку, который позволяет абстрагировать. Поначалу было не совсем понятно, какой набор плюшек должен быть вшит в компилятор. Но стечением времени люди родили язык Си.
Ретроспективно, для процедурной парадигмы можно определить следующую область применения: любые математические задачи.
А вот в языке с полной поддержкой процедурной парадигмы можно делать такие подпрограммы, которые косплеят функции, но возвращают несколько «аргументов», причем пишут прямо в память. Да и в принципе, в процедурной парадигме можно делать свой ABI, нет никаких стандартов, нет правил, ничто не истинно и всё дозволено.