编程范型
| 编程范型 | |
|---|---|
| 上级分类 | 范式、代码风格 |
| 话题方面 | 計算機科學 |
| Stack Exchange標籤 | https://stackoverflow.com/tags/paradigms |
编程范型、编程范式或程序设计法(英語:programming paradigm),是软件工程中的一类典型的编程风格,指对计算机程序实现进行概念化和结构化的相对高阶的方式。[1]常见的编程范型包括:指令式编程(及其子类过程式编程和面向对象编程)、声明式编程(及其子类函数式编程和逻辑编程)、并发编程、约束编程、数据流编程、泛型编程、元编程和可视化编程等。[2][3]
编程范型提供并决定了程序员对程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象;在函数式编程中,一个程序会被看作是一个无状态的函数计算的序列。范式沿着编程的不同维度被划分和描述:有些涉及执行模型的推论(如是否允许副作用),有些涉及代码的组织方式(如将状态和行为分组到单元中),还有些涉及语法和文法。
概述
[编辑]正如软件工程中不同的群体会提倡不同的“方法论”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的,如Smalltalk和Java支持面向对象编程,而Haskell和Scheme则支持函数式编程;同时还有另一些语言支持多种范型,如Ruby、Common Lisp、Python、Rust等。[4]
指令式范型的语言有两个主要特征:它们陈述操作发生的顺序,并通过显式控制该顺序的结构来允许副作用,即状态可以在某个时间点被修改,然后在稍后的时间点被另一代码单元读取。[5]相反,声明式范型的语言不指定操作的执行顺序,而是提供系统内可用操作的集合以及每种操作被允许执行的条件。许多编程范型既以它们支持的技巧著称,也以它们禁止的技巧著称。例如,纯函数式编程不允许副作用,结构化编程不允许使用goto。由于这个原因,新的范型常常被习惯于较早风格的人视为教条主义或过分严格。然而,避免某些技巧反而使理解程序行为和证明程序正确性更为容易。[6]
编程范型和编程语言之间的关系可能十分复杂,因为一个编程语言可以支持多种范型。例如,C++设计时支持过程式编程、面向对象编程以及泛型编程。然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用 C++ 写出一个完全过程化的程序,另一个人也可以用 C++ 写出一个纯粹的面向对象程序,甚至还有人可以写出杂糅了两种范型的程序。
历史
[编辑]不同的编程方法随着时间的推移而发展。关于每种方法的分类,有些在方法首次出现时就被描述,但更多是在事后才被回顾性地认识。早在20世纪60年代中期,结构化编程就被作为第一种被自觉识别的编程方法加以倡导。[7]
"编程范型"这个概念本身至少可以追溯到1978年:当时罗伯特·弗洛伊德在其图灵奖演讲《编程的范型》中,引用了托马斯·库恩在《科学革命的结构》(1962)中使用的"范式"概念来讨论编程方法。[8]早期的编程语言没有明确定义的编程范型,有时程序大量使用goto语句,其自由使用导致了难以理解和维护的意大利面条式代码。这推动了结构化编程范型的发展,该范型禁止使用goto语句,只允许使用更结构化的编程构造。[7]
批评
[编辑]一些编程语言研究者批评将范式作为编程语言分类的概念。罗伯特·哈珀认为,许多编程语言不能严格地被归类为单一范式,而是包含了多种范型的特征。[9]什里拉姆·克里希纳穆尔蒂则指出,编程语言教育已进入"后林奈时代",即语言不再能够被简单地划分到互斥的分类中去。[10]参见多重编程范型和多范型编程语言比较。
语言与方法
[编辑]过程式语言
[编辑]过程式语言,也称为第三代编程语言,是第一批被描述为高级语言的语言。它们使用与待解问题相关的词汇。例如,FORTRAN使用数学语言术语,主要针对科学和工程问题;COBOL使用面向商业的术语;C语言是一种通用的过程式编程语言,由丹尼斯·里奇于1969至1973年在贝尔实验室开发。这些语言直接控制计算机程序遵循的逐步过程,其效能和效率高度依赖于程序员的技能。[7]
面向对象编程
[编辑]面向对象编程(OOP)语言是在过程式语言基础上发展起来的,如Simula、Smalltalk、C++、Java和C#等。在这些语言中,数据和操作数据的方法位于同一代码单元——对象之中。这种封装确保访问数据的唯一途径是通过包含该数据的对象的方法,因此对象的内部实现可以更改而不影响使用该对象的代码。关于OOP范式相较过程式范式的有效性存在争议,一些批评者将OOP与软件膨胀联系起来。[11]
声明式语言
[编辑]声明式编程描述问题是什么,而非如何解决。程序被构造为要在预期结果中找到的一组属性,而非一个待遵循的过程。[12]声明式语言的原型包括SQL(第四代语言)以及函数式语言和逻辑编程语言家族。函数式编程是声明式编程的子集,程序使用意图行为类似数学函数的代码块,避免通过赋值改变变量值,大量使用递归代替循环。逻辑编程将计算视为对知识体系的自动推理——关于问题领域的事实被表达为逻辑公式,程序通过应用推理规则来执行,直到找到问题的答案。
其他范式
[编辑]符号编程范式使程序能够将公式和程序组件作为数据进行操作,程序可以有效地修改自身,适用于人工智能、专家系统和自然语言处理等领域,支持该范式的语言包括Lisp和Prolog。[3]可微分编程将程序结构化以便在整个程序中进行自动微分,是深度学习框架的基础。[13]文学编程将程序结构化为以人为中心的网状结构,文档是程序的组成部分。
参见
[编辑]參考文献
[编辑]- ^ Multi-Paradigm Programming Language. Mozilla Developer Network. Mozilla Foundation. Jun 21, 2013. (原始内容存档于21 August 2013) (英语).
- ^ Nørmark, Kurt. Overview of the four main programming paradigms. Aalborg University. 9 May 2011 (英语).
- ^ 3.0 3.1 Covington, Michael A. CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP (PDF). University of Georgia. 2010-08-23. (原始内容 (PDF)存档于2012-03-07) (英语).
- ^ Van Roy, Peter. Programming Paradigms: What Every Programmer Should Know (PDF). 2009-05-12 (英语).
- ^ Programming paradigms: What are the principles of programming?. IONOS Digitalguide. 20 April 2020. (原始内容存档于Jun 29, 2022) (英语).
- ^ Rubin, Frank. 'GOTO Considered Harmful' Considered Harmful. Communications of the ACM. March 1987, 30 (3): 195–196. doi:10.1145/214748.315722 (英语).
- ^ 7.0 7.1 7.2 Soroka, Barry I. Java 5: Objects First. Jones & Bartlett Learning. 2006. ISBN 9780763737207 (英语).
- ^ Floyd, R. W. The paradigms of programming. Communications of the ACM. 1979, 22 (8): 455–460. doi:10.1145/359138.359140 (英语).
- ^ Harper, Robert. What, if anything, is a programming paradigm?. FifteenEightyFour. Cambridge University Press. 1 May 2017 (英语).
- ^ Krishnamurthi, Shriram. Teaching programming languages in a post-linnaean age. ACM SIGPLAN Notices. November 2008, 43 (11): 81–83. doi:10.1145/1480828.1480846 (英语).
- ^ Mode inheritance, cloning, hooks & OOP (Google Groups Discussion) (英语).
- ^ Coenen, Frans. Characteristics of declarative programming languages. 1999-10-11. (原始内容存档于2014-02-27) (英语).
- ^ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark. Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming (PDF). Advances in Neural Information Processing Systems 31. 2018: 10201–10212 (英语).