Парадигмы и языки программирования. Субъективные заметки

За пятьдесят лет общения с компьютерами всех (с 1 по 4) поколений мне пришлось писать программы на разных языках программирования. Это – машинные коды, Ассемблер, Fortran, Algol, Basic, Prolog, Lisp, C, C++, Turbo Pascal и Delphi, C#, SQL и PHP.
Приведу вариант генеалогического древа языков программирования, взятый с просторов Интернета:

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

О парадигмах программирования

Поскольку всякая наука начинается с классификации, видимо, следует упомянуть опередившую время книгу профессора МГУ В.Ш. Кауфмана «Языки программирования. Концепции и принципы», которая была издана первый раз в конце 1980-х годов. Из нее мы узнали, какую парадигму (концепцию, стиль) программирования мы применяем. В практическом плане господствующими были процедурные языки — это Фортран, Алгол, Бейсик, Паскаль, С. Принципы структурного программирования в указанных языках также могли быть успешно реализованы. Реализованная в них императивная парадигма («Напиши, как нужно сделать!») казалась простой и единственно возможной: определите функции системы, разработайте структуру данных, реализуем соответствующие алгоритмы их обработки.
Отмечу, что язык С++ (Б.Страуструп, 1983 год), как объектно-ориентированный язык, только начал развиваться и был нам недоступен.
Существенно, что до 1986 года у меня, как и моих коллег по НИИ, не было возможности работы с персональными ЭВМ. Свои задачи мы решали либо в ВЦ на ЭВМ М-222, либо на мини-ЭВМ М-6000 (для управления технологическими процессами).
Реальная возможность изучения различных парадигм программирования появилась с развитием ПК и Интернета. Но именно преподавание программирования заставило меня обратить внимание на парадигму объектно-ориентированного программирования (ООП), которая была положена в основу языков C++ и Оbject Pascal. Лозунг «Мыслить в объектах!» постепенно приобретал конкретное содержание и программную реализацию. Замечу, что в любом языке ООП используется процедурный стиль при кодировании тела функций.

Декларативное программирование

А что же еще? Оказалось, что есть еще две парадигмы, соответствующие по Кауфману декларативному подходу, это логическое и функциональное программирование. Декларативный подход требует всего лишь указания «что мы хотим сделать». В рамках курса «Технологии программирования» пришлось знакомить студентов и с этими подходами.
Для освоения логического программирования (ЛП) был выбран Turbo Prolog (позднее появился Visual Prolog). Помню возмущение части студентов: «Кому нужны эти предикаты, даже конструкции цикла и те отсутствуют!» Любопытно, что девушки, не столь бойко писавшие программы в императивном стиле, на моих примерах Prolog осваивали быстрее (вот и пошутите на тему «женской логики»).
Идею функционального программирования (ФП) можно свести к формуле А.П. Ершова: «ФП – это функции, функции и ничего кроме функций». Готовя примеры на языке Lisp (List Programming – Программирование списков), я получал эстетическое удовольствие от того, как из простых конструкций можно получать достаточно сложные элементы. Например, арифметику с длинными числами.

Что выбирать?

Вывод достаточно прост: решаемая задача определяет выбор языка, фреймворков (framework – рамка, каркас) и среды программирования. Если раньше для написания программы на Алголе я использовал только текстовый редактор кода, транслятор и библиотеки стандартных подпрограмм (БСП), то теперь среда программирования — это действительно широкий набор различных возможностей.
По-видимому, эпоха чистых (в одной парадигме) языков прошла. Например, если Prolog (1972 г.) – язык ЛП, а Haskell (1990 г.) – язык ФП, то наследуемый от них язык Mercury (2014 г.) уже функционально-логический.
Известен опыт создания универсальных языков, например PL/1 или Ada (заказ Минобороны США, назван в честь первой программистки Ады Лавлейс, дочери Байрона), на котором было написано много программ. С другой стороны поражает живучесть предметно-ориентированного языка Cobol (1959 год, автор – адмирал Грейс Хоппер, недавно умершая «бабушка Кобола»). В 1997 году на нем было написано 240 млрд строк кода и выполнялось 90% финансовых транзакций. Хотя известно высказывание Э.Дейкстры, что «изучение Кобола калечит ум».

Мультипарадигмальные языки

Софтверные компании предлагают многофункциональные и мультипарадигмальные (я это слово с трудом выговариваю) среды программирования.
Например, российско-немецкие разработчики языка PascalABC.Net позиционируют его как процедурный (императивный), объектно-ориентированный и функциональный язык. Важной моментом является использование фреймворков платформы .NET для генерации эффективного кода. Его предлагают в качестве языка для первоначального обучения программированию в школах и вузах. Действительно, язык Паскаль Н. Вирта (1970 г.) создавался как учебный и чисто процедурный язык. Усилиями фирмы Borland и Андерса Хейлсберга он стал еще и объектно-ориентированным, а интерпретация функций Паскаля как чистых функций (без побочных эффектов), введение как в C# и других языках анонимных и лямбда-функций дает основание говорить и о функциональной парадигме.
Примеров мультипарадигмальных языков уже достаточно много:
1) Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Python организовывается в функции и классы, которые могут объединяться в модули (они в свою очередь могут быть объединены в пакеты);
2) F# (из семейства языков .NET Framework), как и язык Perl, поддерживает функциональное программирование в дополнение к императивному (процедурному) и объектно-ориентированному программированию;
3) Objective-J — язык поддерживает рефлексивно-ориентированное, объектно-ориентированное, функциональное, императивное, скриптовое программирование;
4) D — язык поддерживает процедурное, объектно-ориентированное, функциональное, параллельное и обобщенное программирование.
Как Вы видите, пора писать новую классификацию и новую теорию.

Бонусы изучения двух-трех языков

Есть забавный эффект изучения и использования нескольких языков. Когда я решил с некоторым запозданием перейти с Delphi на C# в среде Visual Studio, и имея предыдущий опыт программирования на С++ с использованием библиотек MFC, я обнаружил знакомые, но несколько иные чем в MFC библиотеки классов. Оказалось, что их автор — тот же А.Хейлсберг, перешедший в Microsoft из Borland. Далее я руководствовался принципом, если класс был в Delphi, то он может быть и в C#.

Заключение

Что же остается в сухом остатке для начинающего программиста? На форумах часто задают вопросы, с какого языка начать, нужно ли знать несколько языков, что подойдет для программирования сайтов или игр?
Мне кажется, что при выборе языка следует исходить из компромисса между сложностью (возможностями) языка и Вашей готовностью его изучить, также имеет значение и выбор среды программирования.
Как вариант, Вы можете приступить к овладению программированием на языке C# в среде Visual Studio 2017 Community. Вы сможете освоить стиль процедурного программирования и понять, зачем была нужна структурная теорема, легко овладеете операторами языка C# (а заодно C и C++), разберетесь в основах объектно-ориентированного программирования, поймете, зачем нужны библиотеки и фреймворки, освоите работу в современных программных средах.

Надеюсь, что материалы сайта Вам в этом помогут.

Кроме того, Вы можете всегда обратиться к автору сайта с вопросами непосредственно.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *