几个简答题

[quote="某题目"][img]http://dl.iteye.com/upload/attachment/386210/b6bac6dc-8cf5-36e4-90ed-6d7bd1066cac.jpg[/img][/quote]

[quote="龙书"]In addition to a compiler, several other programs may be required to create an executable target program, as shown in Fig. 1 .5. A source program may be divided into modules stored in separate files. The task of collecting the source program is sometimes entrusted to a separate program, called a preprocessor. The preprocessor may also expand shorthands, called macros, into source language statements.

The modified source program is then fed to a compiler. The compiler may produce an assembly-language program as its output, because assembly language is easier to produce as output and is easier to debug. The assembly language is then processed by a program called an assembler that produces relocatable machine code as its output.[/quote]

嗯,帮朋友回答几个问题,太长了不方便发推,所以发这里了。

1、编译器一般不直接生成机器码,而是先生成汇编,再由汇编器转换为机器码。请简述其理由。

答:
因为汇编比机器码更容易生成一些,先生成汇编再转换为机器码有助将功能划分开,提高模块性。
汇编中可以保留符号信息,不必将最终的地址(或一些偏移量)计算出来;而机器码自身已经完全失去了符号信息,例如跳转目标必须是明确的数值形式的地址或偏移量。高级的汇编中也可以声明和使用宏,也可用于简化特定领域的代码生成过程。

2、编译器一般都有不进行优化以及进行优化两种模式。请简述其理由。

答:
首先,编译器要保证在翻译过程中保持语义的正确性。由于不进行优化时编译器做的是比较直观的翻译,其正确性容易得到保证。相对的,优化可能带来语义的偏差,所以在编译器开发中常以不优化的编译结果作为基准,对比验证优化的编译结果是否有bug。

其次,不优化的代码易于调试。由于优化过程中可能将原本用户代码中的一些变量削除掉,或者是将用户代码中的运算顺序打乱,这些都不利于调试。

第三,不进行优化比进行优化的编译速度高许多。

3、C语言编译器中的预处理器被认为可降低编译器的开发成本。请简述其理由。

答:
C语言通过预处理器来完成源码的引用、包含,便于将源码分散在不同源文件中;同时C语言的预处理器还实现了条件编译和宏的功能,可以实质上扩展C的语法;预处理器还会将注释剥离掉。经过预处理,编译器的后续部分就不需要关注源文件间的相互引用,只会看到完全符合C语言的语法的源码,简化了后续处理过程。

4、普通的Java语言编译器没有与C语言的预处理器对等的部分。请简述其理由。

答:
因为Java语言的功能与设计思路与C语言有差别,不需要像C语言一样使用预处理器。

首先,Java语言自身就有良好的分离编译的支持,每个源文件(*.java)就是一个编译单元(compilation unit);有依赖关系的源文件的编译,可以将相关的源文件一起交给编译器以便提供足够的符号信息,也可以单独编译其中一部分源码生成出Class文件,然后将这些Class文件交给编译器为剩下的源码的编译提供符号信息。因此,Java不需要通过预处理器来解决源文件间的引用、包含。

其次,Java语言通过if语句实现了条件编译,不像C语言需要使用预处理器指令(preprocessor directives)来实现条件编译。

第三,Java语言鼓励使用统一的语法,通过类、接口、方法等手段实现抽象,而不鼓励在源码中使用别的简写形式。因而Java语言没有实现类似C语言的宏,也就不需要相应的预处理。

============================================================

こんな解答しか出さなくてごめんね…`(°д°)′
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值