首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.3 为什么研究程序设计语言

Why Study Programming Languages?

程序设计语言处于计算机科学的中心,也处于计算机科学课程体系的中心。与大部分汽车的拥有者一样,熟悉了一种或几种高级语言的学生们,通常都会对学习其他语言很感兴趣,也迫切希望了解在它们的“背后”究竟是些什么。对于程序设计语言的学习是一件很有趣的事情,也很有实际价值。

从一方面看,对于语言的设计和实现的深入理解,可以帮助人针对任何特定工作选择最合适的语言。大多数语言都可能更适合某些工作,但却不适合另一些工作。不会有人喜欢用APL去做符号计算或者字符串处理,但其他方面的许多选择就不那么一目了然了。应该选择C、C++还是Modula-3做系统程序设计?选择Fortran还是Ada做科学计算?选择Ada还是Modula-2做嵌入式系统?选择Visual Basic还是Java做图形用户界面?本书将帮助你做好准备去应对这一类选择。

类似的,本书还将使你更容易去学习新的语言。许多语言之间都有很密切的联系。如果你已经了解了C++,那么学习Java或者C# 就会容易一些。如果你已经了解Scheme,学习Common Lisp也会更容易。更重要的是,有些基本概念是所有程序设计语言的基础,这些概念中的大部分都是本书各章的名字:类型、控制(迭代、选择、递归、非确定性和并发)、抽象和命名。与从空白出发相比,从这些概念出发去思考问题,将使我们更容易把握新语言的语法(形式)和语义(意义)。自然语言的情况也与此类似,很好地掌握了有关语法形式的知识,能使人更容易学好另一种外语。

无论你学习什么语言,理解体现在其设计与实现中的各种决策,都能够帮助你更好地使用它。本书将在以下几个方面帮助你。

理解那些比较困难的特征  典型的C++程序员都极少使用联合、多重继承、变动个数的参数,或者.*运算符(如果你不知道它们,完全不必担心)。就像理解语言的基本概念能使人更容易去掌握新语言一样,它也使人在深入查阅手册的细节时更容易理解上面这类概念。

从不同可能性中选择最适当的方式去表述事物  这方面的选择需要基于对实现代价的理解。举例说,在C++里,程序员应该避免不必要的临时变量,应尽可能利用复制构造函数,以减少初始化的代价。在Java里,他们可能希望用Executor对象而不是显式地创建线程。如果用的是某些(比较糟糕的)编译器,他们就可能需要采用特殊的习惯用法,才能得到最快速的代码:在C语言里用指针去遍历数组;在Pascal或者Modula-3里用with语句提取出公共的地址计算;在Basic里用x*x而不是x**2。在任何语言里,程序员都需要在抽象的多种实现方式中做出评价和权衡。例如,对用二进制位表示的集合的元素个数,是采用计算的方式还是用查表的方式,虽然这两种方式都能完成工作。

更好地使用调试器、汇编器、连接器和其他有关工具  一般来说,高级语言程序员不应该关心实现细节。但是也确实有一些时候,对某些细节的理解证明是特别有用的。如果一个人能检查程序里的二进制位,有时就会更容易对付那些顽固的很不常见的系统构造问题。

在缺乏某些有用特征的语言里模拟这些特征  某些很有用的特征在老一些的语言里没有,但是可以通过某种深思熟虑(可能并非强制性)的编程方式去模拟。举例说,在老版本的Fortran里,熟悉新型控制结构的程序员可以通过注释和自我训练,写出结构良好的代码。类似的,在缺乏抽象机制的语言里,注释和命名规则可以用于模拟模块结构,Clu、Icon和C# 里那种特别有用的迭代器(iterators)(我们将在第6.5.3节研究)也可以通过子程序和静态变量模拟。在Fortran 77和其他缺少递归的语言里,我们可以从递归的伪代码出发,通过机械式的手工变换,推导出一个迭代程序来。在缺少命名常量和枚举类型的语言里,采用初始化一次之后绝不修改的变量,可以使代码更容易阅读,也更容易维护。

在需要语言处理技术时能更好地使用它  大部分程序员永远都不会去实现某个常见的程序设计语言,但却都可能在做其他程序设计工作中需要语言处理技术。典型的个人计算机包含着数十种不同结构格式的文件:压缩的网页内容、文字处理、电子表格、演示幻灯片、点阵和向量图形、音乐、视频、数据库,以及各种其他应用领域的东西。每一种结构格式都有形式化的语法和语义,处理工具必须理解它们。在几乎所有复杂程序里,都可以看到各种各样的语法分析、语义分析、生成、优化,以及其他各种操作结构格式数据的代码,所有这些代码都基于语言处理技术。牢牢掌握这种技术的程序员,在编写良好结构的可维护的工具时,就会处于某种优势地位。

与此类似,通过启动配置文件、命令行参数、输入命令,或者各种内置的扩充语言(在第13章考虑这方面的细节),大部分工具都可以定制。我的主目录下就包含了250个以上独立的配置(“首选项”)文件。我个人的emacs文本编辑器的配置文件包含了1 200行以上的Lisp代码。今天几乎所有复杂系统的用户都需要很好地使用配置或者扩展语言。这样一个程序的设计者或者需要采纳某种现存的扩展语言,或者需要自己发明一种语言。深入掌握语言理论的程序员,在设计

优秀的记法形式以满足当前用户并有利于未来的开发方面,就会占据某种优势位置。

最后,如果你希望去做语言的设计和实现,本书将帮助你在这些方面做好准备。如果你对语言与操作系统或者系统结构的交互关系很有兴趣,本书也能帮助你理解其中的问题。

检查你的理解

1.     机器语言和汇编语言之间的差别在哪里?

2.     高级语言在哪些方面是对汇编语言的改进?在哪些环境中用汇编语言编写程序还是有意义的?

3.     为什么有这么多程序设计语言?

4.     什么使一个程序设计语言成功?

5.     在下面各类语言中各提出三个名字:冯•诺伊曼,函数式,面向对象。再请给出两种逻辑式语言,给出两种使用最广泛的并发语言。

6.     说明式语言与命令式语言之间的差异何在?

7.     哪个组织领导了Ada语言的开发?

8.     哪个语言通常被认为是第一个高级程序设计语言?

9.     第一个函数式语言是什么?

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论