Со времени изобретения высокоуровневых языков программирования в отрасли доминируют парадигмы. Именно парадигмы, от императивных до объектно-ориентированных и функциональных – в основном формируют современный дискурс, касающийся языков программирования.

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

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

  • Си — императивный язык; его программы состоят из операторов и процедур, которые выполняются сверху вниз.
  • Java — объектно-ориентированный язык; его программы состоят из объектов, которые взаимодействуют между собой посредством динамической диспетчеризации.
  • Haskell — функциональный язык; его программы оцениваются путем композиции и применения чистых функций.

В прошлом языки программирования предлагали довольно скупой и узкий набор возможностей. Разработчики Java и Haskell выбрали набор функций, которые, по их мнению, способствуют повышению качества программ. Создатели языка C пошли по тому же пути, но при этом были ограничены возможностью реализации той или иной функции.

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

Действительно, почти все современные языки лучше всего описывать как мультипарадигмальные, поэтому данный термин немного размывается. Последние версии Python, JavaScript и даже Java предлагают функции, необходимые для функционального программирования, наряду с императивным и объектно-ориентированным программированием. То же самое можно сказать о C++, C#, OCaml и других языках.

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

Языки общего назначения в XXI веке больше не определяются какой-то одной парадигмой. Объединяющим аспектом новых языков, таких как Rust, Nim и Gleam, является то, что они с самого начала разрабатывались вне парадигм.

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

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

Комментарии (9)


  1. VBDUnit
    08.04.2024 13:54
    +7

    Мне кажется, или «комбинация парадигм (или их частей)» — не есть «отказ от парадигм»?


  1. unreal_undead2
    08.04.2024 13:54
    +5

    Java как пример чистого ООП так себе - целые числа там всё таки не посылкой сообщений складываются.


  1. diakin
    08.04.2024 13:54
    +1

    А тем временем https://habr.com/ru/articles/596517/


  1. Batalmv
    08.04.2024 13:54
    +2

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


  1. gun_dose
    08.04.2024 13:54

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


    1. diakin
      08.04.2024 13:54

      Так работало же, нет?


      1. gun_dose
        08.04.2024 13:54

        Да, работало, если задержать дыхание когда нажимаешь кнопку "Импорт", и не шевелиться.


  1. Dominux
    08.04.2024 13:54
    +4

    Все же автор не понял разницу в классификации парадигм и запихнул все под одну гребёнку. Так, например:

    Си — императивный язык

    И далее он говорит, что Java - ООП, а Haskell - функциональщина. И это две разные классификации:

    Есть классификация по императивности-декларативности.

    А есть другая, которая определяет то, как именно будет происходить работа с данными, и отношение к иммутабельности и тд. И вот тут уже мы видим ФП и ООП в качестве ярких представителей. И Си по такой классификации - это процедурный ЯП.


  1. qrKot
    08.04.2024 13:54

    Что-то статья целиком из неверного понимания парадигм растет. Противопоставлять императивность ООП - ну, такое себе. Императивность/декларативность парадигмам ортогональна.

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

    То, что в Java завезли лямбды или то, что в Go есть замыкания, не делает языки функциональными. Наличие примитивных типов в C++ или С# не делает их процедурными. Важно то, как организовывается программа.

    Объединяющим аспектом новых языков, таких как RustNim и Gleam, является то, что они с самого начала разрабатывались вне парадигм.

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