PL/0语言编译系统

PL/0语言编译系统是世界著名科学家N.Wirth 编写的,它是由编译程序和解释程序两部分组成的,PL/0编译程序的源语言为PL/0,目标语言是一个类P-code的代码

PL/0语言编译系统由编译程序和解释程序两部分组成,分别称为PL/0编译程序和类P-code解释程序。PL/0语言程序会被PL/0编译程序转换为等价的类P-code程序,当编译程序正常结束的时候,PL/0语言编译系统会调用解释程序(也称类P-code虚拟机),解释执行所生成的目标程序

这里写图片描述

PL/0编译程序会将PL/0源程序翻译成类P-code目标程序,源语言就是PL/0,目标语言为P-code。PL/0的编译程序可以用C、Pascal或是Java等各种语言书写

类P-code语言是PL/0的编译程序的目标程序,可以看作是类P-code虚拟机的汇编语言。类P-code虚拟机是一种简单的纯栈式结构的机器,它有一个栈式存储器,有4个控制寄存器:指令寄存器i、指令地址寄存器p、栈顶寄存器t和基地址寄存器b,类P-code程序运行期间的数据存储和算术以及逻辑运算都在栈顶进行

类P-code虚拟机的指令格式如下所示

F L A

它由3个部分构成
F: 指令的操作码
L: 若起作用,则表示引用层与表明层之间的层次差,若不起作用,则置为0
A: 不同的指令含义不同

PL/0编译程序采用的是单遍扫描方式的编译过程,由词法分析程序、语法分析程序以及代码生成程序3个独立的过程组成

PL/0编译程序以语法语义分析程序为核心,当语法分析需要读单词时就去调用词法分析程序,而当语法语义分析正确需要生成相应语义成分的目标代码时,就去调用代码生成程序

这里写图片描述

当源程序编译编译出错的时候,PL/0编译程序就会用出错处理程序对词法和语法语义分析遇到的错误给出在源程序中出错的位置和错误性质。当源程序编译正确的时候,编译程序正常结束,可输出相应的类P-code目标程序

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在《算法+数据结构=程序》一书中,Niklaus Wirth 设计的 PL/0 语言编译器分成两部分,把源语言翻译成中间语言的编译器和中间语言解释器,编译器用的是递归下降的预测分析方法中间语言是一种栈机器代码,其指令集是根据 PL/0 语言的需要来设计的。编译器源码及测试程序可从。一条指令由三个域组成: (1)操作码 f:上面已经列出了所有 8 种操作码。 (2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a 。该域仅用于存取指令和调用指令。 (3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。 编译器对 PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,编译器每编译完一个分程序,就列出该分程序的代码,这由编译器的 listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的代码(即绕过内嵌过程的代码)。listcode 过程没有列出这条代码。 解释器是编译器中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。 由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问。活动记录栈的栈顶以外的存储空间作为代码执行过程中所需要的计算栈,无需另外设立计算栈。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值