P-code机

✍ dations ◷ 2024-09-19 10:12:27 #Pascal,编译器软件

在计算机科学中,P-code机(英语:P-code machine)是一种被设计来运行P-code的虚拟机。P-code是一种被设计来运行在虚拟CPU上的汇编语言,即是我们现代所称Bytecode的前身。P-code机这个词可用于形容所有这类机器(例如Java虚拟机和MATLAB预编译的代码),或者特指最有名的P-code机,来自于Pascal语言,特别是UCSD Pascal实现。

虽然这个概念在1966左右年就已首次实现(于BCPL的O-code与Euler语言的P - a code),但P-code这个词直到70年代初才首次出现。1973年Nori, Ammann, Jensen, Hageli和Jacobi编写的Pascal-P编译器和1975年尼克劳斯·维尔特写的Pascal-S编译器是早期的两个生成P-code的编译器。

P-code可以是一种与特定硬件平台无关的中间码,一种虚拟机器代码。程序源代码会先被转换成P-code;转换成P-code的程序,之后会由一个软件来进行直译。这个软件可以模拟出一个假想的CPU来读取p-code,之后将p-code转换成实体机器代码来运行。但如果有足够的商业利益,可能可以实现做出该规格CPU的硬件实现(例如Pascal MicroEngine和Java处理器)。

如很多其他p-code机一样,UCSD p-Machine是一个堆栈结构机器,这意味着大多数指令从堆栈中获取它们的操作数,并将结果放回堆栈上面。因此,“add”指令将堆栈最顶部的两个元素替换成它们的和。有几条指令就取一个参数。像Pascal一样,p-code是强类型语言,原生支持boolean (b), character (c), integer (i), real (r), set (s)和pointer (a)类型。

一些简单的指令:

Insn.   Stack   Stack   Description        before  after adi      i1 i2   i1+i2   add two integersadr      r1 r2   r1+r2   add two realsdvi      i1 i2   i1/i2   integer divisioninn      i1 s1   b1      set membership; b1 = whether i1 is a member of s1ldci     i1      i1      load integer constantmov      a1      a2      movenot      b1      ~b1     boolean negation

环境

与其他基于堆栈的环境(如Forth和Java虚拟机)不同的是,p-系统非常类似于真正的目标CPU,它只有一个堆栈供过程栈帧(提过返回地址等)和局部指令参数共享。机器的其中三个寄存器指向这个堆栈(向上增加):

第五个寄存器 PC 指向当前指令的代码区。

栈帧是这样的:

EP ->      local stackSP -> ...      locals      ...      parameters      ...      return address (previous PC)      previous EP      dynamic link (previous MP)      static link (MP of surrounding procedure)MP -> function return value

程序调用序列的工作方式如下:下面指令引入调用

 mst n

其中 指定嵌套级别的差异(记得Pascal支持过程嵌套)。这个指令会这个堆栈,即在上述栈帧中保留起始地5个格子,并初始化前面的 EP、动态链接和静态链接。

尼克劳斯·维尔特在他1976年出的书《算法+数据结构=程序》中详述了一个简单的P-code机。这个机器有3个寄存器——一个程序计数器 p,一个基寄存器 b,和一个栈顶寄存器 t。一共有8个指令,其中一个(opr)有多种形式。

这是机器的Pascal代码:

const	levmax=3;	amax=2047; type 	fct=(lit,opr,lod,sto,cal,int,jmp,jpc);	instruction=packed record 		f:fct;		l:0..levmax;		a:0..amax;	end;procedure interpret;  const stacksize = 500;  var    p, b, t: integer; {program-, base-, topstack-registers}    i: instruction; {instruction register}    s: array  of integer; {datastore}  function base(l: integer): integer;    var b1: integer;  begin    b1 := b; {find base l levels down}    while l > 0 do begin      b1 := s;      l := l - 1    end;    base := b1  end {base};begin  writeln(' start pl/0');  t := 0; b := 1; p := 0;  s := 0; s := 0; s := 0;  repeat    i := code; p := p + 1;    with i do      case f of        lit: begin t := t + 1; s := a end;        opr:           case a of {operator}            0:               begin {return}                t := b - 1; p := s; b := s;              end;            1: s := -s;            2: begin t := t - 1; s := s + s end;            3: begin t := t - 1; s := s - s end;            4: begin t := t - 1; s := s * s end;            5: begin t := t - 1; s := s div s end;            6: s := ord(odd(s));            8: begin t := t - 1; s := ord(s = s) end;            9: begin t := t - 1; s := ord(s <> s) end;            10: begin t := t - 1; s := ord(s < s) end;            11: begin t := t - 1; s := ord(s >= s) end;            12: begin t := t - 1; s := ord(s > s) end;            13: begin t := t - 1; s := ord(s <= s) end;          end;        lod: begin t := t + 1; s := s end;        sto: begin s := s; writeln(s); t := t - 1 end;        cal:           begin {generate new block mark}            s := base(l); s := b; s := p;            b := t + 1; p := a          end;        int: t := t + a;        jmp: p := a;        jpc: begin if s = 0 then p := a; t := t - 1 end      end {with, case}  until p = 1;  writeln(' end pl/0');end {interpret};

这个机器是用来运行维尔特的PL/0的,一个为教学开发的Pascal子集编译器。

相关

  • 中彰投中彰投地区是指台湾中部濒台湾海峡的地区,由台中市、彰化县及南投县所构成,居住人口超过557万,聚集超过五分之一的台湾人口。拥有台中都会区等都会化地带,其余地区主要为制造业
  • 医心方《医心方》(日语:医心方、いしんぼう),共三十卷,日本丹波康赖所编成的医学著作,成书于982年,是日本现存最早的医书。此书以巢元方《诸病源候论》为底本,参酌《素问》、《千金方》等
  • 孙承宗《明人肖像集》之孙文忠像孙承宗(1563年-1638年),字稚绳,号恺阳,直隶高阳县西庄村(今属河北省)人。明朝政治、军事人物,榜眼及第,官至兵部尚书、东阁大学士。致仕后与清军战斗殉国。谥
  • 黑板树黑板树(学名:)又称象皮树、灯架树、糖胶树、乳木、魔神树等,属于夹竹桃科黑板树属(,又称“鸡骨常山属”)。常绿大乔木,其树体高大为具有明显主干的乔木株高15~25米,树冠伞盖状,树干挺
  • 刘武 (梁王)刘武(前2世纪-前144年),西汉时期的贵族,与馆陶公主、汉景帝同为窦太后所出,汉文帝嫡次子,汉武帝叔父。前178年,刘武与弟弟刘参、刘揖同日被汉文帝分别封代王、太原王和梁王。前176年
  • 袁克权袁克权(1898年-1941年),字规庵,号百衲,是袁世凯朝鲜族二姨太李氏所生,为袁第五子。称帝时,袁世凯曾让他和长子袁克定、次子袁克文同穿太子服,将其视为候选接班人。1913年,他和兄弟袁克
  • 吴廷奈吴廷奈(越南语:Ngô Đình Nại,1981年8月27日-),是越南的一名开仑台球选手,出生于胡志明市。吴廷奈在20岁才开始接触台球。然而,他非凡的才华很快使他获得了成功。他在一颗星比赛
  • APT高级打包工具(英语:Advanced Packaging Tools,缩写为APT)是Debian及其派生的Linux软件包管理器。APT可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了Unix系统上管
  • 盈利警告盈利警告,又称盈利预警,简称盈警,跟盈利喜讯是相对,是上市公司透过证券交易所向投资者发出的警告声明,警告预测公司的盈利将比上期出现大幅倒退,甚至亏损,投资者买卖该公司股票时应
  • 阿尔弗雷德·韦伯阿尔弗雷德·韦伯(德语:Alfred Weber,1868年6月30日-1958年5月2日),德国经济学家、地理学家、社会学家和文化理论家。他的成果深刻影响了现代经济地理学的发展,其中以工业区位理论