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

StackOverflow https://stackoverflow.com/questions/1467959

  •  13-09-2019
  •  | 
  •  

Вопрос

Я изучаю две основные парадигмы программирования, декларативную и императивную парадигмы.Мне трудно следить за двусмысленными заявлениями, сделанными в моем учебнике и википедии, такими как:

декларативный:- фокусируется на том, "что" должен делать компьютер.- не имеет "побочных эффектов" - без контроля потока

императивный:- фокусируется на том, "как" компьютер должен это делать.- как это сделать с точки зрения последовательности действий

как бы вы различили две парадигмы программирования?Если бы вы могли подробнее остановиться на приведенных выше утверждениях, это было бы очень полезно.

Это было полезно?

Решение

SQL - это классический декларативный язык:вы говорите: "посмотрите на эту таблицу и дайте мне все строки, соответствующие этим критериям" (а в реальной жизни вы используете объединения, списки выбора, что угодно, но это тот же базовый оператор).Как вы отметили выше, этот оператор сообщает компьютеру, чего вы хотите, а не как это сделать.

Внутренне система баз данных реализована на языке, подобном C, и ваш SQL-запрос будет преобразован в следующие обязательные шаги:

while (another row to process)
    read row from disk
    for (every test)
        if (test fails)
            continue to next row
    add row to result-set

Одна из ключевых вещей, на которую следует обратить внимание здесь, - это явный поток управления: в то время как, для, и если.Они не будут отображаться в декларативных языках.

Другие советы

Императивное программирование последовательно выполняет инструкции, которые могут манипулировать базовым состоянием.

Некоторое императивное программирование на Java:

Customer customer = null;

// first create a customer and have the variable reference it
customer = new Customer(); 
// the state of the customer variable has changed

// set the id on whatever object is *currently* being referenced by the variable
customer.setId(1);
// the state of the Customer object has changed

customer.setFirstName("Bob");
customer.setLastName("McBob");

Обратите внимание, что если вы выполните описанное выше действие не по порядку, это приведет к исключению нулевого указателя:

Customer customer = null;
customer.setFirstName("Foo");   // the customer variable is still null at this point
customer = new Customer();   // too late!

Декларативное программирование не имеет состояния или порядка, только объявления.

Вот простой пример - этот фрагмент xml-кода можно считать декларативным:

<NewCustomers>
  <Customer>
    <Id>1</Id>
    <FirstName>Bob</FirstName>
    <LastName>McBob</LastName>
  </Customer>
</NewCustomers>

В нем не говорится о том, как будет создан объект customer, просто объявляются детали.То, как вышеприведенное интерпретируется и выполняется, зависит от среды программирования.

HTML и веб-браузеры являются довольно хорошими примерами каждой парадигмы соответственно.HTML (и CSS) - это декларативный языки - вы сообщаете веб-браузеру что для пометки, но не как чтобы сделать это.Другими словами, строка кода, подобная <h1>My title</h1> сообщает веб-браузеру что для отображения - тег заголовка с текстом "Мой заголовок" - но теперь о том, как на самом деле отобразить его на экране.

Веб-браузер, однако, как правило, написан на императивный манера поведения.Он принимает эти декларативные определения разметки и фактически инструктирует компьютер как чтобы нарисовать эти элементы на экране.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top