冒号课堂节选:编程范式

编程范式

 

掌握一门语言的语法、工具和技巧固然重要,但那只相当于学会一门兵器的招法,更重要的当然是心法。招法重形,心法重意。得形而忘意,无异舍本逐末;得意而忘形,方能游刃有余。下面要谈的就是一种心法:编程范式。

范式译自英文的 paradigm ,也有译作典范、范型、范例的。如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。简单讲,编程范式就是编程语言的语感。

编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。由于着眼点和思维方式的不同,相应的范式自然各有侧重和倾向,因此一些范式常用 ‘oriented’ 来描述。换言之,每种范式都引导人们带着某种的倾向去分析问题、解决问题。比如: Object-Oriented 就是 对象导向 的编程范式。

 

编程范式分类

基本范式

最基本的两种编程范式:命令式和声明式, 其中命令式又称过程式。通俗点说,命令式编程由命令序列组成,即一系列祈使句: 先做这,再做那 ,强调 怎么做 ;声明式编程由相关表达式组成,即一系列陈述句: 已知这,求解那 ,强调 做什么 。学术点说,命令式编程是电脑( von Neumann 机)运行机制的抽象,即有序地从内存中获取指令和数据然后去执行;声明式编程是人脑思维方式的抽象,即利用数理逻辑或既定规范 specification )对已知条件进行推理运算。

命令式语言是面向机器的,起源于机器语言;声明式语言则发轫于人工智能的研究,主要包括函数式语言和逻辑式语言。

 

起源的不同决定了这两大类范式代表着迥然不同的编程理念和风格:命令式编程是行动导向( Action-Oriented )的,因而算法是显性而目标是隐性的;声明式编程是目标驱动( Goal-Driven )的,因而目标是显性而算法是隐性的。

示例:

C (命令式):

int factorial(int n)

{

     int f = 1;

      for (; n > 0; --n)   f *= n;

      return f;

}

 

 

Lisp (函数式):

(defun factorial(n)

(if (= n 0) 1                      //  n 等于 0 ,则 n! 等于 1

       (* n (factorial(- n 1)))))      //  否则 n! 等于 n* (n-1)

 

 

Prolog (逻辑式):

// 0! 等于 1

factorial(0,1).

// M 等于 N-1 M! 等于 Fm F 等于 N*Fm ,则 N! 等于 F

factorial(N,F) :-   M is N-1, factorial(M,Fm), F is N * Fm.   

 

C 明确给出了阶乘的迭代算法,而 Lisp 仅描述了阶乘的递归定义, Prolog 则陈述了两个关于阶乘的断言。

命令式编程中的变量本质上是抽象化的内存,变量值是该内存的储存内容 。通俗地说,前者好比姓名,所指之人是固定的;后者好比住址,所住之人是变化的。此外,等号在代数中是一种约束,而在许多命令式语言中则表示赋值。

声明式编程让我们重回数学思维,其中函数式编程类似代数中的表达式变换和计算,逻辑式编程则类似数理逻辑推理。其中的变量也如数学中的一样,是抽象符号而非内存地址,因此没有赋值运算,不会产生变量被改写的副作用,也不存在内存分配和释放的问题。这既简化了代码,也减少了调试

比较而言,声明式编程重目标、轻过程,专注问题的分析和表达而不致陷入算法的迷宫,其代码也更加简洁清晰、易于修改和维护。

编程语言的流行程度与其擅长的领域关系密切。声明式语言擅长基于数理逻辑的应用,如人工智能、符号处理、数据库、编译器等,对基于业务逻辑的、尤其是交互 式或事件驱动型的应用就不那么得心应手了。而大多数软件是面向用户的,交互性强、多为事件驱动、业务逻辑千差万别,显然命令式语言在此更有用武之地。

 

任何语言都难脱命令式或声明式的窠臼,因此上述三种范式最为基本。

 

归根结底,编程是寻求一种机制,将指定的输入转化为指定的输出。 三种范式对此提供了迥然不同的解决方案:命令式把程序看作一个自动机,输入是初始状态,输出是最终状态,编程就是设计一系列指令,通过自动机执行以完成状态转变;函数式把程序看作一个数学函数,输入是自变量,输出是因变量,编程就是设计 一系列函数,通过表达式变换以完成计算;逻辑式把程序看作一个逻辑证明,输入是题设,输出是结论,编程就是设计一系列命题,通过逻辑推理以完成证明。绘成 表格如下 ——”

范式

程序

输入

输出

程序设计

程序运行

命令式

自动机

初始状态

最终状态

设计指令

命令执行

函数式

数学函数

自变量

因变量

设计函数

表达式变换

逻辑式

逻辑证明

题设

结论

设计命题

逻辑推理

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值