Back to Programming Languages

See Also CJavaPython

Programming Paradigm

Programming Paradigm(编程范式/范型) 也许是学习任何一门编程语言时要理解的最重要的术语。是指 编程语言 典型的编程风格。如:函数式编程程序编程指令式编程面向对象编程等等,均为不同的编程范型。面向对象编程(OOP)常常被誉为是一种革命性的思想,正因为它不同于其他的各种编程范式。随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm: ['pærə'daɪm] n. A paradigm is a model for something that explains it or shows how it can be produced.)以及编程范式等术语渐渐出现在人们面前。

编程范型提供了(同时决定了)程序员对程序执行的看法。

1. Overview

正如软件工程中不同的群体会提倡不同的方法论一样,不同的编程语言也会提倡不同的“编程范式”。一些语言是专门为某个特定的范式设计的(如Smalltalk和Java支持面向对象编程,而Haskell和Scheme则支持函数式编程),同时还有另一些语言支持多种范式(如C++、Java、PHP、Ruby、Common Lisp、Python和Oz)。例如,C++设计时,支持过程化编程、面向对象编程以及泛型编程。然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用C++写出一个完全过程化的程序,另一个人也可以用C++写出一个纯粹的面向对象程序,甚至还有人可以写出杂揉了两种范式的程序。

在面向对象编程中,程序员认为程序是一系列相互作用的对象;在函数式编程中,程序又会被看作是一个无状态的函数计算的序列;在面向过程的编程中(适用于多核计算),程序被看做为是在逻辑上共享数据结构的并发进程。

很多编程范型已经被熟知他们禁止使用哪些技术,同时允许使用哪些。例如,纯粹的函数式编程不允许有副作用;结构化编程不允许使用goto。可能是因为这个原因,新的范型常常被那些习惯于较早的风格的人认为是教条主义或过分严格。然而,这样避免某些技术反而更加证明了关于程序正确性——或仅仅是理解它的行为的法则,而不用限制程序语言的一般性。

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

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

programming_paradigms.svg.png

2. History

The concept of a "programming paradigm" as such dates at least to 1978, in the Turing Award lecture of Robert W. Floyd, entitled The Paradigms of Programming, which cites the notion of paradigm as used by Thomas Kuhn in his The Structure of Scientific Revolutions (1962).

1962年托马斯.库恩提出“结构科学的革命”的范式论之后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词。

2.1. Machine code

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

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

2.2. Procedural languages

面向过程的语言,又被称作第三代语言。如Cobol、Fortran、BASIC和C等。

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

2.3. Object-oriented programming

2.3.1. 规则范式

学科的逻辑体系,包括以下机制

2.3.2. 心理范式

心理认知因素,即按照面向对象编程之父Alan Kay的观点,“计算就是模拟”。

OO范式极其重视隐喻(metaphor)的价值,通过拟人化,按照自然的方式模拟自然。

2.3.3. 观念范式

强调程序的组织技术,视程序为松散耦合的对象/类的集合,以继承机制将类组织成一个层次结构,把程序运行视为相互服务的对象们之间的对话。

2.4. Further paradigms

2.4.1. Declarative Programming Paradigms

Donald Knuth 发明了一种程序设计方法叫做 Literate Programming (文学编程) 把程序当成文学作品来写。这是Imperative([ɪm'pɛrətɪv] adj. 必要的;紧急的;命令的) Programming(命令式编程)的一个分支。

声明式编程范例。 在这些语言中,计算机被告知问题是什么,而不是如何解决问题 - 程序被结构化为一组属性,以便在预期的结果中查找,而不是按照程序进行。 给定一个数据库或一组规则,计算机尝试找到一个匹配所有所需属性的解决方案。

声明语言的原型是第四代语言SQL,以及功能语言和逻辑语言系列。其中功能语言也是命令式编程的一个分支。

2.4.2. Logic Programming Paradigms

逻辑编程范例将计算视为一种知识体系的自动推理。

关于问题域的事实表示为逻辑公式,程序通过对它们应用推理规则来执行,直到发现问题的答案,或者该组公式被证明是不一致的。

2.4.3. Symbolic Programming Paradigms

符号编程范例用来描述能够操作公式和程序组件作为数据的程序。

因此,程序可以有效地修改自己,并且似乎“学习”,使其适用于人造智能,专家系统,自然语言处理和电脑游戏等应用。 支持此范例的语言包括Lisp和Prolog。

3. 主要常见范式

范式是对语言类型的一种描述方式,二者是两个不同的范畴,但的确有一些编程语言是专门为某种特定范式设计的,例如,C语言是过程式编程语言;Smalltalk和Java是较纯粹的面向对象编程语言;Haskell、Scheme、Clojure是函数式编程语言。

4. Reference

MainWiki: Programming_Paradigm (last edited 2009-11-27 03:18:30 by twotwo)