程序设计语言_第1页
程序设计语言_第2页
程序设计语言_第3页
程序设计语言_第4页
程序设计语言_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章引言目录1.1语言设计的艺术1.2程序设计语言的谱系1.3为什么研究程序设计语言1.4编译和解释1.5程序设计的环境1.6编译概览语言直观上的发展

—以求最大公约数为例机器语言:语言直观上的发展

—以求最大公约数为例汇编语言语言直观上的发展

—以求最大公约数为例C语言intmain(){intI=getint(),j=getint();while(i!=j){if(i>j)i=i-j;elsej=j–i;}print(i);}1.1语言设计的艺术

为什么会有这么多语言呢?发展进步:控制机制-循环、case语句-嵌套块结构-面

向对象结构特殊用途:不同语言是为了不同的目的开发的个人偏爱:1.1语言设计的艺术是什么使一个语言成功呢表达能力:核心论调新人容易上手:Basic、Logo、Pascal、Java易于实现:有很好的编译器经济、支持者和惯性1.2程序设计语言的谱系

许多现存的语言都可以基于其计算模型加以分类。说明式关注计算机做什么,命令式语言关注计算机如何去做要求它做的事情。函数式语言采用一种递归表示的函数定义的计算模型,程序被看作是一种从输入到输出的函数,基于一些更简单的函数,通过一种逐步精化的方式定义。数据流语言将计算看成在一些基本的功能结点之间流动的信息流。提供了一种内在的并行模型:结点由输入单词的到达触发,能够并行操作。逻辑式或基于限制的语言由命题逻辑得到灵感,把计算看作是通过一种目标引导的搜索,设法根据逻辑规则找到满足某些特定关系的值。1.2程序设计语言的谱系

冯·诺依曼语言的基础是语句,通过修改存储器里的值的方式影响后续的计算。面向对象语言在存储和计算两方面都采纳了一种更加结构化和分布式的模型。它看作是一些比较独立的对象的相互作用,每个对象都有其自身的内部状态,以及一些管理这种状态的可执行的函数。1.2程序设计语言的谱系

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

理解那些比较困难的特征。从不同可能性中选择适当的方式去表达事物更好地使用排错系统、汇编器、连接器和其他有关工具。在缺乏某些有用特征的语言里模拟这些特征。1.4编译和解释

高级语言里一个程序的编译和执行大致是如下的情况:编译器将高级语言源程序翻译成与之等价的目标程序,而后就隐退了。在随后的某个任意时刻,用户可以告诉操作系统去运行这个目标程序。编译器完全掌控着整个的编译过程,而目标程序在执行中完全控制着自己的活动。编译器本身也是一个机器语言程序,或许是由另外的某个高级语言程序编译而成的。在按照某种操作系统能理解的格式写入文件时,机器语言的程序常被称为目标代码。1.4编译和解释实现高级语言的另一种方式称为解释:执行过程完全由解释器控制。从效果看,解释器实现了一台虚拟的机器,其“机器语言”就是这里的高级程序设计语言。1.4编译和解释解释器和编译器的对比解释器灵活性高,能对程序做出更好的诊断,生成更好的错误信息编译器能带来更好的性能。编译时做出的决策在运行时就不需要再去进行。1.4编译和解释许多语言实现采用的是解释和编译两者混合的形式。典型情况如下图所示:早期:代码——编译——执行,或者代码——解释——执行中期:代码——编译——解释(JVM)——执行发展趋势:代码——编译——解释(JVN采用JIT优化技术)——执行以Fortran语言为例,编译器需要依靠连接器把它所需的库结合到最后的程序里:A—B—C—D单独编译,通过连接器进行连接。1.4编译和解释C的编译过程:黑板上说吧。。太复杂了。。1.4编译和解释1.5程序设计的环境

早期:Unix里的各种程序设计工具通常是独立执行的,需要用户显示地去调用。现在的趋势:开发更加集成化的环境,把各种各样的工具以某种更紧密的方式结合在一起。1.6编译概览

该图为编译的各个阶段。各个阶段列在右边,在各个阶段之间传递的信息的形式列在左边。扫描又称为词法分析,主要作用就是为了简化分析器的工作,它能减小输入的规模并删除额外的字符。如要生成表格,要给各个单词做好行列位置标记。1.6.1词法和语法分析1.6.1词法和语法分析intmain(){intI=getint(),j=getint();while(i!=j){if(i>j)i=i-j;elsej=j–i;}print(i);}扫描和语法分析的作用是识别程序的结构,不管它们的语义。扫描器读入一个个字符,并将他们组合成单词,也就是程序的最小单位。上述代码经过扫描的单词是:1.6.1词法和语法分析intmain(){inti=getint(),j=getint();while(i!=j){if(i>j)i=i-j;elsej=j-i;}putint(i);}语法分析阶段将得到的单词组织成一棵语法分析树,这棵树用程序的各个组成部分标明其高层结构。这些部分是通过一组可能递归的上下文无关文法的规则定义的。每条规则都有一个箭头符号,左边是结构名称,右边是其可能的扩展。例子:一个while的循环结构,其内部包含布尔表达式iteration-statement(迭代结构)while(expression)statementstatement

compound-statement(复合语句)compound-statement{block-item-list_opt(可选语句块)}whereblock-item-list_optblock-item-list(语句列表)orblock-item-list_optɛ(空串)and(迭代定义语句列表)block-item-listblock-item(一条语句)block-item-listblock-item-listblock-item(语句列表+一条语句)1.6.1词法和语法分析语法分析树以while循环为例,解释语法分析树:黑板上说吧。。太复杂了。。1.6.2语义分析和中间代码生成语义分析就是确定程序的意义。编译的语义分析阶段需要识别出什么时候同一单词的多个出现引用的是同一个程序实体,并要保证这些使用的相容性。语义分析器通常构造并维护着一个符号表数据结构。符号表把每个标识符映射到有关它的已知信息。利用符号表,语义分析器就能贯彻执行许多分析规则,这是上下文无关文法和语法分析树无法表示的。例1:Iamaboy.例2:intx,y;structTz;z=x+y;1.6.2语义分析和中间代码生成1.6.2语义分析和中间代码生成符号表的检查并确定:每个标识符在使用之前都已有定义;没有标识符被用在不合适的上下文中(比如不同类型的变量相加减);为子程序调用提供的是数目和类型都正确的实际参数;case语句各个分支的标号是互不相同的常数;每个函数里至少包含了一个刻画返回值的语句。1.6.2语义分析和中间代码生成在运行时检查的语义称为语言的动态语义。规则包括:除非变量已经被给定了一个值,否则它绝不会在表达式里使用;除非指针已经约束到一个合法的对象,否则它绝不会被引用;数组的下标表达式的值在数组的范围之内;算数运算的结果不溢出1.6.3目标代码生成编译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论