程序语言的进化——话说变量(8)

Discussion in '编程心得' started by xiaorang, Apr 11, 2010.

  1. xi

    xiaorang Member

    Apr 1, 2015
    【核心】什么才是一个程序语言的核心。如果把目光注意在它的语法和函数库上,就无法看到程序语言真正的核心——变量。【机器语言时代】在很久很久以前——机器语言时代——对计算机的发展来说,真的是很久以前了,那时并没有变量的概念。有的只是寄存器和内存地址的概念,这两个概念最终发展后来的变量。寄存器在概念和使用方式上都很类似后来的变量,甚至它还有类型的概念,当然,那时的类型只是位长的区别,8位/16位32位。但这很类似变量的寄存器在短暂的发展之后,在高级语言中渐渐归于悄无声息,而内存地址则发展为多姿多彩的变量概念。【汇编语言时代】在随后出现的汇编语言中,本质上和机器语言是一一对应的。但由于使用了助记符,用一个名字来代表一个地址,这就出现了新的概念,形成了内存变量的雏形。最早的汇编语句也很简单,基本上只有这样几类:寻址、写入/读取,比较,条件跳转,无条件跳转。随着程序语言的发展,这写基本的语句发展成为了非常丰富的内容;但万变不离其宗,其本质都是这些基本语句的组合。此是后话,暂且不提。话说最早期,虽然有了变量的雏形概念,却并没有变量类型的概念。因为的变量,只不过就是内存地址的一个宏替换。那时的变量更类似后来高级语言中的指针,在这个地址上写下什么内容,写多少内容,完全由程序控制。变量之间也没有截然的界限,如果连续定义了两个变量A与B,那么对变量(A+1)的访问与直接对B的访问很可能是完全一样的。数组的概念早就存在,与普通变量的使用无甚差别,只是在一个基准地址的基础上累加下去。字符串的概念一直是等同数组的,在汇编语言的时代,字符与数字可以说是毫无差别的。在那个时代,寻址方式是任何汇编语言中的“当红概念”,每种机器的汇编语言会提供许多种不同的寻址方式。因为受到机器速度和程序空间资源的限制,软件开发者必须非常清楚自己想做的是什么,自己选择最合适的寻址方式来访问内存。为了操作方便,对许多外设的访问,也都映射为对特定内存地址的访问。所有访问都是全权的,没有任何限制。那时的编程,不得不由精通硬件的人来进行。汇编语言编程效率低下,相对而言,人的想象力过于丰富。人们只能象对待孩子一样对待计算机,凡事顺着机器的意思,直到C语言出现。【中级语言】在C语言中,完全引入变量和变量类型的概念,人们直接看到的不再是内存地址。但它保留了很多汇编时代的痕迹,例如非常琐碎的变量类型定义,在很大程度上考虑了位长的区别:8位的称为Byte、16位称为Word、32位的称为Long,等等。所以有人习惯不把C语言称做高级语言,而称做中级语言,意指它是介乎汇编与高级语言中间的一种语言。即使这样,C语言仍然是一个里程碑式的出现。它的出现标志着计算机从儿童走向成熟,计算机渐渐离开了由硬件人员看护的摇篮,走向更广阔的人群。顺便一提的是,早期的C语言,还念念不忘寄存器的良好特性,它支持定义一个寄存器变量。它期待着那些水平精湛的程序员们,能够准确地指出那些使用最频繁的变量,把他们定义为寄存器,以达到更好的性能效果。但随着机器性能的飞速发展和程序员们的注意力转移,这一特性的支持被迅速淘汰了。C语言的出现,对于汇编时代程序员来说,不啻福音;这种感受始终在那些早期高水平程序员的思维中如此强烈地传递着,支持着并不优秀的C语言(对于习惯其他高级语言的程序员来说,C语言过于琐碎)一路发展下来。早期的Basic语言,是另一个意义上的中间语言。它已经完全屏蔽了变量的物理概念,居然做到了变量的自动定义,并形成了一个标准,被许多后来的语言效法。但它在程序结构上还因循了类似汇编语言一样的组织结构:主程序和子程序写在同一个程序段内,用“标号”来进行标志(标号也是在汇编语言中引入的,代表汇编程序代码地址的助记符,但它没有向变量那样发展起来,而是被现代程序理论弃如弊履)。传统Basic程序和汇编一样,充斥着大量的Goto语句,让熟悉其他高级语言的程序员无法接受。虽然如此,Basic语言作为汇编的替代品,仍然给许多早期的程序爱好者留下了美好的印象,这一好感支持着Basic语言也艰难地发展到了程序语言的面向对象时代。【高级语言时代】与此同时,各种真正的高级语言也纷纷出现。形成了第一次语言形式的大爆发。此阶段的程序语言各有特色,蔚为壮观。Pascal类的语言,与C和Basic并无本质区别,他们后来一度也成为编程语言的主流。他们都是从汇编语言的基础上发展而类,并大都有着清晰的变量定义,按函数的概念组织程序的整体结构,我们姑且称他们为“汇编类语言”。数字与字符串在许多高级语言中已经分道扬镳,少量的付出带了巨大的安全性与便利性。变量概念在这个时候出现了一个新的发展,在C语言里称为struct(结构),在Pascal里称为record(记录)。这标志着变量简单地代表某个内存地址的时代已经过去,真正引入了“变量类型”的概念。其根本含义是,规定了程序应当怎样解读从某个内存地址开头的一段空间中所保存的内容。汇编类语言的时代也是软件行业巨大发展的时代,操作系统概念在此时出现,以及现在看来许多人日常工作不可或离的基本软件,如文字处理软件、数据库软件等都纷纷出现。带来的生产力的巨大提高。【含广义表语言】汇编类语言创造巨大辉煌的时候,另一类高级语言如Lisp、Prolgo类的语言,则处于边缘的潜流。之所以这样,是因为这类语言是一种纯粹的逻辑语言,他们的形式与汇编语言没有任何联系。在那个计算机性能还不是很强的时代,他们的执行效率实在太低下了。他们有一个共同的特色是,不约而同的都支持了一种使用广泛的基本变量类型,人们称之为:广义表。广义表的特性是表中的任意一个元素还可以是一个表。虽然究其本质,与多叉树无二,但在所有语言中都将其称为表(List)。我们姑且称这些语言为:“含广义表语言”。虽然执行效率低下,但这种广义表在使用上的巨大方便性,使它们的爱好者人群在持续地发展壮大着。他们的时代已经不远,不过,他们必须等待汇编类语言首先经历的更大辉煌。【面向对象时代】汇编类语言的下一步发展,就是软件行业人所共知的,面向对象(Object Oriented)的时代。面向对象这个概念并不非常准确,大抵是为了凑两个O的效果而创造出来。如果称做面向类的时代,也许让人更好理解。类的概念被无数真懂与假懂的人传说之后,似乎变得神奇无比。其本质就是变量类型这一概念登峰造极的发展。早期的结构与记录概念在持续的使用中,承受着越来越多的无法实现的需求。大约最无法忍受就是相近的类型的重复定义,在一个基础结构中增加一个属性就必须定义为另外一个扩展的结构类型,而这两个类型之间毫无关联。处理一个类型的函数无法对另外一个类型进行识别(多态性需求);一但基础类型改变,所有扩展类型都必须改动(继承性需求)。这样的软件开发方式势必留下无穷的祸患。于是具有封装性、多态性和继承性的类的概念就被提出了。其美好的特性,立即让所有深受前代软件开发方式困扰的程序员如获至宝。程序开发的主体就成为类的定义和对象的配置。几乎在十数年中,几乎所有的应用程序都在面向对象的基础上进行了改写。不但如此,软件的分析设计方式、开发方式都在此基础上重新建立,并获得了令人瞩目的发展。当面向对象的软件开发走到了Java之后,形成了大一统的极端。传统变量类型被彻底放弃,所有的变量类型都被理解为类,所有的变量都成为对象。随后.net紧随其后,与Java并成为面向对象编程语言时代的两大巨头。Java是在C语言的基础上改头换面而成,而所有其他的汇编类语言都被.net收拢。所有现代的程序员不入Java即入.net,其他语言的抱持者则不可避免被历史地边缘化。【过度发展】面向对象的进化给程序语言的发展带来了巨大繁荣,几乎所有人们能够想到的软件都被开发,由于软件开发成本的急剧下降,免费开源的大潮成为了软件行业的主旋律。但在软件开发的效率到达了空间的高度之时,开发者的想象力相对已经悄然成为了新的瓶颈。许多在面向对象的基础上的新发展缺少坚实的实践基础,也已经不能解决新的问题。例如一些在Java语言中出现的所谓的新特性,远离了真实的应用需求,在增加了诡异的复杂性之后,对开发效率并无实际意义的提高。虽然将目光更多地聚集在变量问题,但我也想稍稍提一些在面向对象时代,对程序结构方面的变动尝试。最典型的一个,大概就是所谓的Aspect Oriented Programming(“面向方面”的编程AOP)。他的思路是把程序段进行切片,以实现最小成本地对现有程序的功能进行添加。那并非不是一个美妙的体系,但理论过于超前实践的最好结果也只能是暂时被搁置。软件行业的辉煌吸引了大量的从业者,面向对象时代的程序员们,已经没有了汇编时代的体验,甚至连早期高级语言都很少用过。于是在汇编类语言的人气基础渐渐淡却之时,含广义表语言忽然在一夜间粉墨登场,拥上前台。他们的正式名字叫做:脚本语言。【脚本语言时代】计算机硬件的高度发展,遮盖了含广义表语言的效率问题,例如Ruby,PHP,Perl,等等,在网络时代找到了适合于它们的应用形式。这些语言中的变量,一概都是真正的逻辑变量,不再关心其物理上的存储含义。是一种抽象程度更高的语言。不同语言称谓不同,但其基本结构相差不大。他们没有任何汇编语言的痕迹,语法更贴近自然语言,更好理解,支持颇具特色的广义表类型,大多采用解释运行的脚本语言的形式。脚本语言的解释运行特点适应了网络时代快速的需求变化,其人性化的语言特色,能够允许更广泛的人群进行编程。计算机软件终于进入了它的成年时代,轮到它考虑人类编程者的理解习惯和需求了。【展望】软件行业的发展离不开编程语言的发展,而程序语言发展的核心,就是变量与变量类型的发展,把握此点,我们即把握住了编程语言发展的脉络,它们今后的路怎样走,我们将共同见证。--------------------------------------------------------------------------
     
  2. te

    terry_zhou82 Member

    Apr 1, 2015
  3. xi

    xiaorang Member

    Apr 1, 2015
    接受答案了.