Pull to refresh

Три парадигмы

Reading time 3 min
Views 10K
Привет, Хабр!

Предлагаю вашему вниманию перевод статьи «Three Paradigms» автора Robert C. Martin (Uncle Bob).

image

За последние 40 лет технологии аппаратного обеспечения увеличили вычислительную мощность наших устройств более чем на двадцать порядков. Теперь мы играем в Angry Birds на наших телефонах, которые обладают вычислительной мощностью суперкомпьютера 70-х годов прошлого века с фреоновым охлаждением.

Но за те же 40 лет технологии программного обеспечения практически не изменились. В конце концов, мы все так же применяем операторы if, while loops и операторы присваивания, которые мы использовали еще в 60-х годах. Если бы я взял программиста из 1960 года и привел его сюда, чтобы он посидел за моим ноутбуком и написал код — ему понадобилось бы 24 часа, чтобы оправиться от шока, но он смог бы написать этот код. Принципы не так сильно изменились.

В процессе написания программ изменились три вещи. Я говорю не об оборудовании, не о скорости компьютера и не о невероятных инструментах, которые у нас есть. Я имею в виду сам код. Три вещи изменились в коде. Можно их назвать парадигмами. И все они были «открыты» за одно десятилетие более 40 лет назад.

* 1968 — Структурное программирование. Эдсгер Дейкстра написал свою статью: «О вреде оператора Go To» и ряд других документов и статей, в которых предлагается отказаться от использования необузданного подхода Go To, заменив его такими средствами, как if/then/else и while loops.

* 1966 — Объектно-ориентированное программирование. Оле-Йохан Даль и Кристен Нюгор, изучая язык Алгол, «Открывают» объекты и создают первый объектно-ориентированный язык-Симула-67. Несмотря на то, что это достижение имеет множество перспектив, оно не принесло никаких новых возможностей в наш код. Кроме того, оно удалило одну. Ведь с появлением полиморфизма необходимость в указателях на функции отпала, а на самом деле исчезла.

* 1957 — Функциональное программирование. Джон Маккарти создает Lisp-первый функциональный язык. Lisp был основан на лямбда-исчислении, созданном Алонзо Чёрчем в 30-х годах. Хотя существует много перспектив функционального программирования, однако во всех функциональных программах существует одно огромное ограничение. Они не используют присваивание.

Три парадигмы. Три ограничения. Структурное программирование устанавливает правила по прямой передаче контроля. Объектно-ориентированное программирование вводит правила по косвенной передаче контроля. Функциональное программирование вводит ограничения при присваивании. Все эти парадигмы отняли что-то. Ни одна из них не добавила никаких новых возможностей. Каждая из них повысила требования и уменьшила возможности.

Можем ли мы создать другую парадигму? Есть что-нибудь еще, что можно убрать?

За 40 лет не было новой парадигмы, так что, возможно, это хороший признак того, что больше нечего искать.

Должны ли мы использовать все эти парадигмы, или мы можем выбирать?

Со временем мы решили внедрить их. Внедрение первого структурированного программирования стало возможным благодаря отмене принципа Go To (как рекомендовал Дейкстра в своей статье). ООП была успешно внедрена путем замены указателей функциями в наших современных языках с помощью полиморфизма (например, Java, C#, Ruby). Поэтому, по крайней мере, для этих двух, ответом на данный вопрос является то, что мы ОБЯЗАНЫ использовать их. Все другие варианты были исключены или, по крайней мере, строго ограничены.

А как же функциональное программирование? Должны ли мы использовать языки, не имеющие оператора присваивания? Наверное, да! Мы уже занимаемся написанием кода, который должен хорошо работать на нескольких ядрах, и эти ядра размножаются, как кролики. Мой ноутбук имеет 4 ядра. У моего следующего, скорее всего, будет 8. Тот, что после 16. Как вы собираетесь писать надежный код с 4096 процессорами, борющимися за право доступа к шине?
Мы едва ли сможем заставить работать два параллельных потока, не говоря уже о 2^n процессорах.

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

Подробнее о функциональном программировании мы поговорим в последующих блогах. Что меня поражает в трех парадигмах, упомянутых выше, так это их даты. Они древние, почти старше меня. И с тех пор, как мне исполнилось 16, 42 года назад, новых не было.
Tags:
Hubs:
+13
Comments 31
Comments Comments 31

Articles