声明式编程概念
CIE A-Level 计算机科学· 40 分钟阅读
1. 核心定义:声明式编程与命令式编程★★☆☆☆⏱ 10 min
声明式编程
一种专注于描述需要解决什么问题,而非显式编码如何一步步解决问题的编程范型。
例:
一条返回所有分数超过70分学生的SQL查询就是声明式的。
比较对数字列表排序任务的声明式描述和命令式描述
- 1
命令式方法会显式定义解决方案的每一步:
从索引0迭代到n-1,比较相邻元素,如果顺序不对就交换,重复直到没有交换。 - 2
声明式方法只描述期望的最终状态,没有任何实现步骤:
返回一个包含输入所有元素、按升序排序的新列表。
2. 声明式编程的核心特征★★☆☆☆⏱ 15 min
声明式编程有四个核心特征,是CIE考试中经常考察的内容:
无可变副作用:大多数声明式语言避免修改共享状态或可变数据,减少错误。
高度抽象:实现细节对程序员隐藏,程序员只需要定义需求。
引用透明性:对于相同输入,函数总是返回相同输出,无论在何处调用。
无显式控制流:循环、条件判断和搜索由语言解释器处理,不需要程序员编写。
判断下列哪段代码片段是声明式的,并解释原因:
- 1
Snippet 1:
SELECT name FROM students WHERE grade > 70; - 2
Snippet 2:
result = []; for s in students: if s.grade > 70: result.append(s.name) - 3
代码片段1(SQL)是声明式的:它只描述我们想要什么结果,不描述如何扫描表或筛选行,这些步骤由SQL引擎处理。
- 4
代码片段2是命令式的:它明确定义了循环、条件和构建结果的操作,详细说明了过程的每一步。
测试你对核心特征的理解
下列哪一项是声明式编程的核心特征?
A) 显式逐步控制流
B) 描述需要什么结果
C) 可变共享状态
D) 底层内存管理
显示答案
B —正确。所有其他选项都是命令式编程的核心特征,而非声明式。
3. 声明式编程的子范型★★★☆☆⏱ 15 min
声明式编程是一个涵盖术语,包含CIE 9618大纲明确覆盖的两个主要子范型:
子范型 | 核心思想 | 示例语言 |
|---|---|---|
逻辑编程 | 程序是事实和规则的集合,由解释器求解查询 | Prolog |
函数式编程 | 程序由纯函数构建,无可变状态 | Haskell, Scala, Python (支持函数式特性) |
解释Prolog中祖先关系的代码如何符合声明式范型
- 1
首先,我们定义关于亲子关系的事实:
- 2
parent(john, mary). parent(mary, ann). - 3
接下来,我们定义祖先关系的规则:
- 4
ancestor(X, Y) :- parent(X, Y). ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y). - 5
这段代码只描述了什么是真,不描述如何求解
ancestor(john, ann)这样的查询。Prolog解释器会处理搜索和匹配步骤,因此符合声明式'描述做什么而非怎么做'的规则。
4. 常见陷阱
错误做法:
声称所有声明式语言都是函数式的,并且所有函数式代码都是纯声明式的。
原因:
声明式是一个宽泛的范型类别,函数式只是其中一个子范型,而且许多函数式语言允许编写命令式代码。
正确做法:
应当说明函数式编程是声明式编程的一个子范型,逻辑编程是另一个独立且同等重要的子范型。
错误做法:
将面向对象编程(OOP)与声明式编程混淆。
原因:
OOP是一种命令式范型,它围绕可变对象和逐步方法组织代码。
正确做法:
记住OOP属于命令式范型的范畴,因为它专注于如何修改对象状态来得到结果。
错误做法:
声称SQL不是声明式的,因为它有过程化扩展。
原因:
CIE将核心SQL查询归类为声明式,过程化扩展是可选附加组件,不用于标准查询。
正确做法:
确认标准SQL查询是声明式的,因为它们描述所需结果,而非如何检索结果。
错误做法:
认为声明式代码总是比命令式代码效率更高。
原因:
效率取决于使用场景,隐藏底层实现会让声明式代码在某些任务中更慢。
正确做法:
认识到声明式代码的主要优势是降低复杂度和更容易调试,不保证性能更好。
5. 速查表
特征 | 声明式编程 | 命令式编程 | ||
|---|---|---|---|---|
核心关注点 | 需要什么结果 | 如何生成结果 | ||
控制流 | 由语言处理 | 由程序员显式定义 | ||
副 | 作 | 用 | ||
通 | 常 | 避 | 免 | |
常 | 见 | 且 | 允 | 许 |
引用透明性 | 通常支持 | 不需要 | 示例 SQL, Prolog, Haskell C, Python, Java, OOP 语言 |
6. 常见问题
考试中需要记住的最核心区别是什么?
核心区别是做什么与怎么做:声明式 = 描述你想要什么结果,命令式 = 一步步描述如何得到结果。
在CIE 9618考试中,SQL被认为是声明式语言吗?
是的,CIE大纲明确将标准SQL查询归类为声明式,因为它们描述了结果集,而非如何检索结果。
真题中的出现
AI 根据考纲规律估算的考点位置,请对照官方真题核实准确性。仅作复习重点参考。
- 2022 · 1
范型比较简答题
- 2023 · 1
识别声明式特征多选题
