декларативное программирование и императивное программирование
-
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>
сообщает веб-браузеру что для отображения - тег заголовка с текстом "Мой заголовок" - но теперь о том, как на самом деле отобразить его на экране.
Веб-браузер, однако, как правило, написан на императивный манера поведения.Он принимает эти декларативные определения разметки и фактически инструктирует компьютер как чтобы нарисовать эти элементы на экране.