声明式(declarative)是结果导向的,命令式(imperative)是过程导向的。它们都有自己适用的场景和局限,于是现实中的编程语言常常都有两者的身影。
命令式vs声明式
例如我们有一个用户列表,用 python 查找手机号为 183 开头的用户,可能会这么写:
1 | def get_users(): |
这是命令式的做法,给出通向目标的每个指令;而声明式语言则直接描述目标,如SQL可能会这么写:
1 | SELECT * FROM users WHERE phone LIKE '183%'; |
显然,声明式语言对用户更友好,用户可以关心更少的细节。更重要的是:它允许多种底层实现方式,保持目标不变的同时不断优化,如上例中 SQL 的实现既可以遍历所有的用户,也可以使用索引来加速查找。
而命令式的好处自然是它的表达能力了,图灵完备的语言可以表达任何的可计算问题。