第一图书网

程序设计语言概念

Robert W.Sebesta 清华大学出版社
出版时间:

2011-1  

出版社:

清华大学出版社  

作者:

Robert W.Sebesta  

页数:

563  

译者:

徐明星,邬晓钧  

Tag标签:

无  

前言

程序设计语言是计算机教学的基础课程。大部分的高等院校程序设计语言教材旨在讲解语法形式,讲解如何写出让编译器接受的语句,以及这些语句是如何被编译器理解的。学生很容易将程序设计语言当作一门特殊的外语来学习,将编程当作是句型练习,编程过程就是语言翻译的过程一即将头脑中的“内部言语”翻译成符合某种程序设计语言语法的语句。当面对以练习语法为主要目的习题时,这样的翻译过程容易完成,而当面对复杂的综合性习题或者要编程实现算法时,学生往往就会觉得难以下手。导致这种情况的根本原因是学生的思维没有上升到计算机解题的思维。程序设计语言是一种人造语言,它与汉语、英语、法语等自然语言存在着很大的不同。程序设计语言是在一定的设计思想指导下,权衡多种因素,精心为计算机定义的。程序设计语言的语法和语义只是外在的表现,程序设计语言的本质是解决应用领域问题的方法与工具。语言既是思维的表达,也是思维的工具。如果局限于程序设计语言定义的语法和语义,不能运用语言工具来辅助自己的思维,必然会限制用程序设计语言来解决实际问题的能力。本书并不是介绍某一种具体的程序设计语言所蕴涵的计算机解题原理,而是直接解释说明一般性原理,并介绍这些原理在不同程序设计语言中的实现,比较不同语言实现的优劣。这是一种从本质到现象的论述方式,它使读者更关注于程序设计语言原理本身,为今后深入理解和掌握具体的程序设计语言,选择更合适的程序设计语言来解决具体问题,乃至于创造实现新的程序设计语言都打下扎实的基础。

内容概要

  《世界著名计算机教材精选:程序设计语言概念(第9版)》从为什么学习程序设计语言入手,深入细致地讲解了命令式语言的主要结构及其设计与实现,内容涉及变量、数据类型、表达式和赋值语句、控制语句、子程序、数据抽象机制、支持面向对象程序设计(继承和动态方法绑定)、并发和异常处理等方面。最后两章介绍了函数式程序设计语言和逻辑程序设计语言。  《世界著名计算机教材精选:程序设计语言概念(第9版)》内容丰富,剖析透彻,被美国和加拿大多所高等院校采用作为教材。《世界著名计算机教材精选:程序设计语言概念(第9版)》既可用做高等院校计算机及相关专业本科生程序设计语言课程的教材和参考书,也可供程序设计人员参考。

作者简介

作者:(美国)塞巴斯塔(Robert W.Sebesta) 译者:徐明星 邬晓钧

书籍目录

第1章 预备知识1.1 学习程序设计语言原理的原因1.2 程序设计领域1.2.1 科学应用1.2.2 商务应用1.2.3 人工智能1.2.4 系统程序设计1.2.5 网络软件1.3 语言评价标准1.3.1 可读性1.3.2 可写性1.3.3 可靠性1.3.4 代价1.4 影响语言设计的因素1.4.1 计算机体系结构1.4.2 程序设计方法学1.5 程序设计语言的分类1.6 语言设计中的权衡1.7 实现方法1.7.1 编译1.7.2 完全解释1.7.3 混合实现系统1.7.4 预处理器1.8 编程环境小结复习题习题第2章 主要程序设计语言的发展2.1 Zuse的Plankalkul语言2.1.1 历史背景2.1.2 语言概述2.2 最少硬件的程序设计:伪代码2.2.1 Short Code语言2.2.2 Speedcoding系统2.2.3 UNIVAC“编译系统”2.2.4.相关工作2.3 IBM704.计算机与Fortran语言2.3.1 历史背景2.3.2 设计过程2.3.3 Fortran I概述2.3.4 Fortran II2.3.5 Fortran IV、77、90、95和20032.3.6 评价2.4 函数式程序设计:LISP语言2.4.1 人工智能的起源和表处理2.4.2 LISP语言的设计过程2.4.3 语言概述2.4.4 评价2.4.5 LISP的两种后代语言2.4.6 相关语言2.5 迈向成熟的第一步:ALGOL602.5.1 历史背景2.5.2 早期设计过程2.5.3 ALGOL58概述2.5.4 对ALGOL58报告的响应2.5.5 ALGOL60的设计过程2.5.6 ALGOL60概述2.5.7 评价2.6 商务记录计算机化:COBOL语言2.6.1 历史背景2.6.2 FLOW-MATIC语言2.6.3 COBOL语言的设计过程2.6.4 评价2.7 分时处理的开始:BASIC语言2.7.1 设计过程2.7.2 语言概述2.7.3 评价2.8 满足所有人的需要:PL/I2.8.1 历史背景2.8.2 设计过程2.8.3 语言概述2.8.4 评价2.9 两种早期的动态语言:APL和SNOBOL2.9.1 APL语言的起源与特点2.9.2 SNOBOL语言的起源与特点2.10 数据抽象的开始SIMULA672.10.1 设计过程2.10.2 语言概述2.11 正交设计:ALGOL682.11.1 设计过程2.11.2 语言概述2.11.3 评价2.12 ALGOL系列语言的早期后代语言2.12.1 为简单性而设计:Pascal语言2.12.2 可移植的系统语言:C语言2.13 基于逻辑的程序设计:Prolog语言2.13.1 设计过程2.13.2 语言概述2.13.3 评价2.14 历史上规模最大的设计工作:Ada语言2.14.1 历史背景2.14.2 设计过程2.14.3 语言概述2.14.4 评价2.14.5 Ada952.15 面向对象的程序设计:Smalltalk2.15.1 设计过程2.15.2 语言概述2.15.3 评价2.16 结合命令式和面向对象的特性:C++2.16.1 设计过程2.16.2 语言概述2.16.3 评价2.16.4 一种相关语言:Eiffe2.16.5 另一种相关语言:Delphi2.17 基于命令式的面向对象语言:Java2.17.1 设计过程2.17.2 语言概述2.17.3 评价2.18 脚本语言2.18.1 Perl的起源与特点2.18.2 JavaScript的起源与特点2.18.3 PHP的起源与特点2.18.4 Python的起源与特点2.18.5 Ruby的起源与特点2.18.6 Lua的起源与特点2.19 一种新千年的基于C的语言:C#2.19.1 设计过程2.19.2 语言概述2.19.3 评价2.20 标记与程序设计混合的语言2.20.1 XSLT2.20.2.ISP小结文献注释复习题习题程序设计练习访谈:用户设计与语言设计第3章 描述语法和语义3.1 概述3.2 描述语法的普遍问题3.2.1 语言识别器3.2.2 语言生成器3.3 描述语法的形式化方法3.3.1 巴科斯.诺尔范式和上下文无关文法3.3.2 扩展的BNF3.3.3 文法与识别器3.4 属性文法3.4.1 静态语义3.4.2 基本概念3.4.3 属性文法定义3.4.4 本质属性3.4.5 属性文法的例子3.4.6 计算属性值3.4.7 评价3.5 描述程序的意义动态语义3.5.1 操作语义3.5.2 指称语义3.5.3 公理语义小结文献注释复习题习题第4章 词法分析和语法分析4.1 概述4.2 词法分析4.3 语法分析问题4.3.1 语法分析概述4.3.2 自项向下的语法分析器4.3.3 自底向上的语法分析器4.3.4 语法分析的复杂度4.4 递归下降的语法分析4.4.1 递归下降的语法分析过程4.4.2 LL文法类4.5 自底向上的语法分析4.5.1 自底向上语法分析器的分析问题4.5.2 移进-归约算法4.5.3 LR语法分析器小结复习题习题程序设计练习第5章 名字、绑定和作用域5.1 引言5.2 名字5.2.1 设计问题5.2.2 名字形式5.2.3 特殊字5.3 变量5.3.1 名字5.3.2 地址5.3.3 类型5.3.4 数值5.4 绑定的概念5.4.1 属性与变量绑定5.4.2 绑定类型5.4.3 存储绑定和生存期5.5 作用域5.5.1 静态作用域5.5.2 块5.5.3 声明的次序5.5.4 全局作用域5.5.5 静态作用域评估5.5.6 动态作用域5.5.7 动态作用域评估5.6 作用域和生存期5.7 引用环境5.8 命名常量小结复习题问题集编程题访谈:脚本语言以及其他灵活解决方案的例子第6章 数据类型6.1 引言6.2 基本数据类型6.2.1 数值类型6.2.2 布尔类型6.2.3 字符类型6.3 字符串类型6.3.1 设计问题6.3.2 字符串及其操作6.3.3 字符串长度的设计选项6.3.4 评估6.3.5 字符串类型的实现6.4 用户定义的序数类型6.4.1 枚举类型6.4.2 子界类型6.4.3 用户定义的有序类型的实现6.5 数组类型6.5.1 设计问题6.5.2 数组和索引6.5.3 下标的绑定和数组的种类6.5.4 数组初始化6.5.5 数组操作6.5.6 矩形数组和不规则数组6.5.7 切片6.5.8 评估6.5.9 数组类型的实现6.6 关联数组6.6.1 结构和操作6.6.2 关联数组的实现6.7 记录类型6.7.1 记录的定义6.7.2 纪录域引用6.7.3 记录操作6.7.4 评估6.7.5 录类型的实现6.8 联合类型6.8.1 设计问题6.8.2 判别式联合与自由联合6.8.3 Ada的联合类型6.8.4 评估6.8.5 联合类型的实现6.9 指针和引用类型6.9.1 设计问题6.9.2 指针操作6.9.3 指针的相关问题6.9.4 Ada语言中的指针6.9.5 C和C++中的指针6.9.6 引用类型……第7章 表达式与赋值语句第8章 语句辑控制结构第9章 子程序第10章 实现子程序第11章 抽象数据类型与封装结构第12章 面向对象程序设计的支持第13章 描述语法和语义第14章 异常处理和事件数理第15章 函数式程序设计语言第16章 逻辑程序设计语言参考文献

章节摘录

插图:增加表达思想的能力。一般认为,人们思考问题的深度受到他们思考时所使用语言的表达能力的影响。那些对自然语言理解肤浅的人,思维复杂度也有限,特别是在抽象的深度上。换言之,人们难以将口头或书面无法表达的东西概念化。程序员在开发软件的过程中同样受到这一限制。他们开发软件所用的语言对他们所用的控制结构、数据结构和抽象层次也造成限制,从而也同样限制了他们能够构造的算法形式。了解更多的程序设计语言的特性能够在软件开发时减少这些限制。程序员学会新的语言结构后,能够提升软件开发时思维过程的层次。可能有人认为,了解其他语言的功能对一个被要求使用不具有这一功能的语言进行开发的程序员没有帮助。然而这种看法并不成立,因为通常来说语言的结构能够被不直接支持这些结构的其他语言模拟出来。例如,一个了解Perl语言(Wall等,2000)中关联数组的结构和用法的C语言程序员,可能会用C语言设计出模拟关联数组的结构。换句话说,对程序设计语言概念的学习能够使程序员对重要的语言特性与结构有充分的理解,鼓励程序员去使用它们,甚至在所用的语言不直接支持这种特性或结构的情况下。扩充选择合适语言的背景知识。许多专业的程序员没有受过多少正规的计算机科学教育,而是通过自学或单位内部培训。这类培训通常只教授与公司当前项目直接相关的一两种语言。其他许多程序员在很久以前受过正规的培训,他们那时所学的语言已经不再使用,现在程序设计语言中许多特性当时知道的人并不多。


编辑推荐

《程序设计语言概念(第9版)》:世界著名计算机教材精选

图书封面

图书标签Tags

广告

下载页面


程序设计语言概念 PDF格式下载



很棒,质量不错,感觉很好。


书的质量很不错,内容么。。由于是课本,也没什么好与不好的


这是我在图书馆找到的,哎……不能在上面画画写写,干脆买吧!!


程序设计者必读,帮你深层次的了解编程语言


    作为一个程序员,一般只有精通一门程序设计语言就可以胜任当前的工作了。当往往进入一个新的项目,或者重新选择一份工作,或者自己发现当前的所使用的程序语言对于有些问题的解决,用着不是那么方便,这个时候我们就倾向于去寻求一种合适的语言。比如,我最近在工作过程中,发现当前项目其实缺少很多工具,我们开发主要用的是C++,一个个对于C++不能说的上精通,但各种语法与库也了然于胸,用C++去写一些工具的时候就发现细枝末节太多、太烦人,数据库、XML文件解析、字串处理虽说都有库支持,但总感觉用着不那么顺手,速度也没那么快,还不如找一个脚本语言快速开发一个,Python正和我意。
    
    程序语言之间有很多共同之处,往往当你精通一门之后,学习其它语言就触类旁通了。需要做的事情就是熟悉它的语法,如果能看懂相应的BNF(巴克斯——劳尔范式)那就更好了,遇到模棱两可的语法问题,多去查查就好了。语义一般都大同小异,当你知道了程序言的各种机制的实现之后,对其语义的理解就更加深刻了。《程序设计语言原理》这边书相当于程序语言各种机制的总结,同时对于我们去学习新语言也指出一条清晰的思路,对现在正在用的语言也有更加深刻的认识了。
  
    程序语言的分类:
  
   * 命令式语言:使用最多的,如:C/C++/Java/VB/Pascal等所有主流语言。主要是因为冯诺依曼计算机模型(处理器负责计算,内存负责存储中间结果)。
   * 面向对象语言:基于数据抽象的封装,提出类、对象、继承、动态绑定等概念,用来模拟问题领域出现的事物。C++/Java最好的例子了。
   * 函数式语言:这种类型的语言是基于阿隆佐·邱器(Alozo Church,阿兰·图灵的师傅)提出的lamda演算,语言中一切皆函数。Lisp就是典型的函数式语言。
   * 逻辑语言:基于谓词演算,可以进行逻辑推理的语言,如:Prolog(这种类型的语言至今还没用过,只是听说过大名~~)
  
  
    命令式语言的学习思路:
  
   1. 名字、变量、绑定
  
   * 名字是否大小写敏感?那些是关键字?那些是保留字?
   * 变量六个基本属性:名字、地址、类型、值、生存期(时间)、作用域(空间)
   * 变量类型检查?强类型吗?
   * 变量的作用域如何?静态作用域、快、动态作用域?
   * 变量的生存期如何?精通变量、栈动态变量、显示堆动态变量、隐式堆动态变量(垃圾回收)?
  
   2. 数据类型
  
   * 基本类型:数值类型(整数、浮点数、复数、小数)、布尔类型、字符类型
   * 字符串类型
   * 序数类型:枚举、子范围类型
   * 数组类型
   * 关联数组
   * 记录类型
   * 联合类型
   * 指针类型
   * 引用类型
  
   3. 表达式与赋值语句
  
   * 算术表达式
   * 关系表达式
   * 布尔表达式
   * 操作符号的优先级、结合性
   * 操作符号的重载
   * 赋值语句:简单赋值、条件目标、符合复合赋值操作符、列表赋值、混合模式赋值
  
   4. 控制结构
  
   * 选择语句:双向选择语句(if... else ...)、多向选择语句(switch .. case ..)
   * 循环语句:计数器循环(for ...)、逻辑控制循环(while)、用户定位的控制循环(break、continue)
   * 无条件跳转(goto)
  
   5. 子程序(过程抽象)
  
   * 过程
   * 函数
   * 参数传递语义模式:输入形、输出型、输入输出型
   * 参数传递实现模式:按值传递、按结果传递、按值与结果传递、按引用传递
   * 参数的类型检查
   * 局部引用环境:局部变量、嵌套子程序
   * 重载子程序
   * 通用子程序(如:C++函数模板)
  
   6. 面向对象的程序设计(数据抽象)
  
   * 抽象数据类型
   * 继承
   * 动态绑定
  
  
    以上大概列举了一个语言的所有特性,有些语言支持、有些语言不支持。语法不尽相同,但语义一般都是相同的。只要按着上面列举的顺序,确定好某一种语言的语法形式,我相信你我都会很容易学会一门新的语言。上述的仅仅是学会了一门程序设计语言,为了解决实际问题其实我们还面临着无尽的长路,问题的模式和相应的程序语言库等都需要慢慢去熟悉和学习。
  
    所以我认为,精通一门语言并不代表着你会用那种语言写一些不算糟糕的程序,还意味着必须知道常见的问题模式及其对应的程序库,并且烂熟于心,遇到问题时候很自然地就会用到它。当然每种语言还有它独有的一些技巧和使用注意事项,对这些也要必须有所了解。千万不要自称:“我精通xxx语言”,其实我们只是“会”用它写一些程序而已,所谓的精通者必定对这门语言有着极其深刻的理解和认识、甚至编译器效率,各种细微之处也了然于胸。(以上仅为个人观点)
  


  在读,不求甚解
  只因为很多内容不能在自己的脑海中形成自己的体系,一些基本功有所欠缺所致
  读到中间部分了,对于程序设计语言的历史,一些程序语言的特点及一些常见结构的形成原因有所了解,比如字符串,知道为什么会有字符串这个数据类型,在不同的语言中对于这个数据类型的实现有什么区别,他们是基于什么样的考虑从而得到最后这样的实现的。
  可能会在读完后先放放,过段时间再温习,也许那时会有更多的体会。
  
  


  我有个“坏习惯”:碰到我买到的书都要评论,呵呵。
  
  《概念》我也买了,不过买的是第 5 版的英文版。这本书我比较欣赏的是她介绍语言发展的部分《Evolution of the Major Programming Languages》(即:《主流程序设计语言的演化》),从我之前听都没听过的 Zuse Plankalkal 到现在的主流语言,即有我熟知的汇编、C/C++、Basic,也有我浅闻的 Fortran、Eiffel、Ada、Pascal、LISP、Shcema 等,等于是把我零散的概念全部串接在了一切。
  
  对于一些熟知的编程概念,像什么“数组”、“变量”、“作用域”、“结构”、“类”、“对象”之类的,书中都有阐述其原理及其新旧实现方法。当然,这些实现方法只是“概念”,如果要学习实际的实现方法,这本书显然不怎么适合。
  
  正如“Reasons for Studying Concepts of Programming Languages”(即“学习程序设计语言概念的理由”)一章中说的那样,学习这些,可以更好地学习一门新的编程语言,更好地理解现有的编程概念。至少对于我,这些是成立的。
  
  有点不爽的是,我买回去的时候发现有一页是被撕毁栏的(但还可拼接起来)……虽然可以更换,可一算算车费几乎都可以再买一本了,只好怏怏地用胶布贴起来了事了。算是我读这本书的一段小插曲,呵呵
  
  顺便说一句,经典的书都好贵啊……


语言均是用于沟通。程序语言用以与计算机沟通,不同的语言有不同的语法和类库,不同的语言有各自不同的领域。


相关图书