我正在研究两种主要的编程范式,声明式范式和命令式范式。我很难理解我的教科书和维基百科上的模棱两可的陈述,例如:
声明式: - 关注计算机要做什么。- 没有“副作用” - 没有控制流
命令式: - 专注于计算机应该“如何”做到这一点。- 如何在动作序列方面做到这一点
您将如何区分这两种编程范式?如果您可以扩展上述陈述,那将非常有帮助。
我正在研究两种主要的编程范式,声明式范式和命令式范式。我很难理解我的教科书和维基百科上的模棱两可的陈述,例如:
声明式: - 关注计算机要做什么。- 没有“副作用” - 没有控制流
命令式: - 专注于计算机应该“如何”做到这一点。- 如何在动作序列方面做到这一点
您将如何区分这两种编程范式?如果您可以扩展上述陈述,那将非常有帮助。
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。这些不会出现在声明性语言中。
命令式编程顺序执行可能操纵底层状态的语句。
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>
它没有谈论如何构建客户对象,只是声明了部分。以上如何解释和执行取决于编程环境。
HTML 和 Web 浏览器分别是每种范式的很好的例子。HTML(和 CSS)是声明性语言——您告诉 Web 浏览器标记什么,而不是如何标记。换句话说,像这样的一行代码<h1>My title</h1>
告诉网络浏览器要显示什么——带有文本“我的标题”的标题标签——但现在如何在屏幕上实际绘制它。
然而,Web 浏览器通常以命令式的方式编写。它采用这些声明性标记定义并实际指示计算机如何将这些元素绘制到屏幕上。