• 《面向对象》读书笔记3


    第三章 理解OOP:编程语言的历史

    机器语言、汇编语言、高级语言、结构化编程、GOTO语句、全局变量、局部变量


    本章介绍OOP出现之前的编程语言。
    OOP结构非常简练,但另一方面也非常复杂,因此理解其结构和用途并不简单。不过,理解OOP也由捷径可循,那就是先掌握在OOP之前产生的编程技术能够实现什么、存在哪些限制。

    3.1 OOP出现具有必然性

    人们有时会认为面向对象时一种能够按照现实世界中的观点来创建软件的全新思想,将取代传统的开发技术。不过作者对此持反对意见,认为OOP以在它之前出现的编程技术为基础,用于弥补这些技术的缺陷。也可以说在不断改进编程技术的历史中,OOP的出现具有必然性。此外,面向对象框架内涵盖的其他技术也是对OOP的发展和应用,是之前优秀的开发技术的延申。
    如果大家能够充分理解在OOP出现之前的编程语言以及从机器语言到机构化编程的进化史,就一定能明白面向对象是一门有助于高效创建高质量程序的实践性技术。

    3.2最初使用机器语言编写程序

    计算机只可以解释用二进制数编写的机器语言。并且,计算机对机器语言不进行任何检查,只是飞快地执行。

    //使用机器语言编写地程序示例
    A10010
    8B160210
    01D0
    A10410
    

    3.3编程语言地第一步是汇编语言

    为了改善这种低效地编程,汇编语言就应运而生。

    //汇编语言示例
    MOV  AX, X
    MOV  DX, Y
    ADD  AX, DA
    MOV  Z, AX
    

    汇编语言是编程语言地第一步。使用汇编语言编写地程序被读入对其进行编译的其他程序(称为“汇编程序”)中,从而生成机器语言。计算机本是为了轻松执行人类的工作而设计的机器。所以人们希望编写程序驱动计算机工作的任务也可以使用计算机轻松进行。得益于汇编语言,程序简单易懂很多,错误也有所减少,之后进行修改也变得很轻松。
    不过在使用汇编语言编写程序中,即使命令存在一点错误也会导致程序运行异常。另外,虽然汇编语言容易理解,但是在编程时逐个指定计算机的执行命令是非常麻烦的。

    3.4 高级语言的发明使程序更加接近人类

    3.5 重视易懂性的结构化编程

    为了我应对软件危机,人们提出了各种新的思想和编程语言。
    其中,最受关注的就是结构化编程。
    结构化编程由荷兰计算机学家戴克斯特拉(Dijkstra)提出,其基本思想是:为了编写出能够正确运行的程序,采用简单易懂的结构是非常重要的。
    具体方法是废除程序中难以理解的GOTO语句,提倡只使用循序、选择和重复这三种结构来表达逻辑。

    3.6 提高子程序的独立性,强化可维护性

    在当时,为了强化程序的可维护性,还有另外一种方法,就是提高子程序(还有凄然叫法,比如过程、函数等)的独立性。
    早在计算机诞生初期的20世纪40年代,子程序就已经被发明出来了。该结构被用于将在程序中的多个位置出现的相同命令汇总到一处,以减小程序的大小,提高编程效率。不过现在大家开始意识到,只是简单地将相同命令语句汇总到一处还不够,为了强化程序地可维护性,提高子程序地独立性也很重要的。
    提高子程序独立性的方法是减少在调用端(主程序)和子程序之间的共享信息。所谓共享的信息是指变量中存储的数据。这种能在多个子程序之间共享的变量被称为全局变量。
    程序逻辑可以按顺序进行解读。不过,由于我们很难一眼出变量在程序的哪个位置被引用,所以如果在程序中定义了很多变量,那么维护就会变得很困难。特别是全局变量,从整个程序的所有位置都可以对其进行访问,所以如果在调试时发现变量的内容有误,就必须检查所有源代码。由此可见,减少全局变量对提高程序整体的可维护性而言非常重要。

    在这种结构中我们很难知道哪一个子程序在什么时间点修改或者引用了变量。由于从程序的任意位置都可以访问全局变量,所以在因某中情况而修改了全局变量的情况下,就必须确认程序的所有逻辑。该示例中有三个子程序,逻辑也很短,所以不会有很大的麻烦。
    但是对于包含了成百上千个子程序的应用而言,修改全局变量就是一个很严峻的问题。手动确认影响范围的话不必自说,以当时的机器性能,使用计算机进行确认也是机器困难的。毕竟在当时,应用程序即使稍微修改以下也要花费几个小时的事件进行编译,而编译确认修改全局变量造成的影响则需要等待一个晚上。
    为了避免出现这样的问题,人们设计出了两种结构:一种是全局变量,另一种是按值传递(call by value)。

    局部变量时只可以在子程序中使用的变量,在进入子程序时被创建,退出子程序时小时。
    通过参数向子程序传递信息时,不直接使用调用端引用的变量,而是复制值以进行传递,这就是按值传递的结构。在使用这种结构的情况下,即使修改了被调用的子程序接收的参数值,也不会影响调用端的变量。

    3.7 实现无GOTO编程的结构化语言

    随着结构化编程理论的渗透,出现了以此为基础的编程语言,即结构化语言,具有代表性的结构话语言有Pascal、C语言等。
    结构化语言可以使用if语句、while语句和for语句等命令编写明确的控制结构。现在大家可能认为这是理所当然的,然而之前的主流语言,例如COBOL、FORTRAN等,其语法并不一定可以直接编写三种基本结构,因此结构化语言的出现是极大的进步。
    另外,虽然结构化编程也被称为无GOTO编程,但是有趣的是,Pascal和C语言中却提供了GOTO语句。也许看起来有些自相矛盾,但其实这是为了跳出嵌套循环结构等特殊情况而准备的。为了平衡执行效率,使用GOTO语句有时也是 一种备选方案。虽然当时计算机性能已经有所提升,到那时在那个年代,在执行效率上多下一点功夫就会有很好的效果。
    结构化语言也提供了前文中介绍的局部变量和按值传递功能,现在很多编程语言也都采用了这些结构。
    结构话语言中最有名的就是C语言。C语言完全支持结构化编程的功能,才外还具备之前只有汇编语言才可以执行的位运算以及高效使用内存区域的指针等细致功能。因此,它可以被广泛应用于从应用程序开发到系统编程等诸多领域。
    C语言的另一个特征就是,编程所需的全部功能并不是通过语言规范提供,而是由函数苦构成的。例如在C语言中,格式化输出字符串的处理时使用printf函数实现的,而爱COBOL和FORTRAN中则对应位语言规范。在采用这种结构的情况下,即使不改进语言编译器,也可以添加语言规范层的功能。现在的java等面向对象语言中也继承了这种思想。
    现在被广泛使用的java、C++和C#等编程语言都是C语言的直系子孙,继承了它的许多性质。

    3.8 进化方向演变为重视可维护性和可重用性

    在此让我们总结一下编程语言的进化历史吧。
    在从机器语言到汇编语言乃至高级语言的进化过程中,人们希望提高编程语言的表现能力,即用更贴近人类的方法简单地表示出希望计算机执行地作业。为此人们开发出一系列具有代表性地高级语言。迄今为止,可以说使用贴近人类地形式编写程序的目的已经基本实现了,不过遗憾地是,仅凭这一点,还无法拯救软件危机。
    因此,在向接下来的结构化语言进化时就需要改变方向,即提高可维护性。无GOTO编程以及提高子程序独立性地结构都是为了便于既有程序的理解和修改。

    3.9没有解决全局变量问题和可重用性差的问题

    结构化编程有两个无法解决的问题,那就是全局变量和可重用性差的问题。

    第一个是全局变量的问题。结构化语言中导入了局部变量和按值传递结构,可以尽量不使用全局变量来交换信息。不过,局部变量是临时变量,在子程序调用结束时就会消失,因此在子程序运行结束之后,依然需要保持的信息就只能被存在子程序的外面,即被保存为全局变量。
    滥用GOTO语句会严重影响程序的可读性,但这只限于编写该逻辑的部分。而全局变量可以被程序的任意位置使用,所以当因某种情况需要修改全局变量的时候,为了查明影响范围,就必须调查所有的逻辑。如果程序很大,那么这种由全局变量引发的问题就会非常严重,这也就是结构化语言中很难避免的问题。
    另一个问题是可重用性差。机构化语言中可重用的是子程序,而现在已经有了用于编码转换、输入输出处理、数值计算和字符串处理等的通用库,通过重用既有程序就可以在一定程度上实现基本的处理。然而即便如此,从不断增大的应用程序的整体规模来看,这种程度只能说是微不足道的。
    因此需要可重用的规模,这已经称为软件开发者的共识,但这一点却很难实现,主要原因就在于作为公用构件创建的只能是子程序。
    而能够打破该限制的正是OOP。

  • 相关阅读:
    关于CG Relighting系统设计的片言碎语
    [F&Q:How To Learn Computer Graphic]如何学习计算机图形学
    以后再也不写英文的文章了
    [D80]天井
    [应邀发布]Rapidmind Development Platform Download
    vs2008 结构体托管
    换实验室
    3D
    【入门】点击按钮添加输入框
    【入门】PHP与数据库连接
  • 原文地址:https://www.cnblogs.com/ldbstart/p/14431783.html
Copyright © 2020-2023  润新知