声明式编程和命令式编程

4
我正在学习编程的两种主要范式,即声明式和命令式范式。我发现我的教科书和维基百科上的陈述含糊不清,例如:
声明式: - 侧重于“计算机应该做什么”。 - 没有“副作用”。 - 没有控制流。
命令式: - 侧重于“计算机应该如何实现”。 - 如何通过一系列动作来实现。
您如何区分这两种编程范式?如果您能对以上陈述进行扩展,那将非常有帮助。
3个回答

7

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

这里需要注意的一点是显式控制流:while、for和if语句。这些在声明式语言中不会出现。


5

命令式编程按顺序执行语句,这些语句可能会操作底层状态。

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>

它并没有讲述客户对象如何构建,只是声明了各个部分。以上内容的解释和执行取决于编程环境。

3
HTML和网络浏览器分别是每个范例的很好的例子。HTML(和CSS)是声明性语言--您告诉网络浏览器标记内容是什么,但不告诉它如何实现。换句话说,像<h1>My title</h1>这样的代码行会告诉网络浏览器显示什么--带有文本“My title”的标题标签--但不会告诉它如何在屏幕上绘制它。
然而,Web浏览器通常以命令式方式编写。它使用那些声明性标记定义并实际指示计算机如何将这些元素绘制到屏幕上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接