编程范式与语言

这篇文章是应“编程新思路”COP小组之邀,对编程范式做一个专题分享。主要是自己在读书、学习、工作上的一些心得总结,能力有限,希望能抛砖引玉,一同探讨。

为什么要了解编程范式和语言

到目前为止,世界上约有2500种程序设计语言,其中一部分的族谱关系如下。

语言从世界观上思考和影响软件设计,不同范式看待设计的角度也迥然不同,比如命令范式语言以状态(变量)抽象现实世界,对象范式语言以对象对象现实世界,函数范式语言以计算(函数)抽象现实时间。对现实问题的不同观察视角,从根本上影响软件开发者的思考方式和对软件设计的认识。

编程语言的产生和流行都有其时代背景,比如,

在早期机器语言开发的低效率之下,需要更高效率的程序语言,结构化设计思想应运而生,这一阶段命令范式语言大放异彩,以C语言为杰出代表;

随后,大规模软件开发项目死亡率之高,让人们重新思考总结软件设计原则和思想,这时候面对对象设计思想脱颖而出,命令范式语言无法实践这些新的软件设计理念,新语言的产生势在必然,这一段大量的对象范式语言涌现,其中C++、Java语言的接受度最为广泛;

后来随着多核CPU的推广和分布式计算应用场景问题的涌现,为了将程序员从复杂的并发管理的焦油坑中解救出来,要求语言能提供一种合适的抽象机制对并发场景进行描述,这时候函数范式和并发方式终于吸引了众人的目光,成为聚光灯下的宠儿,这其中erlang、golang语言的关注度最高;

然后,又发现在某些特定应用领域,通用语言无法完美地在问题域的抽象层次上进行描述,针对不同的问题域,产生了大量的特定领域语言。由于DSL比通用语言更简单、更抽象、更专业、更接近自然语言,开发效率显著提高。此外尤为关键的是,这种方式填补了专业程序员与业务分析员之间的鸿沟。

但是随着软件规模越来越大,需求越来越多,变更越来越快,为了管理快速膨胀的软件复杂度,大量的语言、设计模式和框架涌现。面对这些新知识时,我们常常感到困惑:0)为什么有这么多新语言、新设计模式、新框架?1)如何快速的学习、掌握这些新语言、设计模式和框架,它们背后是否存在更普遍性的规律?2)基于A语言(如Java,Erlang)特性的设计模式如何借鉴并运用到B语言(如C)上?

从抽象语义的角度看,设计模式、框架、库都是语言的一种外延,说的苛刻点,这些都是弥补语言缺陷的补丁。比如对于动态类型语言,类型像变量一样使用,很多创建型设计模式就没用了。对于函数式语言,函数像变量一样使用,很多行为设计模式就没用了。

通过深度学习编程范式和语言设计,才能拨开繁杂的设计模式迷雾,从语言的本源来了解软件设计的本质和解决问题的思想和方法,让我们快速把握语言的脉络,进而提高我们软件设计的能力和语感,加深理解设计模式、框架的意义。

编程范式的差异

编程范式的核心价值在于:突破原有的编程方式的某些限制,带来新思维和新方法,从而进一步解放程序员的劳动力。
编程范式汇总表格如下:

过程式编程世界观是:程序是由若干行动指令组成的有序列表;其方法论是:用变量来储存数据,用语句来执行指令,其设计思想就是结构化设计。擅长于面向用户的,交互性强、多为事件驱动、业务逻辑复杂的应用。

函数式和逻辑式语言擅长基于数理逻辑的应用,如并发、人工智能、符号处理、数据库、编译器等。函数式编程中的高阶函数与基本数据类型平起平坐,故可将代码作数据用,这是程序既简洁又强大的原因之一。回调机制采用的正是函数式风格。

对象式虽然是在命令式的基础上发展起来的,其本质就是将相关的函数用数据粘合,重新包装后再贴上对象的标签。对象式以对象为基本模块单位,而对象是现实中具体事物和抽象概念的模拟,它更接近人类的认知模式,编程者更容易也更乐于用这种方式编程。过程式编程的理念是以过程为中心,自顶向下、逐步求精。对象式则正相反,以数据为中心,自底向上、逐步合并。

并发式编程以进程为导向 (Process-Oriented)、以任务为中心将系统模块化。

编程范式举例:

策略模式

python对象式实现

class Bisection (FindMinima):
        def algorithm(self,line):
                return (5.5,6.6)
class ConjugateGradient (FindMinima):
        def algorithm(self,line):
                return (3.3,4.4)
class MinimaSolver: # context class
        strategy=‘‘
        def __init__ (self,strategy):
                self.strategy=strategy
        def minima(self,line):
                return self.strategy.algorithm(line)
        def changeAlgorithm(self,newAlgorithm):
                self.strategy = newAlgorithm
def test():
        solver=MinimaSolver(ConjugateGradient())
        print solver.minima((5.5,5.5))
        solver.changeAlgorithm(Bisection())
        print solver.minima((5.5,5.5))

python函数式实现

def bisection(line):
    return 5.5, 6.6
def conjugate_gradient(line):
    return 3.3, 4.4
def test():
    solver = conjugate_gradient
    print solver((5.5,5.5))
    solver = bisection
    print solver((5.5,5.5))

快排

C过程式实现

void quickSort(int* arr,int startPos, int endPos)
{
    int i,j;
    int key;
    key=arr[startPos];
    i=startPos;
    j=endPos;
    while(i<j)
    {
        while(arr[j]>=key && i<j)--j;
        arr[i]=arr[j];
        while(arr[i]<=key && i<j)++i;
        arr[j]=arr[i];
    }
    arr[i]=key;
    if(i-1>startPos)
        quickSort(arr,startPos,i-1);
    if(endPos>i+1)
        quickSort(arr,i+1,endPos);
} 

erlang函数式实现

qsort([]) -> [];

qsort([H|T])->
    qsort([LO || LO <- T, LO < H]) ++ [H] ++ qsort([HI || HI <- T, HI >= H]).

编程语言的共性 

 

上一节,我们从宏观角度上看语言,从2500种语言中总结出5种主要的编程范式。那么从微观角度看语言,是否也可以从2500种语言中,找出共性呢?答案是肯定的。

有一种观点:软件 = 数据 + 算法。数据通过数据类型来描述,算法通过控制来描述,所以不管语言如何层出不穷,所有语言的设计离不开2个基本面:控制流和数据类型。并且为了提升其描述能力,提供了控制抽象和数据抽象。这是一个宏大的话题,这里就不展开说,下面这张脑图基本涵盖了语言设计中控制流、控制抽象、数据类型和数据抽象的核心问题和实现手段。

参考资料:

1. 《冒号课堂》

2. 《程序设计语言--实践之路》第三版

-- EOF--

时间: 2024-08-01 05:22:43

编程范式与语言的相关文章

再谈编程范式—程序语言背后的思想

编程范式 托马斯.库尔提出“科学的革命”的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP为例: 1,学科的逻辑体系——规则范式:如 类/对象.继承.动态绑定.方法改写.对象替换等等机制. 2,心理认知因素——心理范式:按照面向对象编程之父Alan Kay的观点,“计算就是模拟”.OO范式极其重视隐喻(metaphor)的价值,通过拟人化,按照自然的方式模拟自然. 3,自然观/世界观——观念范式:强调程序的组织技术,视程序为松

聊聊编程范式

编程语言有很多种流派和思想,有一些编程语言同时支持多种编程范式. 静态类型编程范式 采用静态类型编程范式的编程语言,其变量需要明确指定类型.代表语言:C,C++,Pascal,Objective-C,Java,C#,VB.NET,Swif,Golang. 这样做的好处是: 1.编译器可以在编译时就能找出类型错误. 2.编译器编译时知道类型信息,就可以提高性能. 这种范式认为,程序员肯定知道变量的类型,你丫要是不知道变量的类型,那你就别混了!编译时,程序会报错. Swift和Go语言都是静态类型编

【编程范式】C语言1

最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * void Swap (void * lhs,void * rhs,int size) { void * temp = malloc(sizeof(size)); memmove(temp,lhs,sizeof(size)); memmove(lhs,rhs,sizeof(size));  memmove(r

编程范式

编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐渐出现在人们面前.面向对象编程(OOP)常常被誉为是一种革命性的思想,正因为它不同于其他的各种编程范式.编程范式也许是学习任何一门编程语言时要理解的最重要的术语. 托马斯.库恩提出“科学的革命”的范式论之后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三

【冒号课堂】【阅读笔记】编程范式整理

编程范式 命令式/过程式(Imperative/Procedural) 代表语言 Fortran/Pascal/C 核心概念 命令/过程(Command/Procedure) 运行机制 命令执行 关键突破 突破单一主程序和非结构话程序的限制 实现原理 引入逻辑控制与子程序 主要目的 模拟机器思维,实现自顶向下的模块设计 常见应用 交互式.事件驱动型系统.数值计算等 编程范式 函数式/应用式(Functional/Applicative) 代表语言 Scheme/Haskell 核心概念 函数(F

jQuery中的编程范式

浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了如何以前端特有的方式释放程序员的生产力.本文将结合jQuery源码的实现原理,对javascript中涌现出的编程范式和常用技巧作一简单介绍.    1. AJAX: 状态驻留,异步更新      首先来看一点历史. A. 1995年Netscape公司的Brendan Eich开发了javacri

Scala函数式编程设计原理 第一课 编程范式(Programming Paradigms)

我使用Scala有一两年的时间了,这门语言仿佛有一种魔力,让人用过就不想放手.Scala给我的整个程序生涯带来了非常深刻的影响,让我学会了函数式编程,让我知道了世界上居然还有这么一种优雅.高效.强大的语言. Scala在国外已经非常流行,但是不知为何,在国内总是不温不火,在此,我特别想为Scala这门语言在国内的发展做一些事情.不才不敢谈Scala的编程经验,因为要成为Scala大神还有很长的路要走,只好翻译一份Scala视频教程以飨读者,大家发现有误的地方,请多多批评指教. 这个视频的作者是S

函数式编程范式

函数式编程语言有个特点是没有变量,python部分支持函数式编程范式,但不是纯函数式语言. 什么是函数式编程?简单的回答:一切都是数学函数.函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值.函数式编程语言里没有 for/next 循环,因为这些逻辑意味着有状态的改变.相替代的是,这种循环逻辑在函数式编程语言里是通过递归.把函数当成参数传递的方式实现的. 对于为什么要使用函数式编程,这有一个更好的论据,现代的应用程序都会牵涉到多核计算机上的并行运

编程范式,程序员的编程世界观

感谢作者,转载于: http://www.nowamagic.net/librarys/veda/detail/2488 编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式 (Paradigm)以及编程范式等术语渐渐出现在人们面前.面向对象编程(OOP)常常被誉为是一种革命性的思想,正因为它不同于其他的各种编程范式. 编程范式也许是学习任何一门编程语言时要理解的最重要的术语. 托马斯.库