Программирование вне парадигм
Со времени изобретения высокоуровневых языков программирования в отрасли доминируют парадигмы. Именно парадигмы, от императивных до объектно-ориентированных и функциональных – в основном формируют современный дискурс, касающийся языков программирования.
Парадигмы часто используются для классификации множества различных языков, стилей и эпох программирования. Многие университеты также строят свои учебные программы на основе парадигм, предлагая курсы по различным стилям программирования. И, конечно, парадигмы — это бесконечная тема для споров среди программистов: в блогах написано бесчисленное количество постов о том, почему функциональное программирование лучше объектно-ориентированного, и наоборот.
Поэтому возникает естественный вопрос: что же на самом деле представляет собой парадигма программирования? Наиболее распространенное понимание заключается в том, что парадигма — это набор особенностей языка программирования, которые определяют его поток управления или систему типов. Например, это определение можно применить к трем основополагающим языкам, созданным в XX веке:
- Си — императивный язык; его программы состоят из операторов и процедур, которые выполняются сверху вниз.
- Java — объектно-ориентированный язык; его программы состоят из объектов, которые взаимодействуют между собой посредством динамической диспетчеризации.
- Haskell — функциональный язык; его программы оцениваются путем композиции и применения чистых функций.
В прошлом языки программирования предлагали довольно скупой и узкий набор возможностей. Разработчики Java и Haskell выбрали набор функций, которые, по их мнению, способствуют повышению качества программ. Создатели языка C пошли по тому же пути, но при этом были ограничены возможностью реализации той или иной функции.
Однако современные языки программирования предлагают значительно более широкий набор функций, которые включаются в базовый набор их возможностей. Это привело к тому, что многие языки стали называться новым и несколько запутанным прилагательным: мультипарадигмальный.
Действительно, почти все современные языки лучше всего описывать как мультипарадигмальные, поэтому данный термин немного размывается. Последние версии Python, JavaScript и даже Java предлагают функции, необходимые для функционального программирования, наряду с императивным и объектно-ориентированным программированием. То же самое можно сказать о C++, C#, OCaml и других языках.
В связи с относительным паритетом возможностей языков, я считаю, что парадигмы сейчас лучше всего понимать как стиль программирования, а не как эксклюзивный набор возможностей. Поскольку почти все языки являются мультипарадигмальными, мы не можем отнести весь язык к одной парадигме. Но мы все равно можем сравнить, как отдельные программы или элементы программ используют ту или иную парадигму в разных языках.
Языки общего назначения в XXI веке больше не определяются какой-то одной парадигмой. Объединяющим аспектом новых языков, таких как Rust, Nim и Gleam, является то, что они с самого начала разрабатывались вне парадигм.
Эти постпарадигмальные языки используют лучшие черты языков прошлых лет и отказываются ограничивать программиста одним стилем. Это дает больше возможностей и творчества в руки программиста, а не дизайнера языка. Стили программирования в этих языках предназначены для сочетания и комбинирования, а не для следования единой догматической парадигме.
В будущем в языках программирования продолжится тенденция на то, чтобы включать наилучший набор конкретных возможностей в конкретный язык или инструментарий, независимо от парадигмы. Я думаю, что среди языков будет сохраняться большое разнообразие, но лучшие аспекты каждой парадигмы программирования не будут изолированы друг от друга внутри языка.