绵阳微网站制作,兰州网站建设开发,网络产品推广方案范文,搭建网站是什么重点关注过程式程序设计语言编译程序的构造原理和技术 1 程序设计语言
1.1 依据不同范型
过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-or… 重点关注过程式程序设计语言编译程序的构造原理和技术 1 程序设计语言
1.1 依据不同范型
过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-oriented programming languages)程序中指明如何完成一个计算任务程序中指明要进行哪些计算事实推理规则支持面向对象编程FORTRAN, PASCAL, CLISP, HASKELL, ML, OCAML, SCALA…PROLOGSmalltalk, Java, C, Eiffel, Ruby说明式语言(Declarative programming): 与上述命令式(Imperative language) 不同没有控制结构甚至没有赋值仅有问题说明或者 说纯数学定义
1.2 依据不同转化方式
编译型语言解释型语言混合型语言需通过编译器compiler将源代码编译成机器码之后才能执行的语言。一般需经过编译compile、链接linker这两个步骤。编译是把源代码编译成机器码链接是把各个模块的机器码和依赖库串连起来生成可执行文件。不需要编译相比编译型语言省了道工序解释性语言在运行程序的时候才逐行翻译。比如C#,C#在编译的时候不是直接编译成机器码而是中间码.NET平台提供了中间语言运行库运行中间码中间语言运行库类似于Java虚拟机。.net在编译成IL代码后保存在dll中首次运行时由JIT在编译成机器码缓存在内存中下次直接执行博友回复指出。优点编译器一般会有预编译的过程对代码进行优化。因为编译只做一次运行时不需要编译所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。优点有良好的平台兼容性在任何环境中都可以运行前提是安装了解释器虚拟机。灵活修改代码的时候直接修改就可以可以快速部署不用停机维护。缺点编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码不同的操作系统之间移植就会有问题需要根据运行的操作系统环境编译不同的可执行文件。缺点每次运行的时候都要解释一遍性能上不如编译型语言。代表语言C、C、Pascal、swift代表语言JavaScript、Python、Erlang、PHP、Perl、RubyJava先生成字节码再在Java虚拟机中解释执行。
不同的程序设计语言机制(函数式、过程式、逻辑式、对象式)需要采用不同的技术编写编译程序,过程式语言的编译是对象式语言编译的基础
1.3 另一种角度
动态类型语言Dynamically Typed Language静态类型语言Statically Typed强类型定义语言Explicit type弱类型定义语言Implicit type编译时不知道变量类型运行时才决定类型错误属于运行错误运行时报错编译时候决定变量类型错误属于语法错误编译器报错偏向于不容忍隐式类型转换偏向于容忍隐式类型转换 2 编译器概述
编译器(Compiler) 将某种语言(源语言)编写的程序翻译成语义等价的另一种语言(目标语言)编写的程序 依据目标程序的类型
目标程序若是可执行的机器语言程序目标程序若是汇编语言的程序可以被用户调用处理输入并产生输出。则须经汇编器汇编后方可执行
编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。
2.1 编译器的翻译包括哪些步骤
阅读并理解程序准确地确定需要采取什么行动弄清楚如何忠实地执行这些行动指示计算机执行这些步骤
[[编译器概述.excalidraw|示例图]]
2.2 编译程序的伙伴程序
编辑器 (editor)预处理器(preprocessor)汇编程序(assembler)连接程序(linker)装入程序(loader)除一般的文本编辑功能外还可以对正在编辑的文本进行分析、提示、自动提供关键字匹配等功能删除源程序中的注释、执行宏替换以及包含文件的嵌入等将编译程序生成的汇编代码汇编成机器代码将不同的目标文件连接到一个可执行的文件中将程序加载到内存中以便执行
3 编译器的组成
3.1 自然语言翻译过程总结
掌握源语言和目标语言词法、语法和语义 翻译过程包括
分析源句子是否正确将句子翻译成目标语言拼写包括识别单词及其属性依据源语言的语法建立语法结构检查句子是否有意义翻译每个语法部分将其组合成有意义的目标语言句子
3.2 编译器组成模块 [!Note]- 分析部分 源程序 - 语法结构 - 中间表示搜集源程序中的相关信息放入符号表分析、定位程序中可能存在的错误信息语法、语义错误又称编译器的前端front end是于机器无关的部分 符号表管理词法分析/扫描lexical analysis, scanning语法分析语义分析记录源程序中使用的变量的名字收集各种属性名字的存储分配类型作用域过程名字的参数数量、参数类型等等1.读入源程序的字符流输出有意义的词素(lexeme)。基于词素产生词法单元token token-name, attribute-value2.关于token程序语言处理的最小单位token-name由语法分析步骤使用attribute-value指向相应的符号表条目由语义分析/代码生成步骤使用1.词法分析后需要得到词素序列的语法结构2.语法分析/解析syntax analysis/parsing:sentence是对单词的再次重组,程序设计语言规定了词法单元、语句的重组规则 — 语句的类别.使用语法树和符号表中的信息检查源程序是否满足语言定义的语义约束。同时收集类型信息用于代码生成。类型检查类型转换。符号表可由编译器的各个步骤使用程序语言规定了单词构成的规则和单词类别根据各个词法单元的第一个分量来创建树形中间表示形式。通常是语法树syntax tree/parse tree指出了词法单元流的语法结构 [!Note]- 合成部分 根据符号表和中间表示构造目标程序又称编译器的后端back end是于机器相关的部分 中间代码生成代码优化目标代码生成根据语义分析的输出生成类机器语言的中间表示通过对中间代码的分析改进中间代码得到更好的目标代码快、短、能耗低把中间表示形式映射到目标语言寄存器的分配指令选择内存分配三地址代码每个指令最多包含三个运算分量优化有具体的设计目标
3.3 编译器的趟Pass
趟Pass以文件为输入输出单位的编译过程的个数每趟可由一个或若干个步骤构成。就是对源程序或源程序的中间表示形式从头到尾扫描一次并作加工处理生成新的中间结果或目标程序。
可以词法分析、语法分析、语义分析等阶段各作为单独一趟也可以词法分析作为语法分析的子程序还可以整个编译程序一遍扫描完成
与编译器组成模块的关系前者作为“步骤”是逻辑组织方式“趟”和具体的实现相关
4 解释器
定义解释器(Interpreter)解释器直接利用用户提供的输入执行源程序中指定的操作。 解释过程中若发现错误则返回修改源程序修改后重新解释执行。解释器与编译器的区别理解解释器可以直接输出结果而编译器最终的输出是一个目标程序是把一种程序设计语言翻译成另外一种语言编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。
4.1 解释器与编译器的比较 二者比较
相同点区别使用相同的实现技术实现机制: 翻译 (程序 to 程序)vs. 解释(指令 to 指令序列)
二者特点
解释器编译器可移植性好支持交互式程序设计边解释边执行错误诊断效果好效率高一次编译多次运行存储代价小目标程序的执行速度比解释器快很多
二者结合的一种应用Java javac 前端编译器先编译成字节码(bytecode, .class文件)由JVM解释执行可移植性好JIT即时编译器just-in-time compiling为了提高热点代码的执行效率在运行时虚拟机将会把这些代码编译成与本地平台相关的机器码并进行各层次的优化(判断热点代码的方法基于采样的热点探测基于计数器的热点探测) 5 构建Build构建工具Make与编译的关系
代码变成可执行文件叫做编译compile安排编译的顺序叫做构建buildMake是最常用的构建工具诞生于1977年主要用于C语言的项目实际上任何只要某个文件有变化就要重新构建的项目都可以用Make构建构建规则都写在Makefile, “make [选项][参数]”
6 编译器的实现
编译器的开发代价是非常昂贵的在可能的情况下可以将一种语言的程序转换成另一种语言的程序利用另一种语言的编译器进行编译。
前提条件两种语言在语法和语义上很近似或者一种语言是另一种语言的扩展实例C — C