跳转到内容

编程范型

本页使用了标题或全文手工转换
维基百科,自由的百科全书
编程范型
上级分类范式、​代码风格 编辑
话题方面計算機科學 编辑
Stack Exchange標籤https://stackoverflow.com/tags/paradigms 编辑

编程范型编程范式程序设计法(英語:programming paradigm),是软件工程中的一类典型的编程风格,指对计算机程序实现进行概念化和结构化的相对高阶的方式。[1]常见的编程范型包括:指令式编程(及其子类过程式编程面向对象编程)、声明式编程(及其子类函数式编程逻辑编程)、并发编程约束编程数据流编程泛型编程元编程可视化编程等。[2][3]

编程范型提供并决定了程序员程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象;在函数式编程中,一个程序会被看作是一个无状态的函数计算的序列。范式沿着编程的不同维度被划分和描述:有些涉及执行模型的推论(如是否允许副作用),有些涉及代码的组织方式(如将状态和行为分组到单元中),还有些涉及语法文法

概述

[编辑]

正如软件工程中不同的群体会提倡不同的“方法论”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的,如SmalltalkJava支持面向对象编程,而HaskellScheme则支持函数式编程;同时还有另一些语言支持多种范型,如RubyCommon LispPythonRust等。[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)语言是在过程式语言基础上发展起来的,如SimulaSmalltalkC++JavaC#等。在这些语言中,数据和操作数据的方法位于同一代码单元——对象之中。这种封装确保访问数据的唯一途径是通过包含该数据的对象的方法,因此对象的内部实现可以更改而不影响使用该对象的代码。关于OOP范式相较过程式范式的有效性存在争议,一些批评者将OOP与软件膨胀联系起来。[11]

声明式语言

[编辑]

声明式编程描述问题是什么,而非如何解决。程序被构造为要在预期结果中找到的一组属性,而非一个待遵循的过程。[12]声明式语言的原型包括SQL(第四代语言)以及函数式语言和逻辑编程语言家族。函数式编程是声明式编程的子集,程序使用意图行为类似数学函数的代码块,避免通过赋值改变变量值,大量使用递归代替循环。逻辑编程将计算视为对知识体系的自动推理——关于问题领域的事实被表达为逻辑公式,程序通过应用推理规则来执行,直到找到问题的答案。

其他范式

[编辑]

符号编程范式使程序能够将公式和程序组件作为数据进行操作,程序可以有效地修改自身,适用于人工智能专家系统自然语言处理等领域,支持该范式的语言包括LispProlog[3]可微分编程将程序结构化以便在整个程序中进行自动微分,是深度学习框架的基础。[13]文学编程将程序结构化为以人为中心的网状结构,文档是程序的组成部分。

参见

[编辑]

參考文献

[编辑]
  1. ^ Multi-Paradigm Programming Language. Mozilla Developer Network. Mozilla Foundation. Jun 21, 2013. (原始内容存档于21 August 2013) (英语). 
  2. ^ Nørmark, Kurt. Overview of the four main programming paradigms. Aalborg University. 9 May 2011 (英语). 
  3. ^ 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) (英语). 
  4. ^ Van Roy, Peter. Programming Paradigms: What Every Programmer Should Know (PDF). 2009-05-12 (英语). 
  5. ^ Programming paradigms: What are the principles of programming?. IONOS Digitalguide. 20 April 2020. (原始内容存档于Jun 29, 2022) (英语). 
  6. ^ Rubin, Frank. 'GOTO Considered Harmful' Considered Harmful. Communications of the ACM. March 1987, 30 (3): 195–196. doi:10.1145/214748.315722 (英语). 
  7. ^ 7.0 7.1 7.2 Soroka, Barry I. Java 5: Objects First. Jones & Bartlett Learning. 2006. ISBN 9780763737207 (英语). 
  8. ^ Floyd, R. W. The paradigms of programming. Communications of the ACM. 1979, 22 (8): 455–460. doi:10.1145/359138.359140 (英语). 
  9. ^ Harper, Robert. What, if anything, is a programming paradigm?. FifteenEightyFour. Cambridge University Press. 1 May 2017 (英语). 
  10. ^ Krishnamurthi, Shriram. Teaching programming languages in a post-linnaean age. ACM SIGPLAN Notices. November 2008, 43 (11): 81–83. doi:10.1145/1480828.1480846 (英语). 
  11. ^ Mode inheritance, cloning, hooks & OOP (Google Groups Discussion) (英语). 
  12. ^ Coenen, Frans. Characteristics of declarative programming languages. 1999-10-11. (原始内容存档于2014-02-27) (英语). 
  13. ^ 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 (英语).