Programming Language Pragmatics 课后题九、十 构造可运行程序 数据抽象和面向对象

前言

到这一部分是Core issues in language design
第九章讲了IF和编译连接,给出了Ada的Dinan和GNU的例子,介绍了名字解析,重定位,可执行,寄存器卸载,位置无关代码的概念
第十章就更有意思,数据抽象和面向对象
因为这一章内容太陈旧了,所以直接读英文原版了
题目只选了一部分放上来

…and dynamic method binding, which allows a new
version of an abstraction to display newly refined behavior, even when used in
a context that expects an earlier version.

第九章

复习

  1. 请解释什么是中间形式的层次,高级,中级或者低级IF比较起来,各有哪些优点和缺点?
    高级IF通常基于某种树或者有向无环图,它们直接表示现代程序设计语言的层次结构,高级IF有利于一些类的与机器无关的代码改进,递增式的程序更新、直接解释,以及高度依赖于源程序结构的其它操作。
    Pascal编译器/Java class字节码是另一种高级IF的形式:基于堆栈的IF,java字节码的紧凑性有利于通过低带宽的互联网传递小程序的时间,但是这种IF不能够很好的适应许多重要的代码改进,特别是在现代机器上的代码改进。
    中级IF是针对某种简单理想计算机的三地址指令集,这种机器通常有无限数量的寄存器,其中的典型指令描述了两个操作对象、一个操作符和一个目标,有时也把三地址指令称为四元组。

  2. 什么是Ada编译器里最常用的IF?
    Diana

  3. 请列举两种基于堆栈的IF,说明它们的一个缺点
    Pascal编译器/Java class字节码是另一种高级IF的形式:基于堆栈的IF,java字节码的紧凑性有利于通过低带宽的互联网传递小程序的时间,但是这种IF不能够很好的适应许多重要的代码改进,特别是在现代机器上的代码改进。

  4. 请用通俗的话描述GNU RTL
    RTL(寄存器变换语言)是GCC中类似指令的表达形式,动作例程将语句对应的语法树片段翻译到RTL,在每个子程序的最后,动作历程调用编译器的后序阶段,执行代码改进和目标代码生成。

  5. 请说明基于IF开发一个编译器族的合理性
    经典的M*N和M+N

  6. 请勾画后端编译器组织和结构的一些主要可能形式
    在这里插入图片描述

  7. 为什么一个编译器可能是使用多种IF?
    语义分析送给中间代码生成的语法树构成一种高级IF,包含汇编语言的控制流图是一种中级IF,目标机器的汇编语言作为一种低级IF。

  8. 什么是代码生成器的生成器?为什么它可能有用?

  9. 什么是基本块?
    语法树上的一些节点被组织成基本块,这种块由运行时可顺序执行的最长操作序列组成,没有分支进出。

  10. 什么是虚拟寄存器?它们有什么作用?
    基本块里的每个操作都用某个理想的带有无限个寄存器的RISC机器的指令表示,这种寄存器被称为虚拟寄存器。通过这种方式避免在编译过程中过早建立原本相互独立的计算之间的人为联系。

  11. 局部和全局代码改进之间的不同在什么地方?

  12. 什么是寄存器卸载?
    寄存器卸载就是卸载寄存器到内存

  13. 可重定位目标文件的标志特性是什么?可执行目标文件呢?
    可重定位目标文件作为连接器的输入,可以把它放入内存中运行。
    包含导入表:标明了一些指令,引用了某些命名位置;重定位表:引用了本文件的一些位置,在连接时必须被修改,以反映文件在最后的可执行文件中的偏移量;导出表:一些名字和它们在文件中相应位置的地址列表
    可执行目标文件不包含对外部符号的引用,可以是可重定位的。目标文件通常分为几个节,不同的节由链接器、装载器或者操作系统以不同的方式处理。

  14. 为什么通常用零来填充未初始化的数据页面?
    保证未初始化数据的可重现性,同样能够提高多用户系统的安全性。

  15. 请列出汇编器通常执行的四项工作
    1.把操作码和操作对象替换为在机器语言里的对应编码
    2.把符号名字替换为实际地址。
    3.将指令符号翻译到二进制

  16. 给出汇编器可能给出的三种伪指令和4种指示字的例子
    li lui ori 装载立即数 装载高位立即数 或立即数
    段开关:.data .text
    数据生成 .byte .half .word
    对齐 .align

  17. 为什么RISC汇编器可能需要执行最后一遍指令调度?
    因为有伪指令的存在,所以使用汇编器做指令调度能更好的填充附近的分支、装载和函数单元延迟的指令源。

  18. 请解释目标文件里绝对字和可重定位字的不同,为什么现在可重定位的概念更加复杂
    绝对字在汇编时已知,连接器不需要修改它们,可重定位字必须修改,需要给他加上当前目标文件的代码段或者数据段在最终程序中的地址。

  19. 什么是链接器的主要任务
    连接器负责把编译单元粘结到一起,连接工作涉及到两项子任务:重定位和外部引用解析。有些作者将重定位称为装载

  20. 链接器如何执行跨编译单元的类型检查?
    1.头文件符号引用 2.头文件ASCII刻画3.头文件散列检查和

  21. 链接器的哪些工作可以推迟到装载时做?这种动态链接有哪些优点和缺点?
    引用外部库文件的装载时重定位,优点是无需拷贝程序段,缺点是:
    每个程序都放置同样的地址,或者代码段中完全没有重定位字

  22. 什么是位置无关的代码?它有什么作用?编译器生产时要注意什么问题?
    不包含重定位字的代码段,可以将共享库连接到任何地址
    编译器必须:
    1.对所有分支指令采取相对于PC的寻址方式
    2.避免对于静态分配数据的绝对引用,必须在调用序列中设置基址寄存器
    3.对于PIC段之外的每个控制传递,以及对于相应数据段之外的静态存储的每次装载和保存,都要多做一层间接。
    任何调用进入动态连接共享库的子程序,都必须在其前序代码中保存全局指针寄存器,在调用进入动态连接的共享库之后恢复它。处理符号调用时,使用三指令序列替代jal跳入并连接的指令,在共享库中,使用两指令序列替代装载或保存数据的操作。

第十章

  • What is meant by an opaque export from a module?
    moduleopaqueclassprivate是一样的
  • Explain the significance of the this parameter in object-oriented languages.
    this在oo中用在非static方法里指代调用的对象,在C#中也可以用于Extending without Inheritance
    Ada95CLOS中没有this
    python和Ada2005中的this则是一种语法糖,两个参数会被解释为包括调用类在内的三个参数
  • Describe the notion of selective availability in Eiffel.
    Eiffel中,子类的可见性更加灵活,可以自由的增减其可见性

今天逛乎看到一篇回答,很有感触,看plp把也确实时这种低回报率的事情,哪里有背背八股文,接个单做个兼职钱来的爽来的快
但是我还是觉得程序员要在基础上打磨自己,还是觉得想要出国读研

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值