“程序设计语言原理”作业
  • 务必标明姓名和学号。算法请尽可能写得清晰规整,加上必要的注释
  • 作业应按时独立完成,在要求的截止日前交。超时一周内成绩减1/3,一周外减2/3
  • 电子版作业(DOC或PDF格式,应该能用Word 2000或Acrobat Reader 5.0阅读),请通过email的附件发到qzy@math.pku.edu.cn。纸版作业请上课时交,或者投入我在数学学院的信箱(103号信箱)
  • 要求阅读的文献可以在文献汇编网页找到
  • 发来文件的名字请用“学号_姓名_日期”的形式,以便整理和批改。谢谢!
序号布置日期 提交日期 作业内容
52.13 4.29 1,请找一个你常用的 C 语言系统,写程序设法确定其中函数参数的求值顺序。修改你的程序,包括:让函数具有不同类型的参数(如结构参数等),将另一函数的调用直接作为实参表达式,用调试模式和不同的优化方式编译并运行程序等。设法判断这个编译器是否总采用同样的求值顺序。

2 (Pragmatics 8.12),如果要设计一种命令式的程序设计语言,你将选择哪些参数模型?为什么?

3,(a) 有人建议废料收集器应提供 delete 操作作为一种优化,使人可以显式删除不再用的对象,使程序员可以免除让废料收集器自动寻找和回收这些对象的麻烦,从而可能提高性能。请讨论这一建议。(b) 也有另一种建议:应允许程序员明确要求 "保留" 一个对象,使它再也不被考虑回收。你认为这两个建议是好主意吗?

4,请找出三种有异常机制的语言,查看其中的预定义异常,也就是由语言的实现自动引发的异常。请讨论不同语言所定义的集合之间的差异。如果你设计一种语言的异常处理功能,你会选择将哪些异常作为预定义的?为什么?

43.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)标准里的各种整数类型(包括通过标准库提供的整数类型),总结其中的规定,讨论这些类型之间的关系,包括类型等价、相容和转换等关系。

33.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)中选一种语言,尽可能详尽地描述其各方面的作用域规则。请关注语言里的各种名字,以及各种与名字使用有关的结构。请特别关注其中有关嵌套类的作用域规定。还请关注其中的泛型特征。(想想为什么语言设计者这样规定,尽可能给出一些分析和说明。)

22.23 3.10
  1. 请用扩展的 BNF 描述 C 语言里语句的结构
    • 假定有语法类 <exp> 表示一般表达式,<s-exp> 表示可用于 switch 标号的静态表达式
    • 查阅 C 语言的规范,尽可能保证你的描述反映了 C 语言规范的要求
    • 请说明 C 程序的哪些结构要求没有在你的描述中反映出来?如果有,请说明为什么无法描述。
  2. 查阅 Java 语言的相关规范,总结 Java 字节码程序的基本结构,说明其中除代码之外还包含那些信息(特别是符号表方面的信息),分析这些信息的用途。
12.13 2.26 阅读文献并写出简单的文献报告(文章可在参考文献网页找到):

从下面两篇文献中选一篇

  • Why Undergraduates Should Learn the Principles of Programming Languages
  • PL Course: Discussion Summaries and Recommendations
从下面文献中选一篇
  • John Backus, Can Programming Be Liberated from the von Neumann Style?
  • C.A.R. Hoare, Hints on Programming Language Design
  • Brian W. Kernighan, Why Pascal is Not My Favorite Programming Language
  • Niklaus Wirth, On the Design of Programming Languages
  • Peter Wegner, Programming Languages -- The First 25 Years
  • John K. Ousterhout, Scripting: Higher Level Programming for the 21st Century
  • Philip Wadler, 1) Proofs are Programs: 19th Century Logic and 21st Century Computing, 2) From Frege to Gosling: 19'th century logic and 21'st century programming languages
另外,请简单写出你的想法,谈谈你学习本课程的目的,想通过这个学习了解什么。
本页及相关页面(除另声明者外)由裘宗燕创建维护,可自由用于各种学习活动。其他使用需得到作者许可。