编程范型、编程范式或程序设计法(),是软件工程中的一类典型的编程风格,指对计算机程序实现进行概念化和结构化的相对高阶的方式。常见的编程范型包括:指令式编程(及其子类过程式编程和面向对象编程)、声明式编程(及其子类函数式编程和逻辑编程)、并发编程、约束编程、数据流编程、泛型编程、元编程和可视化编程等。
编程范型提供并决定了程序员对程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象;在函数式编程中,一个程序会被看作是一个无状态的函数计算的序列。范式沿着编程的不同维度被划分和描述:有些涉及执行模型的推论(如是否允许副作用),有些涉及代码的组织方式(如将状态和行为分组到单元中),还有些涉及语法和文法。
概述
正如软件工程中不同的群体会提倡不同的“方法论”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的,如Smalltalk和Java支持面向对象编程,而Haskell和Scheme则支持函数式编程;同时还有另一些语言支持多种范型,如Ruby、Common Lisp、Python、Rust等。
指令式范型的语言有两个主要特征:它们陈述操作发生的顺序,并通过显式控制该顺序的结构来允许副作用,即状态可以在某个时间点被修改,然后在稍后的时间点被另一代码单元读取。相反,声明式范型的语言不指定操作的执行顺序,而是提供系统内可用操作的集合以及每种操作被允许执行的条件。许多编程范型既以它们支持的技巧著称,也以它们禁止的技巧著称。例如,纯函数式编程不允许副作用,结构化编程不允许使用goto。由于这个原因,新的范型常常被习惯于较早风格的人视为教条主义或过分严格。然而,避免某些技巧反而使理解程序行为和证明程序正确性更为容易。
编程范型和编程语言之间的关系可能十分复杂,因为一个编程语言可以支持多种范型。例如,C++设计时支持过程式编程、面向对象编程以及泛型编程。然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用 C++ 写出一个完全过程化的程序,另一个人也可以用 C++ 写出一个纯粹的面向对象程序,甚至还有人可以写出杂糅了两种范型的程序。
历史
不同的编程方法随着时间的推移而发展。关于每种方法的分类,有些在方法首次出现时就被描述,但更多是在事后才被回顾性地认识。早在20世纪60年代中期,结构化编程就被作为第一种被自觉识别的编程方法加以倡导。
"编程范型"这个概念本身至少可以追溯到1978年:当时罗伯特·弗洛伊德在其图灵奖演讲《编程的范型》中,引用了托马斯·库恩在《科学革命的结构》(1962)中使用的"范式"概念来讨论编程方法。早期的编程语言没有明确定义的编程范型,有时程序大量使用goto语句,其自由使用导致了难以理解和维护的意大利面条式代码。这推动了结构化编程范型的发展,该范型禁止使用goto语句,只允许使用更结构化的编程构造。什里拉姆·克里希纳穆尔蒂则指出,编程语言教育已进入"后林奈时代",即语言不再能够被简单地划分到互斥的分类中去。参见多重编程范型和多范型编程语言比较。
语言与方法
过程式语言
过程式语言,也称为第三代编程语言,是第一批被描述为高级语言的语言。它们使用与待解问题相关的词汇。例如,FORTRAN使用数学语言术语,主要针对科学和工程问题;COBOL使用面向商业的术语;C语言是一种通用的过程式编程语言,由丹尼斯·里奇于1969至1973年在贝尔实验室开发。这些语言直接控制计算机程序遵循的逐步过程,其效能和效率高度依赖于程序员的技能。
声明式语言
声明式编程描述问题是什么,而非如何解决。程序被构造为要在预期结果中找到的一组属性,而非一个待遵循的过程。声明式语言的原型包括SQL(第四代语言)以及函数式语言和逻辑编程语言家族。函数式编程是声明式编程的子集,程序使用意图行为类似数学函数的代码块,避免通过赋值改变变量值,大量使用递归代替循环。逻辑编程将计算视为对知识体系的自动推理——关于问题领域的事实被表达为逻辑公式,程序通过应用推理规则来执行,直到找到问题的答案。
其他范式
符号编程范式使程序能够将公式和程序组件作为数据进行操作,程序可以有效地修改自身,适用于人工智能、专家系统和自然语言处理等领域,支持该范式的语言包括Lisp和Prolog。文学编程将程序结构化为以人为中心的网状结构,文档是程序的组成部分。
参见
- 范式
- 多重编程范型
- 编程语言
- 软件工程
- 图灵完备
參考文献
评论 (0)