编程范式

编程范式是一种根据其功能对编程语言进行分类的方式。语言可以分为多个范式。

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

一些常见的编程范例是,

  • 程序员指导机器如何改变状态的势在必行
  • 陈述性程序员仅声明所需结果的属性,而不是如何计算它
    • 功能,其中所需结果被声明为一系列函数应用的值,
    • 逻辑将所需结果声明为有关事实和规则制度的问题的答案,
    • 用数据流声明所需结果的反应性和变化的传播

允许程序引用自己的反射符号技术也可能被视为编程范式。但是,这与主要范式兼容,因此本身并不是真正的范式。

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

概述

根据彼得·范·罗伊(Peter Van Roy)的概述

就像软件工程(作为一个过程)由不同的方法论定义一样一样,编程语言(作为计算模型)是由不同的范式定义的。某些语言旨在支持一种范式( SmallTalk支持面向对象的编程, Haskell支持功能编程),而其他编程语言支持多个范式(例如Object PascalC ++Java ,Java,JavaScript, JavaScriptC# ,C#,C# ,Scala, ScalaVisual Lisp ,Commun Lisp,常见的LISP LISP , ,方案PerlPHPPythonRubyOzF# )。例如,用C ++,对象Pascal或PHP编写的程序可以纯粹是程序性的,纯粹是面向对象的,也可以包含两个或其他范式的元素。软件设计人员和程序员决定如何使用这些范式元素。

在面向对象的编程中,程序被视为一组交互对象。在功能编程中,程序被视为一系列无状态功能评估。在以流程为导向的编程中编程计算机或系统时,将程序视为对逻辑共享数据结构作用的并发过程集。

许多编程范例也以其所禁止的技术而闻名。例如,纯粹的功能编程不使用副作用的使用,而结构化的编程删除了对goto语句的使用。因此,部分原因是,新范式通常被习惯于早期样式的人视为教义或过于僵化。但是,避免某些技术可以使了解程序行为更容易,并证明有关程序正确性的定理

编程范例也可以与编程模型进行比较,该模型允许仅使用API​​调用执行模型。编程模型也可以根据执行模型的功能分类为范例。

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

批评

一些编程语言研究人员批评范式的概念是对编程语言的分类,例如哈珀和克里希纳尔蒂。他们认为,许多编程语言不能严格地分为一个范式,而是包括几种范式的功能。请参阅多范式编程语言的比较

历史

随着时间的推移,各种编程方法已经发展出来,当时或回顾性地被确定为这样。自1960年代中期以来,一种有意识地确定的早期方法是结构化的编程。 “编程范式概念至少可以追溯到1978年。革命(1962)。早期的编程语言没有明确定义的编程范式,有时节目广泛使用了goto语句,自由使用这些陈述会导致“意大利面条代码”,这很难使用。这导致开发结构化的编程范例,这些范式不允许使用goto语句,并且只允许使用明确定义的编程结构。

机器代码

最低级别的编程范例是机器代码,它直接代表指令(程序内存的内容)作为数字序列,并且可以给出符号标签的机器指令表示的汇编语言。这些有时被称为第一代第二代语言。

在1960年代,开发了汇编语言来支持库副本和相当复杂的有条件宏观生成和预处理能力,请致电(子例程),外部变量和常见部分(全球),启用大量的代码重复使用,并通过通过硬件具体方式通过硬件细节隔离使用逻辑运算符,例如读/写入/put。组装曾经并且仍然用于时间关键系统,并且通常用于嵌入式系统,因为它可以最直接地控制机器的作用。

程序语言

下一个进步是制定程序语言。这些第三代语言(第一种被描述为高级语言)使用与解决问题有关的词汇。例如,

  • 普通业务导向语言( COBOL ) - 使用诸如文件移动复制之类的术语。
  • 公式翻译( FORTRAN ) - 使用数学语言术语,主要用于科学和工程问题。
  • 算法语言( Algol ) - 专注于定义算法的适当语言,同时使用数学语言术语,针对科学和工程问题,就像Fortran一样。
  • 编程语言One( PL/I ) - 一种支持指针的混合商业科学通用语言。
  • 初学者全目的符号指令代码(基本) - 它的开发是为了使更多的人编写程序。
  • C - 一种通用编程语言,最初由Dennis Ritchie在1969年至1973年的AT&T Bell Labs开发。

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

面向对象的编程

在广泛使用程序语言之后,创建了面向对象的编程(OOP)语言,例如SimulaSmallTalkC ++Eiffel ,Eiffel, Python ,Python, Php ,Java, JavaC# 。在这些语言中,操纵其作为一个称为对象的单元保存的数据和方法。通过完美的封装,OOP的区别特征之一,另一个对像或用户能够通过对象的方法访问数据的唯一方法。因此,可以更改对象的内部工作,而不会影响任何使用对象的代码。关于OOP范式与程序范式的功效, Alexander StepanovRichard Stallman和其他程序员仍然存在一些争议。每个对象具有关联方法的需求会导致一些怀疑论与软件膨胀相关联。试图解决这一困境的尝试是通过多态性的

由于面向对象的编程被认为是一种范式,而不是语言,因此甚至可以创建面向对象的汇编器语言。高级组装(HLA)就是一个例子,尽管它起源于早期,但完全支持高级数据类型和面向对象的汇编语言编程。因此,可以看出不同的编程范式就像其拥护者的动机模因,而不是一定代表从一个层面到下一个层面的进步。由于应用于类似实体和过程的新术语以及跨语言的许多实施区别,因此经常使竞争范式的效力的精确比较变得更加困难。

进一步的范式

识字编程作为命令编程的一种形式,将程序以人为本的网络结构,就像超文本论文中:文档是该程序不可或缺的,并且该程序是按照散文博览会的逻辑而不是编译器便利性构建的。

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

功能编程是声明性编程的子集。使用此范式编写的程序使用功能,旨在像数学功能一样行为的代码块。功能语言通过分配来阻止变量的价值变化,而是大量使用递归

逻辑编程范式将计算视为自动推理,而不是知识体系。有关问题域的事实表示为逻辑公式,并且通过对其进行推理规则执行程序,直到找到问题的答案,或者证明了一组公式不一致。

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

可区分的编程结构程序,以便通常通过自动差异化可以在整个过程中进行区分

支持多个范式

大多数编程语言都支持多个编程范式,以允许程序员使用最合适的编程样式和相关的语言构造来给定作业。

也可以看看