1. Введение

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

2. Императивный язык

В языке императивного типа программисты инструктируют машину Как выполнять задачу, записывая пошаговые инструкции, включая переменные, условия, циклы и т. д.

Пример. Когда вы голодны, вы идете на кухню и готовите себе еду, добавляя необходимые ингредиенты и следуя инструкциям по приготовлению.

Пример программирования. Такие языки, как C, C++ и Java, относятся к императивной парадигме. Например: вы хотите найти элемент в массиве чисел, вы пишете все инструкции для выполнения поиска, такие как ввод данных, повторение массива, проверка, найден ли элемент или нет, возврат результатов и т. д.

// Written in Java
// Function to search for a specific element in the array
boolean search(int array[], int key) {
    for (int i = 0; i < array.length; i++) {
        if (array[i] == key) {
            return true;
        }
    }
    return false;
}

3. Декларативный язык

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

Пример. Когда вы голодны, вы заказываете еду в ресторане. Вы не знаете, как готовится еда. Вы просто попросили желаемую еду, и ее доставили вам.

Пример программирования.SQL (язык структурированных запросов) принадлежит к декларативному языку.

Например: SELECT * FROM EMPLOYEE в этом запросе вы только что упомянули, что вам нужны все записи о сотрудниках из таблицы EMPLOYEE. Однако вы не указали пошаговые инструкции и логику для извлечения данных из таблицы. Вы не знаете лежащую в основе логику, используемую для извлечения записей из базы данных.

4. Императивные классификации

Императивная парадигма подразделяется на два типа: процедурная и объектно-ориентированная.

4.1 Процедурно-ориентированный

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

Пример программы: линейный поиск в C.

int main()
{
  int array[100], key, c, n, found_index;

  printf("Enter number of elements in array: ");
  scanf("%d", &n);

  printf("Enter %d integer(s): ", n);

  for (c = 0; c < n; c++) {
    scanf("%d", &array[c]);
  }

  printf("Enter a number to search:");
  scanf("%d", &key);

  found_index = linear_search(array, n, key);  
  if (found_index >= 0)
  {
      printf("%d is present at location %d.\n", key, found_index);
  }
  else 
  {
    printf("%d not present", key);
  }
  return 0;
}

int linear_search(int a[], int n, int key) {
   long c;
 
   for (c = 0 ; c < n ; c++) {
      if (a[c] == key)
         return c;
   }
   return -1;
}

4.2 Объектно-ориентированный

Объектно-ориентированный язык разбивает задачу на объекты, которые раскрывают поведение (метод) и данные (член или атрибут), объекты взаимодействуют друг с другом с помощью методов передачи сообщений для выполнения данной задачи. C++, Java, C#, Kotlin и т. д. относятся к объектно-ориентированной парадигме.

Пример:линейный поиск в Java.

class ArraySearch {
    
    int[] array;

    public ArraySearch(int[] array) {
        this.array = array;
    }

    public int linearSearch(int key) {
      for (int i = 0; i < this.array.length; i++) {
          if (this.array[i] == key) {
            return i;
          }
      }
      return -1;
    }
}

class MainApplication {
  
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number of elements in array: ");
        int n = sc.nextInt();
        int[] array = new int[n];

        System.out.printf("Enter %d integer(s): ", n);        
        for (int i = 0; i < n; i++) {
            array[i] = sc.nextInt();
        }

        System.out.printf("Enter a number to search:");
        int key = sc.nextInt();
        ArraySearch arraySearch = new ArraySearch(array);
        int result = arraySearch.linearSearch(key);
        
        if (key >= 0) {
            System.out.printf("%d present at %d location", key, result);
        } else {
            System.out.printf("%d not present", key);
        }
    }
}

5. Декларативные классификации

Императивная парадигма далее в основном подразделяется на два типа: функциональная и логическая.

5.1 Функциональность

Функциональное программирование содержит только функции без изменения состояния или данных. Это означает, что нет глобальных данных/переменных. Составление и применение функции является основной движущей силой этой парадигмы. Функция может принимать в качестве аргумента другую и возвращать новую функцию. Первым высокоуровневым языком функционального программирования, разработанным в 1950-х годах, был LISP. Этот язык заложил основу для многих характеристик современных языков функционального программирования.

Пример:программа факториала с использованием LISP

(defun factorial (num)
   (cond ((zerop num) 1)
      (t ( * num (factorial (- num 1))))
   )
)
(setq n 6)
(format t "~% Factorial ~d is: ~d" n (factorial n))

5.2 Логика

Логическая парадигма основана на математической логике, в которой операторы программы выражают факты и правила. Правила записываются в виде логических предложений. Механизм выводит ответ на запрос пользователя, используя методы унификации и поиска с возвратом. Набор фактов и правил образует базу знаний, позволяющую системе рассуждать. Prolog, Datalog и т. д. являются примерами логического программирования. Логическое программирование помогает в таких основных областях, как обработка естественного языка, управление базами данных, сопоставление с образцом, доказательство теорем и прогнозный анализ.

Пример:программа на Прологе для определения совпадения отношений двух людей на основе их базы знаний об интересе к еде.

/* Facts */
boy(tom).   /* read as 'tom is a boy' */
boy(bob).
boy(jerry).

girl(alice).   /* read as 'alice is a girl' */
girl(lili).

nonveg(chicken). /* read as 'chicken is a nonveg' */
nonveg(fish).

veg(broccoli).  /* read as 'broccoli is a veg' */
veg(apple).

eat(tom, chicken). /* tom eats chicken */
eat(tom, apple). /* tom eats apple */
eat(bob, broccoli).
eat(bob, apple).
eat(alice, chicken).
eat(lili, apple).
eat(lili, broccoli).
eat(jerry, apple).

human(X) :- boy(X) ; girl(X). /* X is a human being if X is either boy or girl */

is_vegetarian(X) :- human(X), eat(X, Y), veg(Y).
is_nonvegetarian(X) :- human(X), eat(X, Y), nonveg(Y)

/* Rules */
nonveg(X) :- food(X).  /* if X is a nonveg, then X is a food */
veg(X) :- food(X).    /* if X is a veg, then X is a food */

/* X likes if both are vegetarian or both are non vegetarian*/
match(X, Y) :- (is_vegetarian(X), is_vegetarian(Y)) ; (is_nonvegetarian(X), is_nonvegetarian(Y))
/* Query check if bob likes alice */
?-match(bob, alice)

/* Query check if bob likes lili*/
?-match(bob, lili)