JS的非函数式语言特性

源于对计算过程的认识的不同而产生了不同的计算模型,基于这些计算模型进行的分类,是计算机语言的主要分类方式之一。在这种分类中,一般将语言分为四类(基于程序本质的分类):

  • 命令式语言
  • 函数式语言
  • 逻辑式语言
  • 面向对象程序设计语言

命令式语言与结构化编程

“命令式”这个词事实上过于学术化。简单地说,从低级的汇编语言到高级的C++,以及常用的Basic、Pascal之类都是命令式语言。

命令式语言的演化分为“结构化编程”和“面向对象编程”两个阶段,无论是从语言定义还是从数据抽象的发展来看,面向对象编程都是结构化编程的自然延伸。

结构化程序设计语言中,对结构的解释包括三个部分:

  • 程序的控制结构:顺序、分支、循环三种基本程序逻辑
  • 程序的组织结构:表达式、语句行、语句块、过程、单元、包等
  • 程序的数据结构:基本数据结构和复合数据结构,且复合数据结构必然由基本数据结构按复合规则构成

结构化程序设计中的“结构”并非语言概念中的“结构类型(struct)”,二者没有任何必然的联系,结构化分析方法的要点是根据数据的处理过程、自顶向下地分解系统模块。这一分析、设计的过程被称为“结构化”,它的产物是模块(module)、过程(procedure)等之间的交互和接口,而非一个具体的数据结构。

从软件开发过程来讲,编程语言中的数据类型,包括结构化等,来自于上述分析、设计阶段的数据建模。

结构化程序设计绝不是“数据结构,一言以蔽之。这里重在强调语言特性,而非编程方法的历史与演进。

整个命令式语言的发展历程,都与“冯 洛伊曼”计算机系统存在直接联系。这种计算机系统以“存储”和“处理”为核心,而在编程语言中,前者被抽象成“内存”,后者被抽象成“运算”(指令与语句)。所以命令式语言的核心就在于“通过运算去改变内存中的数据”。

那么命令式语言与结构化编程在概念上有多大的相关性呢?事实上它们并不是同一层面上的概念,前者讲的是运算范型(表达为语言),后者将的是一种程序设计与开发方法。因此在结构化编程的整个知识域中,其实仅有“数据结构”与“命令式语言(编程范型)”在同一层面上。而所谓“数据结构”, 即是命令式语言所关注的“存储”。

由于命令式语言的实质是面向存储的编程,所以这类语言比其他语言更加关注存储的方式。在程序设计的经典法则“程序=算法+结构”中,命令式语言是首先关注“结构”的,这里的结构特指“数据结构(类型系统)”。

4933701-dcd5e6e4a6343848.png
数据结构上的简单抽象

命令式语言在运算上也基于上述“存储结构”来进行算法设计。

例如表检索,通常认为是在一个“连续数据块”中找到指定的、一个基本数据单元中的值。

/**
 * programming language: javascript
 * params:
 * @param key, a value. etc, type of byte
 * @param table, a array. ec, type of byteArray
 */
function SearchInTable(key,table){
    for(var i=0; i<table.length; i++){
        if(table[i]==key){
            return true;
        }
    }
    return false;
}

基于上例的基本需求和数据结构的设定,推论出“有序表检索效率更高”,并进一步提出有表排序的相关算法(例如冒泡排序),设计出“二分法查找”等有序表检索算法。再后来,算法从“对原始数据排序
”进化到“对数据映射排序”,从而有了更快速的“hash排序”和“hash检索”。海量数据处理的原始模型才由此逐渐形成。而所有这些算法的原始基础,仍旧是对“数据表现形式”的设定。

像 Frederick P.Brooks, Jr.这样的先驱们,很早就意识到“程序=算法+结构”的价值,Brooks在《人月神话》中指出“数据的表现形式是编程的根本”。正是大师们在“数据的结构”上的不懈努力,成就了“C/Pascal”这样的结构化编程语言、Window、Linux\UNIX这些伟大的操作系统,以及Oracle、MS SQL Server等这些数据库系统。

然而,从基于x86系统的汇编语言,代表近三十年来“高级语言”发展史的C、Pascal、Basic以及在关系数据库方面独领风骚的 SQL... 所有这些在通用软件开发领域耳熟能详的编程语言,都困守在“冯 洛伊曼”体系之中,无数经典语言与编程大师遵循“程序=算法+结构”这句断言,而从未在本质上出现任何的突破。

在另一种分类体系中,SQL 被归类为“第四代程序设计语言(4GL, Fourth-Generation Language)”。在该分类体系中,还包括机器语言(1GL)、汇编语言(2GL)、高级语言(3GL),以及图形化程序设计语言(5GL)。这是一种较为笼统的以语言演化的次序、功用及实现分类的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值