“程序设计语言原理”作业 |
|
序号 | 布置日期 | 提交日期 | 作业内容 |
5 | 2.13 | 4.29 |
1,请找一个你常用的 C 语言系统,写程序设法确定其中函数参数的求值顺序。修改你的程序,包括:让函数具有不同类型的参数(如结构参数等),将另一函数的调用直接作为实参表达式,用调试模式和不同的优化方式编译并运行程序等。设法判断这个编译器是否总采用同样的求值顺序。 2 (Pragmatics 8.12),如果要设计一种命令式的程序设计语言,你将选择哪些参数模型?为什么? 3,(a) 有人建议废料收集器应提供 delete 操作作为一种优化,使人可以显式删除不再用的对象,使程序员可以免除让废料收集器自动寻找和回收这些对象的麻烦,从而可能提高性能。请讨论这一建议。(b) 也有另一种建议:应允许程序员明确要求 "保留" 一个对象,使它再也不被考虑回收。你认为这两个建议是好主意吗? 4,请找出三种有异常机制的语言,查看其中的预定义异常,也就是由语言的实现自动引发的异常。请讨论不同语言所定义的集合之间的差异。如果你设计一种语言的异常处理功能,你会选择将哪些异常作为预定义的?为什么? |
4 | 3.26 | 4.8 |
1,请考虑下面的C代码段:
{ int a, b, c; ... { int d, e; ... { int f; ... } ... } ... { int g, h, i; ... } ... }假定每个整型变量占4个字节,这段代码里的所有变量共计需要多少空间?如何分配既能保证语义正确,又能使所用存储达到最小?请描述一个算法,编译器可以用它为任意嵌套的块里的变量确定存储分配和在栈帧里的偏移量,且保证空间的最小化。 2,检查系统手册和帮助信息,设计几个 C 语言结构和数组做试验,设法确定你用的 C 语言系统的各方面对齐规则。 3,请考虑实现一种动态检查,它能在运行中捕捉对 C 的 union 一类无标记变体的错误使用。 请说明需要在运行中保存的信息,以及操作中如何处理和检查(例如赋值和取值等操作)。设法尽可能减少运行中的代价(空间和时间)。你认为值得这样做吗? 4,在讨论指针问题时,通常都隐含假定了指向堆里的指针总指着动态分配块的开始。某些语言(包括 Algol 68 和 C 等)允许指针指向堆分配块内部的数据。如果要实现对悬空引用的动态语义检查或自动废料收集,这种 "指向内部的指针" 的存在将怎样使任务复杂化?你觉得这种情况可能如何处理? 5,请考察 ANSI C 和 C99(或者再加上最新的 C11)标准里的各种整数类型(包括通过标准库提供的整数类型),总结其中的规定,讨论这些类型之间的关系,包括类型等价、相容和转换等关系。 |
3 | 3.11 | 3.25 |
1,(Pragmatics, 3.11), 考虑下面伪代码。如果有关的语言采用静态作用域规则,这个程序将打印出什么?如果采用的是动态作用域规则呢?为什么?
x : integer -- global procedure set_x (n : integer) x := n procedure print_x write_integer (x) procedure first x : integer := 3 print_x set_x(1) print_x procedure second set_x(2) print_x set_x(0) first print_x second print_x这里的无参函数(定义和调用)没写括号,退格表示过程体,“--”之后是注释。请简单解释为什么会出现所说的情况。 2,(Pragmatics, 3.6), 从你熟悉的程序设计语言里找出三个具体例子,在执行到达程序里的某个(某些)位置时,在这里某些变量并不在其作用域,但这些变量却还存在。(请给出解释,说明情况) 3,在 C++(按1998年或2010年的标准文本)和 Java(SE6或SE7)中选一种语言,尽可能详尽地描述其各方面的作用域规则。请关注语言里的各种名字,以及各种与名字使用有关的结构。请特别关注其中有关嵌套类的作用域规定。还请关注其中的泛型特征。(想想为什么语言设计者这样规定,尽可能给出一些分析和说明。)
|
2 | 2.23 | 3.10 |
|
1 | 2.13 | 2.26 | 阅读文献并写出简单的文献报告(文章可在参考文献网页找到): 从下面两篇文献中选一篇
|
本页及相关页面(除另声明者外)由裘宗燕创建维护,可自由用于各种学习活动。其他使用需得到作者许可。 |