快速业务通道

冒号课堂§2.2:声明范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

冒号课堂§2.2:声明范式

时间:2011-06-25 BlogJava xyz98

第二课 重要范式(2)

2.2 声明范式——目标决定行动

给我一个支点,我能挪动地球           ——Archimedes

关键词:编程范式,命令式,声明式,函数式,逻辑式

摘要:声明式编程简谈

?提问 

什么是声明式编程?它与命令式编程有何区别?

什么是函数式和逻辑式?

变量在命令式编程和声明式编程中有何不同的涵义?

声明式语言有何优点?为什么没有命令式语言流行?

命令式语言与声明式语言有无相通之处?

编程的本质是什么?命令式、函数式和逻辑式分别采用了怎样的编程机制?

:讲解

冒号迅速转移了话题:“下面我们来谈谈与命令式编程相对的声明式编程(declarative programming)。顾名思义,声明式编程由若干规范(specification)的声明组成的,即一系列陈述句:‘已知这,求解那’,强调‘做什么’而非‘怎么做’。声明式编程是人脑思维方式的抽象,即利用数理逻辑或既定规范对已知条件进行推理或运算。”

冒号课堂§2.2:声明范式(2)

时间:2011-06-25 BlogJava xyz98

问号询问:“声明式产生的背景是什么呢?”

“声明式编程发轫于人工智能的研究,主要包括函数式编程(functional programming)和逻辑式编程(logic programming)。其中,函数式编程将计算描述为数学函数的求值,而逻辑式编程通过提供一系列事实和规则来推导或论证结论。其实支持它们的语言出现得并不比命令式的晚多少——最早的函数式语言Lisp(LISt Processor)已有半个世纪的历史,最早之一的逻辑式语言Prolog(PROgramming in LOGic)也与C同龄。只是由于大多数更多地用于学术研究而非商业应用,颇有些‘养在深闺人未识’啊。”冒号有些惋惜,“起源的不同决定了这两大类范式代表着迥然不同的编程理念和风格:命令式编程是行动导向(Action-Oriented)的,因而算法是显性而目标是隐性的;声明式编程是目标驱动(Goal-Driven)的,因而目标是显性而算法是隐性的。为便于说明,我们分别用三种代表性的语言来实现阶乘(factorial)运算。”

冒号在黑板上打出投影——

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则陈述了两个关于阶乘的断言。”

冒号很满意:“一针见血!第二个问题:你们更习惯哪一种思维方式?”

逗号不加思索:“当然是第一种!”

冒号微笑着说:“这证明你至少是受过一定训练的程序员。大家回想一下,当你们初学编程时,是否习惯这种思维方式?”

叹号沉吟道:“好像不太习惯i = i + 1之类的语句。”

“对!”冒号的一嗓子吓了众人一跳,“我们最早接触的变量是代数方程中的x、y、z等,本质上是抽象化的符号,变量值是该符号在给定约束条件下的允许值。而命令式编程中的变量本质上是抽象化的内存,变量值是该内存的储存内容。通俗地说,前者好比姓名,所指之人是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号