编译原理tests-chap1-1-overview
1.下面说法错误的是( )
A.编译器直接利用用户提供的输入执行源程序中指定的操作
B.编译器是将源语言翻译称为一个等价的、用目标语言编写的程序
C.把多个模块存放于多个独立文件中的源程序聚合在一起是由预处理器完成的
D.有些编译器产生汇编语言而不是机器语言是比较容易输出和调试
2.下面说法错误的是( )
A.编译过程包括生成目标代码或中间字节码,很多分析和优化工作是在程序运行之前完成的
B.静态计算与准备和优化程序有关,侧重于程序在运行之前的正确性和性能优化;动态计算则是程序运行时的实际行为,执行程序的任务并产生最终的计算结果
C.解释器不产生目标程序,每次都需要重新执行,速度慢
D.加载器把所有的可执行目标文件放在内存中执行,可以解决外部内存地址的问题
3.下面说法错误的是( )
A.编译器作为一种软件工具,广泛应用于程序语言的开发、优化和执行
B.编译原理紧密结合了算法和数据结构,因为编译器的设计和实现需要处理大量的数据转换和优化过程
C.编译器不需要考虑根据目标硬件生成高效的机器代码,这促使计算机体系结构与编译技术之间的紧密结合
D.Fortran 编译器的成功是软件工程的一大突破,它证明了通过设计和开发编译器,可以实现复杂语言的自动化处理
4.详细解释编译器和解释器之间的区别是什么。
5.把一种高级语言翻译成另一种高级语言的编译器称为源到源(source-to-source)的编译器。编译器使用C语言作为目标语言有什么好处?
答案:
1.A,解析:编译器的任务是将源程序翻译为目标语言(通常是机器代码或中间代码),而不是直接执行源程序中指定的操作。编译器仅负责编译工作,不直接执行程序。编译器会产生可执行程序,可执行程序执行之后才会有结果。题目描述的“直接利用用户提供的输入执行源程序中指定的操作”是解释器的作用。注意区别解释和编译:
- 编译:专指由高级语言转换为低级语言,整个程序翻译。常用的例如:c、c++,delphi,Fortran、Pascal、Ada
- 解释:接受某种高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这个句子的执行结果,然后再接受下一个语句。类似口译,一句一句进行解释。常用的例如:python 解释以源程序作为输入,不产生目标程序,一边解释一边执行。优点:直观易懂,结构简单,易于实现人机对话。缺点:效率低(不产生目标程序,每次都需要重新执行,速度慢)
2.D,解析:链接器可以解决外部内存地址的问题。加载器将目标程序加载到内存中,但它主要的任务是将程序加载到内存并设置程序的运行环境,而无法完全解决外部内存地址的问题。
3.C,解析:编译器必须考虑如何根据目标硬件生成高效的机器代码。目标硬件的不同会影响编译器如何优化代码(例如针对不同处理器架构的优化)。计算机体系结构与编译技术之间的紧密结合正是为了提高代码的执行效率,而不是忽视它。
4.参考答案:
Interpreter(解释器) compare(编译器) 程序步骤 1、创建代码 2、没有文件链接或机器代码生成 3、源语句在执行过程中逐行执行 1、创建代码 2、Compile将解析或分析所有语言语句的正确性。如果不正确,则抛出错误 3、如果没有错误,编译器将把源代码转换为机器码 4、它将不同的代码文件链接到一个可运行的程序(称为exe) 5、运行程序 Input(输入) 每次读取一行 整个程序 Output(输出) 不产生任何的中间代码 生成中间目标代码 工作机制 编译和执行同时进行 编译在执行之前完成 存储 不保存任何机器代码 存储编译后的机器代码在机器上 执行 程序执行是解释过程的一部分,因此是逐行执行的 程序执行与编译是分开的,它只在整个输出程序编译后执行 生成程序 不生成输出程序,所以他们在每次执行过程中都要评估源程序 生成可以独立于原始程序运行的输出程序(以exe的形式) 修改 直接修改就可运行 如果需要修改代码,则需要修改源代码,重新编译 运行速度 慢 快 内存 它需要较少的内存,因为它不创建中间对象代码 内存需求更多的是由于目标代码的创建 错误 解释器读取一条语句并显示错误(如果有的话)。你必须纠正错误才能解释下一行 编译器在编译时显示所有错误和警告。因此,不修正错误就不能运行程序 错误监测 容易 难 编程语言 PHP, Perl, Python, Ruby C, C++, C#, Scala, Java
编译器和解释器之间的主要区别
1、编译器将一个程序作为一个整体进行翻译,而解释器则一条一条地翻译一个程序
2、在编译器的情况下生成中间代码或目标代码。而解释器不创建中间代码
3、编译器比解释器要快得多,因为编译器一次完成整个程序,而解释器则是依次编译每一行代码
4、由于要生成目标代码,编译器比解释器需要更多的内存
5、编译器同时显示所有错误,很难检测错误,而解释器则逐个显示每条语句的错误,更容易检测错误
6、在编译器中,当程序中出现错误时,它会停止翻译,并在删除错误后重新翻译整个程序。相反,当解释器中发生错误时,它会阻止其翻译,在删除错误后,翻译将继续
7、在编译器中,这个过程需要两个步骤,首先将源代码翻译成目标程序,然后执行。而在解释器中,这是一个一次性的过程,源代码在编译和执行的同时
8、编译器用于编程语言,如C、c++、c#、Scala等。另一个解释器用于PHP、Ruby、Python等语言。
5.编译器使用 C语言 作为目标语言的优点包括:
- 简洁且高效:C 语言的语法简单,结构清晰,便于生成高效的机器代码。使用 C 语言作为目标语言可以减少编译器设计的复杂性,同时利用 C 编译器进行进一步的优化。
- 跨平台性:几乎所有的计算机系统都支持 C 语言,因此生成 C 语言代码的编译器可以轻松实现跨平台性,利用现有的 C 编译器生成不同平台的目标代码。
- 成熟的工具链:C 语言拥有强大的开发工具链(如编译器、调试器、优化器等),编译器可以直接利用这些工具来生成优化过的目标代码,简化了开发和调试过程。
- 易于调试:生成的 C 代码相对易于调试和理解,程序员可以通过调试 C 代码来查找并解决问题,而无需直接操作低级的汇编代码或机器代码。
- 兼容性:由于 C 语言在计算机体系结构中普遍存在,使用 C 语言可以保证与许多操作系统和硬件平台的兼容性,尤其是在构建操作系统、嵌入式系统和其他低层软件时。
总之,使用 C 语言作为目标语言使得编译器能够利用现有工具和平台的优势,并提供良好的性能、跨平台性以及调试支持。