编程范式( Programming paradigm )简介
什么是编程范式( Programming paradigm )
paradigm 表示范式,其含义是做事的方式。那么编程范式就可以理解为如何编程,按照什么样的模式或风格编程。 或者说你使用什么样的世界观来看待问题,是一套方法论用于解决你遇到问题。
与具体编程语言之间的关系
它与具体的编程语言没有直接的联系,既然它是一种风格,那么在任何语言中都可以用这种风格来进行编程。 比如在 Java 是面向对象语言,但是你可以在其中模拟部分函数式编程的风格,用对象来模拟函数。
所谓的某某式编程语言,是它很容易支持用某种范式来编程,比如用 C 语言也可以使用面向对象范式来编程,但是在实际中会感觉很别扭,因为在语言层面是没有对这一范式的支持。
如果一个编程语言支持用一种范式来编程,比如说函数式,那么可以说这种编程语言是函数式语言。
如果一种编程语言只支持一种编程范式,那么它就是纯粹的某某式语言,比如 Haskell 就是纯粹的函数式语言。在现代的编程语言中可能一个语言就满足多个编程范式,比如 Java,它可以是面向对象也可以是面向过程。
编程范式的分类
从宏观上,编程语言可以大致分为两类,一类是命令使,一类是声明式。
命令式 严格规定命令的顺序并改变状态 就是我告诉机器你要怎么做,步骤都给你写好了,你就这么干 声明式 描述我要什么 我告诉机器我要什么,至于你怎么得到这个结果,不关心。常见的声明式语言有 SQL 、HTML、正则表达式语言等,函数式与逻辑式也是声明式的。
从这两方面的对比可以看出,其实声明式更靠近人脑的思维逻辑。
当然这两中编程范式只是在宏观上看,毕竟到了最底层,都是 CPU 执行一个个命令。 可以简单的分类:命令式之外的就是声明式的。
常见的编程范式
既然编程范式是按照某种模式来编程,那么从不同的角度看待问题,那么解决问题的思路也会不同。
过程式
它是命令式的一种,从结构化编程而来,是一种基础的编程范式,它将问题分解为一个一个过程,以从上到下的方式逐步细化,在每个过程中用逻辑指令组织完成特定的功能。
过程式编程语言有:C
面向对象
面向对象可以说是目前很流行的编程范式,它将数据和行为抽象为一个一个对象,对象之间进行通行,利用继承、多态等来增强可维护性、可扩展性和可重用性。
可以说面向对象编程非常符合人们看待问题的方式,所以很容易理解。
面向对象与过程式编程不同,在面向对象中每个对象之间是平等的,每个对象都可以互相发消息,但是在过程式中,只有上级才能发消息,下级只能被动的响应。
所以在面向对象的设计中,是一个一个对象聚合交互,最终解决问题,就好像从下到上。
面向对象语言: Java 、 Python 、 C++ 、C# 等
函数式
在函数式编程中,类似于数学中的函数,它将问题看成一系列表达式,通过一列的变换最终获得结果。所以函数编程中,其程序是由一系列函数经过组合执行构成的,在其中函数是绝对的核心(一等公民),类似于面向对象中的对象:
在任意的地方创建
作为入参
作为返回值
作为属性
。。。
想象数学中的函数 y=f(x)
, 对于特定的 x,总会返回特定的 y 值,所以在函数式编程中,对于同一个输入肯定会有相同的输出。这样的好处就是可以将函数任意组合、任意复制而不用担心会有什么副作用。
在函数是编程中也没有全局状态,每个变量都只是在函数的作用域中生效。
函数式语言: JavaScript , Clojure , Scala, Haskell 等
泛型编程
泛型也是一种编程范式,它关注的是将算法与实际的数据类型分离。它是以算法为导向的,以算法为中心,逐渐涉及到的其他内容抽象,扩大算法的适用范围。所以泛型编程的核心是算法抽象。
在泛型编程中,可以泛化的内容不仅仅是数据类型,函数、运算等都可以泛化。
目前有很多语言都支持泛型编程,比如 C++ 、 Java 、Haskell 等。
在 Java 语言中泛型是通过类型擦出来实现的在实际的 JVM 中,并没有泛型对象的存在,只有普通的对象。而在 C++中,泛型是通过模板实现的,每个模板都会实例化不同的类型,可能会造成代码膨胀。
逻辑编程
算法 = 逻辑 + 控制 ,其中逻辑是算法的核心,控制主要用于改善算法的效率。在逻辑编程中程序员只需要表达逻辑之间的关系,而控制交给了编程语言的解释器或编译器执行。
在逻辑编程中没有明显的输入和输出之分,其模拟的是人类的思维逻辑,类似于解决证明题,在机器证明、专家系统、自然语言处理、博弈等人工智能领域如鱼得水,同时在非学术领域的知识管理、智能决策分析等方面也能大显身手。 逻辑编程的要点是将正规的逻辑风格带入计算机程序设计之中。逻辑编程建立了描述一个问题里的世界的逻辑模型。逻辑编程的目标是对它的模型建立新的陈述。通过陈述事实——因果关系。程序自动推导出相关的逻辑。
逻辑编程语言: Prolog
版权声明: 本文为 InfoQ 作者【引花眠】的原创文章。
原文链接:【http://xie.infoq.cn/article/3980bf440984df80a73be12b0】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论