编译原理chapter10.pptVIP

  • 6
  • 0
  • 约1.09万字
  • 约 63页
  • 2016-12-29 发布于未知
  • 举报
数据空间的三种不同使用方法和管理方法 栈式存储分配的实现 参数传递 参数传递 知道一个语言使用的参数传递方法很重要,因为一个程序的结果依赖于所使用的方法。考察下图中的PASCAL程序,知道该程序的输出是a=2,b=1,如果将第3行的关键字var去掉,则该程序的输出是a=1,b=2。 因为有关键字var时,PASCAL语言的参数传递使用的方式是传地址,去掉var,则使用传值方式。 传值 传值(值调用),即计算出实参的值,然后把它传给被调过程。具体处理过程是: 1)形式参数当作过程的局部变量处理,即在被调用过程的活动记录中开辟形参的存储空间,这些存储位置就是所说的形式单元。 2)调用过程计算实参的值,并将它们的右值放在形式单元开辟的空间中。 3)被调用过程执行时,就象使用局部变量一样使用这些形式单元。 传值的重要特点是,对形式参数的任何计算不影响调用过程的活动记录中实参的值。也即在上图的程序中,如果第3行的关键字var去掉后,PASCAL将以传值方式将x和y传递给过程swap。 传值 第12行swap(a,b)调用过程将不会影响a和b的值。其等价于执行下列运算: x:=a y:=b temp:=x x:=y y:=temp 这里,x,y和temp局部于swap,虽然赋值改变了变量x,y和temp的值,但当控制从该调用返回而swap的该活动记录释放后,这些改变即消失,这种调用方式不影响调用过程的活动记录。 1 2 add_a: add_b: 调用者数据区 1 2 x: y: 被调用者数据区 执行完swap过程但还没有返回时 1 2 add_a: add_b: 调用者数据区 2 1 x: y: 被调用者数据区 执行完swap过程且返回后 1 2 add_a: add_b: 调用者数据区 被释放 被释放 x: y: 被调用者数据区 执行swap(a,b)时 传值 通过值调用的过程可由非局部量或由指针而对调用过程发生影响。比如下图中的C程序,x和y声明为整型指针,第10行调用swap(a,b)中的操作符导致将指向a和b指针传给过程swap。该程序的输出为:a=2,b=1 这个例子中的指针的使用恰好提示了一个编译程序怎样实现地址(引用)调用。 传地址 当参数通过引用传递时(也称作传地址或引用调用),调用过程传递给被调过程的是指针,指向实在参数存储位置的指针。 1)如实参是一个名字或具有左值的表达式,则左值本身传递过去; 2)如实参是一表达式,比如a+b或2,而没有左值,则表达式先求值,并存入某一位置,然后该位置的地址传递过去; 3)被调用过程中对形式参数的任何引用和赋值都通过传递到被调用过程的指针被处理成间接访问。例如,在上述的程序中,若用实参j和a[j]对过程swap进行调用,即 swap(j,a[j]),其效果如下面所述。若仍执行swap(a,b)调用,参数传递采用传地址方式的图示如下: 1 2 add_a: add_b: 调用者数据区 add_a add_b x: y: 被调用者数据区 执行完swap过程但还没有返回时 2 1 add_a: add_b: 调用者数据区 add_a add_b x: y: 被调用者数据区 执行完swap过程且返回后 2 1 add_a: add_b: 调用者数据区 被释放 被释放 x: y: 被调用者数据区 执行swap(a,b)时 code static data stack heap name storage value state environment 名字到存储、到值的映射 临时工作单元 局部变量 机器状态信息 存取链 控制链 实参 返回地址 1)临时工作单元:比如计算表达式过程中需要存放中间结果用的临时值单元; 2)局部变量:一个过程的局部变量; 3) 机器状态信息:容纳过程执行前机器状态的信息,诸如程序计数器、寄存器的值,这些值需要在控制从过程返回时给予恢复; 4)存取链:用以存取非局部变量,这些变量存放于其它过程活动记录中,并不是所有语言都需要; 5)控制链:指向调用该过程的那个过程的活动记录,这也不是所有语言都需要的; 6)实参:也称形式单元,由调用过程向该被调用过程提供实参的值或地址。当然在实际编译程序中,也常使用寄存器传递实参; 7)返回地址:保存该被调用过程返回后的地址。 但并不是所有的语言,所有的编译程序全部使用这些信息。上述各种信息域的大小,在编译时是已知的,如果局部变量中包含有可变数组,那么则采用前两章中介绍的内情向量,将内情向量置于过程活动记录中。另外,有些语言的编译程序还将参数个数存放于活动记录中,以便进行参数个数的检查。 一般

文档评论(0)

1亿VIP精品文档

相关文档