什么是命令式编程 (Imperative Programming)?

命令机器如何做事情,强调细节实现

java、c、c++等都属此类。

“这些语言的特征在于,写出的代码除了表现出“什么(What)”是你想做的事情之外,更多的代码则表现出实现的细节,也就是“如何(How)”完成工作。这部分代码有时候多到掩盖了我们原来问题的解决方案。比如,你会在代码里写for循环,if语句,a等于b,i加一等等,这体现出机器如何处理数据。”

什么是声明式编程(Declarative Programming)?

声明式编程告诉机器做什么,至于怎么做到的,你可以不用管。

代表语言:prolog
特点:你只需向它提供一些事实(fact)和推论(inference),让它为你判断。

声明式编程包含了函数式编程和逻辑编程。比如lisp haskell prolog,也包含下面示例代码中使用的js。js是一种多范式语言,既可以用命令式也可以用函数式风格编写代码。

声明式语言来描述算法非常合适

通过上面的简单对比得知,声明式编程的抽象程度更高,程序员不必纠缠与实现的细节,所以用来描述算法最合适了。

以快速排序为例

A、快速排序以声明式编程风格实现的例子

function quicksort(list){
if(list.length === 0){
return [];
}else{
var n = first(list) //1
, lt = listlet(rest(list),n) //2
, gt = listgt(rest(list),n) //3
// 递归 & 合并
return [].concat(quicksort(lt) //4
,n
,quicksort(gt))//5
}
}
console.log(quicksort([3,9,2,1,5,4]));
// [ 1, 2, 3, 4, 5, 9 ]

代码本身比较短小,它描述的算法是这样的

1.取出一个元素作为参考元素n 。见标注1

2.将这个元素之外的剩余元素分为两部分,小于等于n的元素lt,大于n的元素gt。见标注2、3

3.将lt放n前面,gt放n后面,即按升序排列。但是在这样排列之前,要递归的执行上面两步,直到遇见空数组。见标注4、5

quicksort依赖下面的工具函数。前两个工具函数本身也是声明式风格编写的。

function listgt(list,n){
return list.filter(function(m){
return m > n;
})
}
function listlet(list,n){
return list.filter(function(m){
return m <= n;
})
}
function first(list){
return list[0];
}
function rest(list){
return list.slice(1);
}

以listgt为例,声明式风格的实现为:

function listgt(list,n){
return list.filter(function(m){
return m > n;
})
}

对应的命令式风格的实现为:

function listgt(list,n){
var ret = [];
for(var i=0;i<list.length;i++){
if(list[i]>n){
ret.push(list[i]);
}
}
return ret;
}

可以看出,上面的代码体现了“命令机器如何做事情,强调细节实现”,包含了一个for循环, 声明了额外的变量i,ret,调用了ret.push方法。感觉有很多噪音在里面。  

而前一个listgt实现为一段声明,过滤(filter)这个数组,过滤规则为:这个数组元素m要大于n。过滤就是一种声明式的描述,“告诉机器做什么”。过滤功能可能语言本身已经提供给你了,你只需要告诉机器过滤规则就行了。 

B、快速排序以命令式风格实现的例子

function swap(items, firstIndex, secondIndex){
var temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
function partition(items, left, right) {
var pivot = items[Math.floor((right + left) / 2)],
i = left,
j = right;
while (i <= j) {
while (items[i] < pivot) {
i++;
}
while (items[j] > pivot) {
j--;
}
if (i <= j) {
swap(items, i, j);
i++;
j--;
}
}
return i;
}
function quickSort(items, left, right) {
var index;
if (items.length > 1) {
left = typeof left != "number" ? 0 : left;
right = typeof right != "number" ? items.length - 1 : right;
index = partition(items, left, right);
if (left < index - 1) {
quickSort(items, left, index - 1);
}
if (index < right) {
quickSort(items, index, right);
}
}
return items;
}
console.log(quickSort([4, 2, 6, 5, 3, 9]));

left和right参数的引入是因为实现算法的细节需要——“命令机器如何做事情,强调细节实现”,用于partition函数划分数组。

partition函数也有非常多的实现细节。相较而言,不太好阅读。

参考:

http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html

命令式语言和声明式语言对比——JavaScript实现快速排序为例的更多相关文章

  1. 关于CSS自文档的思考_css声明式语言式代码注释

    obert C. Martin写的<Clean Code>是我读过的最好的编程书籍之一,若没有读过,推荐你将它加入书单. 注释就意味着代码无法自说明 —— Robert C. Martin ...

  2. 数学语言和程序语言的对比:面向过程与面向集合&命题

    共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...

  3. How Javascript works (Javascript工作原理) (六) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: 1.webassembly简介:WebAssembly是一种用于开发网络应用的高效,底层的字节码.允许在网络应用中使用除JavaScript的语言以外的语言(比如C,C++,Rust及其他 ...

  4. JavaScript 工作原理之六-WebAssembly 对比 JavaScript 及其使用场景

    原文请查阅这里,略有改动,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第六章. 现在 ...

  5. Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?

    [编者按]本文作者@徐珂铭,一位看好Html5的移动互联网的从业人士.喜爱玩技术,会点JAVA.HTML及CSS,有自己的想法及姑且能表达想法的文字,因此有了自己的文章. 基于HTML5的Web Ap ...

  6. 【C语言】01-C语言概述

      说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 为什么iOS开发要先学C语 ...

  7. Java语言与C++语言的差异总结

    Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是 ...

  8. 编译性语言&amp;解释性语言

    计算机是不能理解高级语言.当然也就不能直接执行高级语言了.计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言.不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列 ...

  9. python是强语言还是弱语言?

    python是强语言还是弱语言,没有一个具体官方的说法 数据类型也就是变量类型,一般编程语言的变量类型可以分成下面两类. 静态类型与动态类型 静态类型语言:一种在编译期间就确定数据类型的语言.大多数静 ...

随机推荐

  1. CentOS防火墙中端口的开启和关闭

    1.开启端口(以80端口为例) 方法一: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 写入修改 /etc/init.d/iptables save ...

  2. Linux下分析某个进程CPU占用率高的原因

      Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

  3. linux nginx安装以及配置

    一.Nginx简介 Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  4. findbug、p3c、checkstyle、sonar安装使用

    idea插件安装方式: Preferences—>Plugins—>查找插件—>Install Preferences—>Plugins—>Install plug fr ...

  5. 温故而知新-面向对象的PHP

    1 类的多态 不同的类对同一操作可以有不同的行为. 比如自行车和汽车都有移动这个成员函数行为, 那么自行车类可以移动,行为和汽车的移动行为肯定不同. 2 析构函数不能有参数 3 __set和__get ...

  6. 你真的了解lambda吗?一文让你明白lambda用法与源码分析

    本文作者: cmlanche 本文链接: http://www.cmlanche.com/2018/07/22/lambda用法与源码分析/ 转载来源:cmlanche.com 用法 示例:最普遍的一 ...

  7. YII 自带验证码实现

    共三步,分别controllers,models,views各一层添置一行代码即可实现 第一步在controllers添加 public function actions() { return arr ...

  8. HUAWEI手机解锁

    1.关机:2.同时按上音量键和电源键,直至出现Android system recovery,按下音量键选择wipe date/factory reset->Yes-delete all use ...

  9. eclipse中项目出现红色的!

    eclipse中项目出现红色的!的原因有二个:1.jdk不匹配    2.缺少jar包

  10. Python3 sorted() 函数

    Python3 sorted() 函数  Python3 内置函数 描述 sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的 ...