Несмотря на то, что терминология далека от стандартизированной, общий способ классифицировать основные парадигмы программирования на
- процедурный
- функциональная
- логический
- Объектно-ориентированный
- общий
Вы, кажется, уже знаете, что такое процедурное программирование.
В функциональных языках функции рассматриваются как первоклассные объекты. Другими словами, вы можете передать функцию в качестве аргумента другой функции, или функция может вернуть другую функцию. Функциональная парадигма основана на лямбда-исчислении, и примерами функциональных языков являются LISP, Scheme и Haskel. Интересно, что JavaScript также поддерживает функциональное программирование.
В логическом программировании вы определяете предикаты, которые описывают отношения между сущностями, такие какpresident(Obama, USA)
или president(Medvedev, Russia)
. Эти предикаты могут быть очень сложными и включать переменные, а не только литеральные значения. После того, как вы определили все свои предикаты, вы можете задавать вопросы своей системы и получать логически непротиворечивые ответы.
Основная идея в логическом программировании состоит в том, что вместо того, чтобы сообщать компьютеру, как вычислять вещи, вы говорите ему, что . Пример: ПРОЛОГ.
Объектно-ориентированный парадигма в некотором смысле является расширением процедурного программирования. В процедурном программировании у вас есть ваши данные, которые могут быть примитивными типами, такими как целые числа и числа с плавающей запятой, составными типами, такими как массивы или списки, и пользовательскими типами, такими как структуры. У вас также есть свои процедуры, которые работают с данными. Напротив, в ОО есть объекты, которые включают как данные, так и процедуры. Это позволяет вам иметь хорошие вещи, такие как инкапсуляция, наследование и полиморфизм. Примеры: Smalltalk, C ++, Java, C #.
Общее программирование было впервые введено в Аде в 1983 году и стало широко распространенным после введения шаблонов в C ++. Это идея, что вы можете написать код без указания реальных типов данных, с которыми он работает, и заставить компилятор выяснить это. Например, вместо того, чтобы писать
void swap(int, int);
void swap(float, float);
....
ты бы написал
void swap(T, T);
один раз, и пусть компилятор сгенерирует определенный код для того, что T
может быть, когда swap()
фактически используется в коде.
Общее программирование поддерживается в различной степени C ++, Java и C #.
Важно отметить, что многие языки, такие как C ++, поддерживают несколько парадигм. Также верно и то, что, даже если говорят, что язык поддерживает определенную парадигму, он может не поддерживать все возможности этой парадигмы. Не говоря уже о том, что существует много разногласий относительно того, какие функции требуются для конкретной парадигмы.