1.3 为什么学习程序设计语言

程序设计语言是计算机科学及其课程的核心。像大多数车主一样,熟悉一种或多种高级语言的学生通常对学习其它语言很好奇,想知道“引擎盖下”到底是什么。学习语言很有趣,也很实用。

首先,理解语言的设计和实现有助于为给定任务选择最合适的语言,因为大多数语言在某些方面比其它方面要更好。很少有程序员会选择Fortran进行符号计算或字符串处理,但其它的选择并不是那么的明确:系统编程应该选择C、C++还是C#?科学计算应该选择Fortran还是C?Web程序使用PHP还是Ruby?嵌入式系统使用Ada还是C?图形界面使用Visual Basic还是Java?对于这些问题,这本书应该能帮助你做出更好的决定。

同样,本书也会让学习新语言变得更加容易。语言之间都是相关的,如果你已经了解C++,那么学习Java和C#会更容易;如果你已经了解Scheme,那么学习通过Lisp会更加容易;如果你已经了解ML,学习Haskell会更加容易。更重要的是,所有程序设计语言都有一些基本概念,其中大多数概念都是本书各章的主题:类型、控制(迭代、选择、递归、不确定性、并发)、抽象和命名。与直接学习相比,基于这些概念进行思考更容易掌握新语言的语法(形式)和语义(意义)。这里的情况和自然语言是类似的:掌握语法有助于学习外语。

无论学习什么语言,理解设计和实现过程中的决策都将帮助你更好地使用它,因此这本书可以帮助你:

  • 理解语言中的模糊特性。很少有C++程序员使用联合、多重继承、可变参数或者.*运算(如果你不知道这些是什么,也别担心),这些只是简化了语言。当在手册中查找详细信息时,理解基本概念有助于理解这些特性。

  • 选择不同的实现方式。这一点基于对实现细节的理解。例如在C++中,程序员需要避免不必要的临时变量,并尽可能使用拷贝构造函数来减少初始化的成本;在Java中,他们更倾向于使用Executor对象而不是显式创建线程。对于某些(较差的)编译器,程序员可能需要使用特殊的编程习惯来获得最快的代码:使用指针数组遍历;x*x而不是x**2。在任何语言中,他们都需要根据抽象背后的底层实现进行权衡——例如是通过计算,还是通过查找来获得位集合的大小。

  • 更好的利用调试器、汇编器、链接器和相关工具。一般来说,使用高级语言不需要考虑实现细节,不过有时了解这些细节几乎是必不可少的。如果你愿意窥探其中的细节,那么奇怪的bug或系统构建问题可能会非常容易处理。

  • 模拟语言不支持的功能。旧语言中缺少某些非常有用的特性,但可以通过遵循一种编程风格来模拟这些特性。例如在旧的Fortran语言中,熟悉现代控制结构的程序员可以通过注释和良好的代码风格来编写结构良好的代码。类似地,在抽象能力较差的语言中,注释和命名有助于实现模块化,而Clu、C#、Python和Ruby(我们将在6.5.3节中研究)中的迭代器可以用子程序和静态变量来模拟。

  • 更好地利用语言技术。大多数程序员都不会设计或实现传统的编程语言,但大多数程序员都需要语言技术来完成其它编程任务。个人计算机中包含几十种结构化格式的文件,包括文字处理、电子表格、演示文稿、光栅和矢量图形、音乐、视频、数据库以及各种应用领域。Web内容越来越多地用XML表示,这是一种基于文本的格式,XSLT脚本语言(在14.3.5节中讨论)可以很方便的处理它。因此,几乎在任何复杂的程序中,都可以找到解析、分析、生成、优化等操作结构化数据的代码,所有这些代码都基于语言技术。掌握这项技术的程序员将能够更好地编写结构良好、可维护的工具。

    大多数工具本身都可以通过启动配置文件、命令行参数、输入命令或内置扩展语言(第14章将详细介绍)进行定制。我的home目录包含250多个配置文件,其中emacs文本编辑器的个人配置文件包含1200多行Lisp代码。如今几乎所有复杂程序都需要支持配置文件或扩展语言,这样一个程序的设计者要么采用(或适配)一些现有的扩展语言,要么发明自己的新语言。精通语言理论的程序员将能够更好地设计出优雅、结构良好的语言,在满足当前用户需求的情况下,也有助于后续开发。

最后,如果你有设计和实现语言的倾向,本书可以为你进一步学习做准备。如果你对这些领域感兴趣,它还将帮助你理解语言与操作系统和体系结构之间的交互。

results matching ""

    No results matching ""