5代编程语言 ########### .. figure:: https://img.zhaoweiguo.com/knowledge/images/architectures/evolutions/lang_regexp.jpeg 编程语言的发展历程。最初之所以提出第 4 代语言的概念,其目的就是希望非专业程序员也能做应用开发,不过就目前情况来看,这个目的并没有得到很好的实现。 编程范式:: 命令式、声明式(包括了函数式、逻辑式等)、面向对象式、泛型式、并发式、切面式 命令式编程范式 ============== .. note:: 命令式编程范式,主要就是模拟电脑运算的过程。更进一步地来说,是直接模拟目前主流的冯・诺依曼机(Von Neumann Machine)的运算过程,是对冯・诺伊曼机运行机制的抽象。 冯・诺伊曼机的基本特点是,在程序计数器的集中控制下,按顺序依次从内存中获取指令和数据,然后进行执行,因此它是以控制驱动的控制流方式工作的:: 1. 冯・诺依曼机(Von Neumann Machine) 2. 以数据驱动的数据流方式工作的数据流机 3. 以需求驱动的数据流方式工作的归约机 从编程范式的角度来看:: 命令式编程的世界观是:程序是由若干行动指令组成的有序列表; 命令式编程的方法论是:用变量来存储数据,用语句来执行指令 采用命令式编程范式的程序,是由若干行动指令所组成的有序指令列表, 也就是由一系列指明执行顺序的祈使句 ——“先做这,再做那” 所组成,属于行动导向, 强调的是定义问题的解法 —— 即 “怎么做”,因而算法是显性的而目标是隐性的。 从纯粹性的角度来说,命令式编程范式的代表语言为 Fortran、Pascal、C 等。 声明式编程范式 ============== * 声明式编程的世界观是:程序是由若干目标任务组成的有序列表 * 声明式编程的方法论是:用语法元素来描述任务,由解析引擎转化为指令并执行 .. note:: 声明式编程范式,主要是模拟人脑思维的过程。声明式重目标、轻过程,专注问题的分析和表达,而不是算法实现。它不用指明执行顺序,属于目标导向,强调的是定义问题的描述 —— 即 “做什么”,因而目标是显性而算法是隐性的。 从编程范式的角度来看:: 1. 声明式编程的世界观是:程序是由若干目标任务组成的有序列表; 2. 声明式编程的方法论是:用语法元素来描述任务,由解析引擎转化为指令并执行 第 4 代,面向问题的语言,基本上都属于声明式编程范式,而且往往也只支持声明式编程范式 声明式编程的代表语言为 SQL、SAS、SPSS、LaTeX、Regex(即正则表达式)等 声明式编程的代表语言大都是领域特定语言 DSL:: 1. SQL 是专用于解决数据库操作问题的语言 2. SAS 和 SPSS 是专用于解决统计分析问题的语言 3. LaTeX 是专用于解决排版问题的语言 4. Mathematica 是专用于解决科学计算问题的语言 正则表达式(Regex,Regular expression),则是专用于解决文本查找匹配问题的专门语言 .. note:: 声明式编程范式的主要特点就是,重在目标而非过程、重在描述而非实现,以声明式语句直接描述要解决的目标任务,专注于任务的分析和表达。声明式没有专注于处理逻辑和算法实现的过程,它具体的处理逻辑和算法实现是由语言解析引擎来负责的。 .. note:: 通过声明式编程语言所编写的程序,到底是如何实现功能的呢?事实上,这是由语言解析引擎,也就是编译器或解释器,最终通过命令式编程来实现功能的。不过,这仅限于冯・诺依曼机中的编程语言,非冯・诺依曼机中的编程语言就不一定是这样了。声明式编程是建立在命令式编程的基础之上的。这也是声明式编程比命令式编程更为高级、更加简单、更省人工的原因。事实上,正如前面所讲过的,目前基于冯・诺依曼机的几乎所有编程语言都是以命令式编程为基础。 正则表达式的语法元素本质 ======================== .. note:: 正则表达式的语法元素本质上就是程序逻辑和算法 :: 1. 星号量词 “*” 代表的是不定次数循环结构,而前后多个星号量词的嵌套就是多层不定次数循环结构的嵌套 2. 或运算符,也就是竖线 “|” 这个元字符,就是高级语言的处理逻辑 “分支结构” 的体现 3. 用于分组的圆括号 “()”,就相当于高级语言的作用域。 正则表达式的基本语法结构与一般高级编程语言差不多:: 主要就是 1. 顺序结构(也称为连接结构) 2. 分支结构(也称为选择结构) 3. 循环结构(也称为重复结构)三种 4. 其他都是这三种基本语法结构的组合,再加上一些语法糖