有心学习编程范式,在google找到这个连载系列,作者是郑晖博士,原文地址冒号课堂。
这个教程采用多人对话交流的方式呈现,读起来轻松有趣,同时知识和精神传达的也非常丰富、到位。原文信息量很大,以下是我边看边整理的笔记和摘要。
编程语言发展史:
第一代语言(1GL):机器语言
第二代语言(2GL):汇编语言——IA-32 Assembly,SPARC Assembly等
第三代语言(3GL):高级语言——Fortran,Pascal,C,Java,VB等
第四代语言(4GL):面向问题语言——SQL,SAS,SPSS等 (领域特定语言,简称DSL。注重描述)
第五代语言(5GL):人工智能语言——Prolog,Mercury,OPS5等 (通用化)
编程范式:
- 所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。”
- 我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。
- 编程范式代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。任何语言在设计时都会倾向某些范式、同时回避某些范式,由此形成了不同的语法特征和语言风格。
- 框架就是一组协同工作的类或函数,它们为特定类型的软件构筑了一个可重用的设计。与库和工具包不同之处在于前者侧重设计重用而后两者侧重代码重用。一个足够复杂的应用软件开发,为确保快速有效,通常采取的方式是:在宏观管理上选取一些框架以控制整体的结构和流程;在微观实现上利用库和工具包来解决具体的细节问题。框架的意义在于使设计者在特定领域的整体设计上不必重新发明轮子;库和工具包的意义在于使开发者摆脱底层编码,专注特定问题和业务逻辑。库和工具包是为程序员带来自由的,框架是为程序员带来约束的。
- 设计模式(design pattern)和架构(architecture)不是软件产品,而是软件思想。设计模式是软件的战术思想,架构是软件的战略决策。设计模式是针对某些经常出现的问题而提出的行之有效的设计解决方案,它侧重思想重用,因此比框架更抽象、更普适,但多限于局部解决方案,没有框架的整体性。与之相似的还有惯用法(idiom),也是针对常发问题的解决方案,但偏重实现而非设计,与实现语言密切相关,是一种更底层更具体的编程技巧。至于架构,一般指一个软件系统的最高层次的整体结构和规划,一个架构可能包含多个框架,而一个框架可能包含多个设计模式。
重要范式:
- 命令范式:其世界观是:程序是由若干行动指令组成的有序列表;其方法论是:用变量来储存数据,用语句来执行指令。
- 例:大多数语言、命令行。C。
- 强调怎么做。
- 结构化编程:根据结构化定理(structured program theorem)[2],任何程序都可用顺序(concatenation)、选择(selection)和循环(repetition)等三种基本控制结构来表示。
- 声明范式:命令式编程是行动导向的,因而算法是显性而目标是隐性的;声明式编程是目标驱动的,因而目标是显性而算法是隐性的。主要包括函数式编程(functional programming,简称FP)和逻辑式编程(logic programming,简称LP)。
- 例:Lisp Haskell Scheme Prolog
- 强调做什么。
- 其中的变量也如数学中的一样,是抽象符号而非内存地址,因此没有赋值运算,不会产生变量被改写的副作用(side-effect),也不存在内存分配和释放的问题。命令范式中,变量是内存的抽象。命令式语言提倡迭代而不鼓励递归。命令式、函数式和逻辑式是最核心的三种范式。
范式 | 程序 | 输入 | 输出 | 程序设计 | 程序运行 |
---|---|---|---|---|---|
命令式 | 自动机 | 初始状态 | 最终状态 | 设计指令 | 命令执行 |
函数式 | 数学函数 | 自变量 | 因变量 | 设计函数 | 表达式变换 |
逻辑式 | 逻辑证明 | 题设 | 结论 | 设计命题 | 逻辑推理 |
- 对象范式:以数据为中心组织逻辑,将系统视为相互作用的对象集合,并利用继承与多态来增强可维护性、可扩展性和可重用性。OOP则正相反,以数据为中心,自底向上、逐步合并。它更接近人类的认知模式。
- 例:java
- 强调抽象。
- OOP大多是命令式的,但也有函数式的和逻辑式的OO语言。
- 并发式编程:以进程为导向(Process-Oriented)、以任务为中心将系统模块化。并发式的模拟比对象式的模拟更贴近世界。
- 例:erlang
- 强调资源的竞争、合作。
-
为便于记忆,我们不妨用‘一二三四五’来概括编程范式之最:最传统的
一个
是命令式;最基本的
两个
是命令式和声明式;最核心的
三个是
命令式、函数式和逻辑式;最主要的
四个
是命令式、函数式、逻辑式和对象式;最重要的
五个
是命令式、函数式、逻辑式、对象式和并发式。最后,我们来对比一下五大范式。”
范式 | 体系 | 模块 | 模块关系 |
---|---|---|---|
过程式 | 君主体系 | 过程 | 授命与听命 |
函数式 | 数学体系 | 函数 | 替换与合成 |
逻辑式 | 逻辑体系 | 断言 | 归纳与演绎 |
对象式 | 民主体系 | 对象 | 交流与服务 |
并发式 | 生产体系 | 进程 | 竞争与合作 |
(未完待续)