编程范式

一、编程语言概述

编程语言是计算机的符号,是人和计算机的通信符号和协议。

一门编程语言,我们应该关注的点:

  1. primitive elements(基本元素)

    表示语言的基本符号,例如基本数据类型,关键字等,也就是词法部分。

  2. means of combination(组合手段)

    利用基本元素通过组合的过程构建大型程序的手段,不同语言提供的组合手段是不同的。

  3. means of abstraction(抽象手段)

    抽象是解决软件复杂度的重要手段,让软件的可读性,可扩展性,可重复利用等得到提升。

  4. 类型系统

    1. 强类型

      像java,c等语言有很强的编译时的类型检测机制,强类型的好处驱使编码人员写出很少有语法、语义错误的代码,对IDE的支持也很棒。

    2. 弱类型

      弱类型语言让我们获取了自由,但是自由是由代价的,编译器或解释器中内含类型推理。类型推理是利用归一方法,基于上下文中的变量显示类型,操作符,返回值等信息,利用栈和逐渐替换的过程来推到类型。 弱类型也是有类型检测的,只是将此过程延迟到运行时了。

  1. 编译 & 解释

    1. 编译器

      执行速度快。而且编译器后端也更容易优化中间代码,因为优化过程式一个结构化过程:往往需要遍历整个中间代码,整体优化代码,提高运行效率。

    2. 解释器

      加载code速度快;解释器需要维护运行时上下文等信息。所以加载必要的代码,片段解释执行。但是对于相同的代码都经过编译过程就很多余,造成时间浪费。

二、编程范式

2-1 常见的编程范式

  1. 命令式编程

    1. 面向过程编程
    2. 面向对象编程
  2. 函数式编程

  3. 逻辑式编程

2-2 命令式编程

命令式编程是面向计算机硬件的抽象,有

变量    :存储单元
赋值语句:存储指令
表达式  :内存引用和算术运算
控制语句:跳转指令

也就是说:命令式程序就是冯诺依曼机指令序列

2-3 函数式编程

  1. 函数式编程中的函数并不是指计算机中的函数,而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。

  2. 因此,可以说函数式编程是面向数学的抽象,将计算描述为一种表达式求值,一句话,函数式程序就是一个表达式。

  3. 理论上说,函数式语言也不是通过冯诺依曼体系结构的机器上运行的,而是通过λ演算来运行的,就是通过变量替换的方式进行,变量替换为其值或表达式,函数也替换为其表达式,并根据运算符进行计算。λ演算图灵完全(Turing Completeness)的,但大多数情况,函数式程序还是被编译成(冯诺依曼机的)机器语言的指令执行的。

2-3-1 函数式语言的特性

  • 高阶函数(Higher-order Function)

    高阶函数就是参数为函数或者返回值为函数的函数。有了高阶函数,就可以将复用的粒度降低到函数级别,相对于面向对象语言,复用额粒度更低。

    高阶函数提供了一种函数级别上的依赖注入机制。

  • 偏应用函数(Partially Applied Functions)

  • 柯里化(Curry)

  • 闭包(Closure)

  • 惰性求值(call-by-need、Lazy evaluation)

    在将表达式赋值给变量时并不计算表达式的值,而在变量第一次被使用时才进行计算,这样就可以通过避免不必要的求值提升性能。

  • 模式匹配

来源

  1. 编程范式漫谈
  2. 什么是函数式编程思维?

results matching ""

    No results matching ""