编程范式

编程范式-摘自https://en.wikipedia.org/wiki/Programming_paradigm

维基百科,自由的百科全书
 
 
跳转到导航跳转到搜索

编程范例是一种根据编程语言的特性编程语言进行分类的方法语言可以分为多种范例。

一些范例主要涉及对语言执行模型影响,例如允许副作用,或者操作序列是否由执行模型定义。其他范例主要关注代码的组织方式,例如将代码分组为单元以及代码修改的状态。还有一些人主要关注语法和语法的风格。

常见的编程范例包括:[1] [2] [3]

  • 程序员指示机器如何改变其状态的必要性
    • 程序这组指令转换成程序,
    • 面向对象的,它将指令与它们所处的状态部分组合在一起,
  • 声明中,程序员只声明了期望的结果的性质,但不知道如何计算它
    • 功能,其中所期望的结果被声明为一系列功能应用的价值,
    • 将所需结果声明为关于事实和规则系统的问题的答案的逻辑
    • 数学,其中所需结果被声明为优化问题的解决方案

允许程序引用自身的符号技术(如反射)也可以被视为编程范例。然而,这与主要范例兼容,因此本身并不是真正的范例。

例如,属于命令范式的语言有两个主要特征:它们表明操作发生的顺序,显式控制该顺序的结构,并且它们允许副作用,其中状态可以在一个时间点被修改,在一个代码单元内,然后在不同的代码单元内的不同时间点读取。代码单元之间的通信不明确。同时,在面向对象的编程中,代码被组织成包含状态的对象,该状态仅由作为对象一部分的代码修改。大多数面向对象的语言也是命令式语言。相比之下,语言符合声明范式不要说明执行操作的顺序。相反,它们提供系统中可用的许多操作,以及允许每个操作执行的条件。语言执行模型的实现跟踪哪些操作可以自由执行并自行选择顺序。更多 关于多范式编程语言的比较

概述编辑]

 
根据Peter Van Roy的各种编程范例概述[4][5]

正如软件工程(作为一个过程)由不同的方法定义一样编程语言(作为计算模型)也是由不同的范例定义的有些语言旨在支持一种范式(Smalltalk支持面向对象编程,Haskell支持函数式编程),而其他编程语言支持多种范式(如Object PascalC ++JavaC#ScalaVisual BasicCommon LispSchemePerlPHPPythonRubyWolfram语言OzF#)。例如,用C ++,Object Pascal或PHP编写的程序可以纯粹是程序性的,纯粹是面向对象的,或者可以包含两者或其他范例的元素。软件设计者和程序员决定如何使用这些范例元素。

在面向对象的编程中,程序被视为一组交互对象。函数式编程中,程序被视为一系列无状态函数评估。当编程具有许多处理器的计算机或系统时,在面向过程的编程中,程序被视为作用于逻辑共享数据结构的并发进程集

许多编程范式是众所周知的,他们的技术禁止为那些他们启用例如,纯函数式编程不允许使用副作用,而结构化编程则不允许使用goto语句。部分由于这个原因,新范式通常被习惯于早期风格的人视为教条主义者或过度刻板。[6]然而,避免使用某些技术可以更容易理解程序行为,并证明程序正确性的定理

编程范例也可以与允许仅使用API 调用执行模型编程模型进行比较基于执行模型的特征,编程模型也可以被分类为范例。

对于并行计算,使用编程模型而不是语言是常见的。原因是并行硬件的细节泄漏到用于编程硬件的抽象中。这导致程序员必须将算法中的模式映射到执行模型中的模式(由于硬件泄漏到抽象中而插入)。因此,没有一种并行编程语言可以很好地映射到所有计算问题。因此,通过编程模型使用基本顺序语言并将API调用插入到并行执行模型中更方便。这种并行编程模型可以根据反映硬件的抽象进行分类,例如共享内存,带消息传递的分布式内存,地方概念在代码中可见,等等。这些可以被认为是仅适用于并行语言和编程模型的编程范例的风格。

批评编辑]

一些编程语言研究人员批评范式概念作为编程语言的分类,例如Harper,[7]和Krishnamurthi。[8] 他们认为许多编程语言不能严格地归为一种范式,而是包含几种范式的特征。请参阅多范式编程语言的比较

历史编辑]

编程的不同方法随着时间的推移而发展,在当时或回顾性地被识别。有意识地确定的早期方法是自20世纪60年代中期以来提倡的结构化编程这种“编程范式”的概念至少可以追溯到1978年,在罗伯特·W·弗洛伊德图灵奖演讲中,题为“编程范式”,其中引用了托马斯库恩在他的科学结构中使用范式的概念。革命(1962年)。[9]

机器代码编辑]

最低级别的编程范例是机器代码,直接表示指令(程序存储器的内容)作为数字序列,和汇编语言,其中所述机器指令由助记符和表示存储器地址可被指定符号的标签。这些有时被称为第一代第二代语言。

在20世纪60年代,汇编语言被开发用于支持库COPY和非常复杂的条件宏生成和预处理能力,CALL到(子例程),外部变量和公共部分(全局变量),通过使用实现重要的代码重用和硬件细节隔离逻辑运算符,如READ / WRITE / GET / PUT。装配过去,现在仍然用于时间关键系统,通常用于嵌入式系统,因为它可以最直接地控制机器的功能。

程序语言编辑]

下一步的进展是程序语言的发展这些第三代语言(首先被描述为高级语言)使用与正在解决的问题相关的词汇。例如,

  • COmmon业务导向语言(COBOL) - 使用文件移动复制等术语
  • FORmula TRANslation(FORTRAN) - 使用数学语言术语,它主要是为科学和工程问题而开发的。
  • ALGOrithmic Language(ALGOL) - 专注于成为定义算法的适当语言,同时使用数学语言术语,针对科学和工程问题,就像FORTRAN一样。
  • 编程语言一(PL / I) - 支持指针的混合商业科学通用语言
  • 初学者全能符号指令代码(BASIC) - 它的开发是为了让更多人能够编写程序。
  • C  - 一种通用编程语言,最初由Dennis Ritchie于1969年至1973年在AT&T贝尔实验室开发

所有这些语言都遵循程序范式。也就是说,他们一步一步地描述了至少应该遵循特定程序员来解决特定问题的程序。因此,任何此类解决方案功效效率都完全是主观的,并且高度依赖于程序员的经验,创造性和能力。

面向对象编程编辑]

随着过程语言的广泛使用,创建了面向对象编程(OOP)语言,例如SimulaSmalltalkC ++C#EiffelPHPJava在这些语言中,操作它的数据和方法被保存为一个称为对象的单元通过完美的封装,OOP的一个显着特征,另一个对象或用户能够访问数据的唯一方法是通过对象的方法因此,可以在不影响使用该对象的任何代码的情况下改变对象的内部工作。还有一些争议,由提出亚历山大·斯捷潘诺夫理查德·斯托曼[10]和其他程序员,关于OOP范式与程序模式的功效。每个对象都需要有关联方法,这使得一些怀疑论者将OOP与软件膨胀联系在一起通过多态性来解决这种困境的尝试

因为面向对象编程被认为是范式而不是语言,所以甚至可以创建面向对象的汇编语言。高级程序集(HLA)就是一个例子,它完全支持高级数据类型和面向对象的汇编语言编程 - 尽管它起源较早。因此,可以看到不同的编程范式,而不是他们的倡导者的动机模因,而不是必然代表从一个级别到下一个级别的进展需要的引证 ]由于新的和不同的术语适用于类似的实体和过程以及跨语言的众多实现区别,因此对竞争范例的功效的精确比较经常变得更加困难。

进一步的范例编辑]

文学编程作为一种命令式编程形式,将程序构建为以人为中心的网络,如在超文本文章中:文档是程序不可或缺的一部分,程序的结构遵循散文阐述的逻辑,而不是编译器的便利性。

独立于命令式分支,开发了声明性编程范例。在这些语言中,计算机被告知问题是什么,而不是如何解决问题 - 程序被构造为一组属性以在预期结果中找到,而不是作为要遵循的过程。给定数据库或一组规则,计算机尝试找到匹配所有所需属性的解决方案。声明性语言的原型是第四代语言 SQL,以及函数式语言和逻辑编程系列。

函数式编程是声明式编程的一个子集。使用此范例编写的程序使用函数,旨在表现为数学函数的代码块函数式语言不鼓励通过赋值改变变量的值,而是大量使用递归

逻辑编程范式的意见作为计算自动推理对知识的身体。关于问题域的事实表示为逻辑公式,并且通过对它们应用推理规则来执行程序,直到找到问题的答案,或者证明公式集不一致。

符号编程是一种范例,描述了能够将公式和程序组件作为数据进行操作的程序。[3] 因此,程序可以有效地修改自己,并且似乎“学习”,使它们适用于人工智能专家系统自然语言处理和计算机游戏等应用程序。支持这种范式的语言包括LispProlog[11]

可区分的编程结构程序使得它们可以在整个过程中进行区分,通常是通过自动区分[12] [13]

 

posted @   陶朱公Boy  阅读(330)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-08-28 Spring Boot中初始化资源的几种方式
点击右上角即可分享
微信分享提示