Рубріки: Теория

Парадигмы программирования: простое объяснение

Семен Гринштейн

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


Содержание:
1. Что такое парадигма программирования?
2. Для чего они нужны?
3. Императивная парадигма программирования
4. Процедурное программирование
5. Объектно-ориентированное программирование
6. Декларативная парадигма программирования
7. Функциональное программирование
8. Логическое программирование
9. Метапрограммирование
10. Обобщенное программирование
Заключение

1. Что такое парадигма программирования?

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

Например:

  1. объектно-ориентированное программирование опирается на классы, объекты и взаимодействие между ними;
  2. в функциональном программировании все держится на использовании чистых функций;
  3. обобщенное программирование ставит во главу угла алгоритмы и контейнеры, которые принимают типы в качестве параметров;
  4. и так далее.

Подробнее про разные парадигмы мы узнаем далее в соответствующих разделах.

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

Все дело в том, что не существует универсальной парадигмы. Для каждой задачи можно найти ту, которая подходит лучше. Но для этого необязательно менять язык программирования (если он является мультипарадигменным). Тогда достаточно лишь научиться переключению между парадигмами — то есть, освоить разные стили программирования, оставаясь в пределах уже знакомой среды программирования.

2. Для чего они нужны?

Выше мы уже немного касались темы выбора средств для решения задач.

С годами разработчики программного обеспечения создали эффективные подходы для решения задач на все случаи жизни. Обобщив знания, прошедшие проверку на практике, они оформили их в парадигмы программирования. Теперь достаточно классифицировать задачу, чтобы узнать, какая парадигма (и соответственно — язык программирования) лучше всего подходит для ее решения.

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

3. Императивная парадигма программирования

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

Разработчики начали осознанно использовать императивную парадигму примерно с середины XX века. На тот момент уже были в ходу низкоуровневые языки программирования, в которых эта парадигма была реализована интуитивно. Благодаря такой интуитивной простоте императивная парадигма и стала популярной. Дело в том, что на низком уровне (то есть на уровне машинных команд) логика выполнения программ выглядит ровно так, как описано выше: машины просто физически не могли по-другому выполнять инструкции — в силу своей архитектуры.

Тогда же стали появляться и первые высокоуровневые языки, построенные на этой парадигме. Это позволило парадигме стать де факто стандартом коммерческой разработки ПО на многие годы.

Языки

Многие разработчики до сих пор используют низкоуровневые языки программирования (чаще всего, речь идет о разных видах языка ассемблера). Императивную парадигму также гордо несут на своих плечах топовые на сегодня высокоуровневые языки — С/С++, C#, Java, Python, JavaScript. Еще она реализована, например, в не очень топовых языках PHP и Ruby. Но напомню: это не значит, что они не могут поддерживать другие парадигмы.

Преимущества:

  • Изучать императивный подход к разработке программ достаточно легко. Это особенно важно, когда человек впервые сталкивается с программированием.
  • Можно писать хорошо читаемый код и отлаживать его, работая над небольшими проектами. В таком коде будет достаточно просто разобраться даже специалисту, который не работал над этим проектом.
  • Как сказано выше, императивная парадигма лежит в основе топовых языков программирования. Так что стоит признать, что она имеет коммерческий успех.

Недостатки:

  • В противовес пункту 2 из предыдущего раздела нужно отметить, что по мере роста проекта код становится тяжело поддерживать и вообще возникают проблемы с масштабированием приложений.
  • Так называемые побочные эффекты способны менять состояние переменных. Например, при вызове функции с одинаковыми параметрами на разных этапах выполнения алгоритма можем получить разные результаты. Это как раз происходит из-за побочных эффектов. Зачастую разработчикам очень трудно предусмотреть, где и когда возникнет такая ситуация. Поэтому нужно потратить достаточно много времени, чтобы взять побочные эффекты под контроль.
  • В больших проектах из-за ограничений архитектуры разработчики вынуждены писать избыточный код.

4. Процедурное программирование

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

Безусловно, эта парадигма унаследовала некоторые недостатки императивной парадигмы, но благодаря оформлению кода в процедуры становится проще:

  1. повторно использовать код;
  2. понимать логику работы программы;
  3. масштабировать проект.

У современных разработчиков такие громкие заявления, возможно, вызовут усмешку, но для инженеров середины XX века это был важный шаг вперед.

sum (a,b) {
return a + b;    // процедура возвращает сумму двух чисел
}

multiply (a,b) {
    return a * b;    // процедура возвращает произведение двух чисел
}

// Основная программа
number1 = 2;
number2 = 4;

// по очереди вызываем процедуры и записываем результат в переменную result
result  = sum (number1, number2);
result  = multiply (number1, number2);

Пример в процедурном стиле на псевдокоде

Языки

Так или иначе, процедуры реализованы в тех современных языках, которые перечислены выше, и в большинстве других. Но изначально это было прерогативой таких старых языков, как Cobol, Algol, Perl, Fortran, Pascal, Basic и C.

5. Объектно-ориентированное программирование

Объектно-ориентированное программирование (ООП) по-прежнему имеет отношение к императивной парадигме, но еще дальше продвинулось в познании окружающего мира, разделив его на объекты и классы. В том числе были переосмыслены и процедуры. Так, к 1967 году были сформулированы основные идеи ООП:

  • объект — это элементарная сущность, имеющая свойства (атрибуты) и поведение (методы, они же — бывшие процедуры);
  • класс — это тип, шаблон, определяющий структуру, набор атрибутов и методов для объектов одного типа — то есть, экземпляров класса;
  • класс может наследовать атрибуты и методы своего родительского класса и иметь при этом свои собственные. Так формируется иерархия классов, она позволяет моделировать предметную область на разных уровнях абстракции и детализации, решая задачу по частям;
  • полиморфизм — это механизм, позволяющий использовать одну и ту же функцию (метод) для данных разных типов (классов).
  • инкапсуляция — это механизм, позволяющий скрывать некоторые детали реализации внутри класса. Часто сторонним сущностям, которые работают с объектом ни к чему знать нюансы реализации его класса и иметь доступ к каким-то его атрибутам и методам. Поэтому часто разработчик создает для класса интерфейс, которые отвечает за взаимодействие с внешними сущностями, открывая специально выбранные для этого атрибуты и методы.
class Calculator {
var lastOperation;    // атрибут класса

// процедура из прошлого примера превратилась в метод 
sum (a,b) {
    this.lastOperation = ‘sum’;
return a + b;
}

// процедура из прошлого примера превратилась в метод 
multiply (a,b) {
this.lastOperation = ‘multiply’;
    return a * b;
}
}

// Основная программа
number1 = 2;
number2 = 4;

calc = new Calculator ();    // создаем объект класса Calculator 

// вызываем методы для объекта calc
result = calc.sum (number1, number2);    
result = calc.multiply (number1, number2);

Пример ООП на псевдокоде

Языки

Парадигма ООП реализована как в современных, так и в старых языках. Только в итоге у них получилось немного разное ООП или недо-ООП:

  1. Например, Perl и Fortran — это изначально процедурные языки. Их разработчики просто добавили туда некоторые элементы ООП.
  2. Еще одна пара старых языков, Modula-2 и Oberon, решила обойтись без синтаксических конструкций для методов класса.
  3. Разработчики предложили вручную имитировать их с помощью обычных процедур.
  4. В Java, C++ и Python реализовано ООП, но в сочетании с процедурным подходом.
  5. И наконец Smalltalk, C# и Ruby — так называемые чистые объектно-ориентированные языки.

6. Декларативная парадигма программирования

Декларативная парадигма, в отличие от императивной, описывает не последовательность инструкций, а проблему (задачу) и модель (набор выражений) для ее решения. То есть любой допустимый набор входных данных будет обработан в соответствии с моделью.

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

Сможет ли программа быстро найти решение задачи (если оно в принципе существует), будет зависеть от того, насколько верно подобран набор выражений для модели, насколько короткими, «красивыми» (с точки зрения математики) окажутся цепочки вычислений в процессе поиска решения.

Простейший пример

Пусть нам нужно приготовить филе курицы. И овощи (помидоры черри). В тушеном виде. Желательно, чтобы блюдо было соленое и не пересушенное.

Императивная парадигма описывает решение так:

  • купить филе курицы;
  • купить помидоры черри;
  • купить соль и подсолнечное масло;
  • порезать филе;
  • поставить жаровню на плиту;
  • закинуть в жаровню филе курицы и помидоры;
  • налить подсолнечное масло и посолить;
  • включить плиту на среднем огне;
  • через 40 минут выключить плиту.

Декларативная парадигма:

  • хочу соленое, тушеное филе курицы с помидорами черри и подсолнечным маслом.

Языки

Декларативные языки программирования не входят в Тор 20 индекса TIOBE, но во второй двадцатке некоторые присутствуют. Среди них — Prolog, LISP, SQL, Haskell, Scala. на самом деле, это зачастую узкоспециализированные языки, решающие свои задачи. В этот же список, кстати, должны входить Erlang, Clojure, Elixir, F#. Так что кто знает — тот знает.

Декларативные языки программирования делятся на две категории:

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

7. Функциональное программирование

В ходе развития декларативной парадигмы сформировался подход, основанный на так называемых чистых функциях. Функция является чистой, если:

  1. результат функции зависит только от ее входных данных, а не от внешнего контекста или состояния приложения;
  2. функция не имеет побочных эффектов.

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

В функциональных языках также реализован принцип ленивых вычислений: запуск функции на выполнение нужно отложить до тех пор, пока не понадобится результат ее работы. Например, с помощью ленивых вычислений можно работать с бесконечными последовательностями (те значения последовательности, которые уже известны, хранятся в памяти, а остальные хранятся в виде формулы).

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

Пример

Вычисление факториала.

Слева — программа на императивном языке С++. Справа — программа на функциональном языке:

Не зря мы выбрали пример с рекурсией (в коде справа функция вызывает сама себя). В функциональном программировании рекурсию используют достаточно часто и охотно.

Языки

Lisp, Erlang, Clojure, Elixir, F# и Haskell — одни из наиболее известных функциональных языков программирования.

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

Применение функционального программирования

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

Проекты в области Data Science и Big Data требуют большого количества быстрых вычислений с минимальным потреблением аппаратных ресурсов. Часто с этими задачами императивные языки справляются гораздо хуже, так как потребляют слишком много ресурсов — в частности, при выполнении параллельных вычислений.

Но когда дело касается реализации, например, пользовательского интерфейса — императивные языки вновь на коне. Функциональные языки программирования реализованы в соответствии с декларативной парадигмой. Такая реализация имеет свои преимущества и недостатки, которые, увы, трудно воспринимать без знания императивных языков и сопоставления с ними.

Преимущества

  1. Позволяет минимизировать или вовсе избавиться от мутабельности данных.
  2. Не допускает появления побочных эффектов.
  3. Благодаря этому снижается вероятность допустить ошибку, связанную с непредвиденным изменением состояния приложения.
  4. Лучше подходит для разработки масштабируемой функциональности, так как обеспечивает гораздо меньшую связность кода и высокий уровень абстракции.

Недостатки

  1. Необходимость менять входные данные при активном взаимодействии приложения с пользователями или другими приложениями заставляет разработчиков лишний подумать, стоит ли использовать эти языки. Ведь для решения таких задач на практике зачастую приходится нарушать принципы декларативного подхода.
  2. Есть сложности с оценкой производительности, так как структуру декларативных языков трудно оптимально отобразить на машинную архитектуру.
  3. Из-за узкой направленности декларативные языки менее популярны, не имеют таких больших и развитых экосистем, как у современных императивных языков программирования.

8. Логическое программирование

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

Мы можем сформулировать задачу в этих терминах, разбить ее на подзадачи (если нужно) и решением будет общий результат, собранный после проверки гипотез по каждой подзадаче. Как именно будет проходить проверка гипотез, какие правила будут в ней задействованы — вновь самостоятельно решает компилятор логического языка, на котором написана программа.

Работу программы можно сравнить с картой маршрутов. Чтобы куда-то добраться — нужно идти не по всем маршрутам, которые нарисованы на карте. На каждом условном перекрестке нужно выбрать какой-то вариант движения, принимая решение на основе известных нам фактов (подсказок). А разработчик при написании кода задает эту карту, по которой можно прийти в разные пункты назначения — в зависимости от конкретных исходных данных.

Пример

По заданным признакам определить, какие объекты являются птицей.

У нас есть вот такой набор признаков (фактов, исходных данных):

  • голубь – это птица;
  • у вороны есть крылья;
  • ворона умеет летать;
  • у пингвина есть крылья;
  • пингвин умеет плавать;
  • объект является птицей, если он умеет летать и у него есть крылья.

Высказывания 1–5 будем считать фактами, которые мы принимаем без доказательств. Высказывание под номером 6 представляет собой правило вывода. В данном случае это правило определяет, в каких случаях объект можно считать птицей:

  • умеет летать и есть крылья.

Раз между ними стоит И, значит должны быть выполнены оба условиях одновременно.
Полученная модель может обрабатывать, например, такие запросы:

  • Кто умеет плавать? (Ответ: пингвин)
  • Кто является птицей? (Ответы: голубь, ворона)
  • У кого есть крылья? (Ответы: ворона, пингвин)

Программа на неком логическом псевдоязыке (а-ля Prolog) будет выглядеть так:

птица (голубь).
есть_крылья (ворона).
умеет_летать (ворона).
есть_крылья (пингвин).
умеет_плавать (пингвин).
птица (Объект):- умеет_летать (Объект), есть_крылья (Объект).

В целом интуитивно понятно, да?

Языки

Prolog, Mercury, Alice

Среди старых и, как ни странно, все еще популярных логических языков программирования можно выделить Prolog. Его явили миру в 1970 году и поначалу использовали для анализа естественного языка. Оказалось, что этот язык позволяет создавать так называемые экспертные системы с автоматизацией выдачи информации в ответ на вопросы пользователей. Для этого достаточно лишь описать факты и придумать для них правила вывода.

Применение

Для более старых логических языков в середине XX века было почетно участвовать в автоматическом доказательстве теорем.

Логические языки программирования по-прежнему используются редко и точечно. Тем не менее они хорошо зарекомендовали себя в разработке трансляторов, оптимизаторов кода и систем искусственного интеллекта. Разработчик языка Visual Prolog (компания PDC) с его помощью создает авиационные и медицинские системы.

Часто в коммерческой разработке ПО логический язык используется как дополнение к императивному.

9. Метапрограммирование

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

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

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

Преобразователи и оптимизаторы

Метапрограммирование используют при реализации механизма компиляции программного кода. То есть, в преобразовании кода, написанного на языке высокого уровня, в объектный код или набор машинных команд участвуют специальные метапрограммы, созданные разработчиками.

Эти метапрограммы могут также выполнять высокоуровневую оптимизацию. Например, при удалении бесполезных фрагментов кода (или мертвого кода; dead code elimination) метапрограмма анализирует исходный код и убирает фрагменты, которые не влияют на итоговый результат работы. Если, например, какой-то блок исходного кода (возможно, из-за логической ошибки программиста), никогда не запустится или объявляет переменные, которые нигде не используются — программе нужна такая оптимизация.

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

Самомодифицирующийся код

Только что мы говорили про компилятор, а теперь вспомним про интерпретатор. В отличие от компилятора, интерпретатор выполняет анализ, обработку исходного кода и выполнение программы, последовательно считывая по одной строке или команде. То есть, можно сказать, что разработчики интерпретаторов обеспечивают самомодификацию кода (автоматическую модификацию кода во время работы программы) средствами метапрограммирования.

Среди известных и более современных интерпретируемых языков есть и PHP, и Ruby, а также модный в последнее время Python.

По аналогии был реализован и механизм так называемой компиляции на лету (JIT — Just-in-time) и частично добавлен к этим языкам, а также ко многим другим: Java, JavaScript, в реализации языков для .NET и так далее. Это динамическая компиляция, которая работает прямо во время выполнения программы. За счет этого JIT-компиляция часто дает больший выигрыш в производительности, чем компиляция статическая.

Что еще благодаря метапрограммированию происходит на лету? Динамическое приведение типов и динамический полиморфизм. Это реализовано в таких языках, как C++, C# и Java. Они связаны с таким механизмом как «позднее связывание». Пример: какому классу (типу) принадлежит объект, для того класса (типа) и вызывается метод. Этот вопрос для каждого конкретного случая решается непосредственно в процессе работы программы.

Генераторы кода

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

И тогда на помощь приходит метапрограммирование. Возникает светлая мысль: написать генератор кода, принимающий необходимые параметры. После этого необходимую служебную функциональность с заданными параметрами можно будет добавлять автоматически. Впоследствии такие метапрограммы могут быть оформлены в библиотеки, фреймворки и включены в программный инструментарий крупных сред разработки (Qt Creator, Visual Studio, IntelliJ Idea и так далее).

XAML Designer, Visual Studio 2022

Яркий пример такого инструментария — генераторы GUI: они автоматически формируют исходный код для форм, кнопок и других элементов интерфейса, а также позволяют задать им многочисленные параметры (размеры, внешний вид и так далее).

Разработка таких автоматизированных решений обходится дорого и окупает себя только в случае активного или массового использования.

10. Обобщенное программирование

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

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

Выше шла речь про генераторы кода. Здесь и там можно найти общую проблематику: здесь и там есть повторяющиеся похожие задачи, которые предлагается автоматизировать. Но обобщенные алгоритмы и структуры данных должны непосредственно участвовать в решении основных проблем, а не играть вспомогательную или декоративную роль. Рутинные действия будут автоматизированы, но от выбора лаконичного решения и создания подходящих шаблонов будет зависеть основная логика и производительность приложения (или его частей).

Во многих современных языках уже есть встроенные библиотеки таких шаблонов. C++ был одним из первых языков, для которого была создана подобная библиотека. Standard Template Library (STL) включала такие контейнеры, как dynamic array, linked list, queue, set, associative array, алгоритмы, итераторы и многое другое. Чтобы, например, использовать все преимущества связанного списка (linked list) и инструментария его обработки, нужно просто передать ему данные и их тип. А всю работу под капотом для вас сделает компилятор.

Шаблоны классов

В С++ для создания шаблонов используют ключевое слово template.

template <typename T>
class Container {
public:
  void add (T value);
  int index_of (T value);
  int get_count ();
  T get_value (int index);
private: 
 … … …
};

Вспоминаем, что было сказано чуть выше, и передаем нашему шаблону нужный тип, а затем данные.

Container <int> apples;
int main () {
  apples.add (7);
  apples.add (11);
}

Пример шаблона с несколькими параметрами:

template <typename T, unsigned size> class Array         // это объявление

Array <float, 20>    // это инициализация

Шаблоны функций

Иногда достаточно создать шаблон только для одной функции, не создавая целый класс.

template <typename T>
void swap (T &left, T &right) {
  T temp = left;
  left = right;
  right = temp;
}

Функция меняет местами значения аргументов.

int main () {
  int a = 3, b = 5;
  swap (a, b);  // теперь значение a стало равно 5, значение переменной b равно 3 
}

Переменные a и b имеют тип int, поэтому компилятор автоматически вызовет swap <int> (a, b). Но можно явно прописать это в коде, заменив swap (a, b) на swap <int> (a, b).

Безусловно, с точки зрения метапрограммирования написать библиотеку шаблонов — это достаточно простая задача, но без обобщенного программирования современную индустрию разработки очень трудно представить.

Заключение

Как видите, парадигмы программирования — это бесконечная тема. Чем больше рассказываешь — тем больше всплывает деталей, вопросов и сюжетных ответвлений. Поэтому нужно уже остановиться.
Понятно, что с точки зрения практики, хорошо бы владеть разными стилями (парадигмами) программирования. Хорошо бы понимать, как реализованы парадигмы средствами того или иного языка и как это все применяют в реальных проектах. А погружение в холивары о том, какая парадигма популярнее и в каких языках ее больше, кажется не слишком полезным. Лучше посмотрите таблицу и видео, которое размещено ниже. Надеюсь, это принесет вам больше пользы.

Таблица базовых парадигм

Парадигма Ключевой концепт Программа Работа программы Результат
Императивная Команда Последовательность инструкций Выполнение инструкций Итоговое состояние памяти
Объектно-ориентированная Объект и класс Набор классов и объектов Обмен данными между объектами через вызов их методов Итоговое состояние объектов
Функциональная Функция Набор функций Вычисление функций Итоговое значение главной функции
Логическая Факты и правила Логические соотношения Логическое доказательство Результат доказательства

Видео: Парадигмы программирования (обзорное видео с примерами и ответами на вопросы)

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023