1988年,Jürg Gutknecht 和我一同完结并出书了Oberon 编程言语[1,2],其为我职业生涯前期开发的别的两种编程言语Pascal和Modula-2 的后续版别。与Modula-2 比较,咱们开端规划Oberon编程言语力求愈加精简和高效,以便可以更好地协助教育人员为计算机科学专业的学生教授体系编程。咱们再接再励,于1990 年针对可选用windows体系和具有字处理才干的作业站开发了Oberon 操作体系(OS),以此作为作业站的现代完结办法。接着,咱们出书了一本书,名为《Project Oberon》,具体讲解了Oberon 编译器以及与之同名的操作体系。此外,书中还包括具体的指令和源代码。
几年前,我的朋友Paul Reed 主张我从头修订并再次出书这本书,不只由于这本书对体系规划教育具有重要价值,一起还由于这本书可以作为杰出的切入点,协助那些想要成为立异者的人们从零根底构建牢靠的体系。
可是,我其时实际上是遇到了很大的困难。我开端开发的编译器是将已根本消失了的处理器作为方针。因而,我的解决办法便是为现代处理器从头编写编译器。但在做了不少研讨之后,我无法找到一款可以在清晰度、规律性和简洁性上契合我规范的处理器。因而,我自己规划了这款编译器。而我之所以可以将该主意付诸完结,都是由于现代FPGA 可以协助我规划硬件以及体系软件。更重要的是,挑选赛灵思FPGA 能协助我更新体系,一起让规划尽可能挨近自1990 年以来的原始版别。
完结在低成本Digilent Spartan®-3开发板上的新式处理器RISC 担任保管1MB 静态RAM (SR
AM) 内存。我仅有添加的体系硬件便是一个鼠标接口和一个用来替换旧体系中硬盘驱动器的SD 卡。
这本书和面向整个体系的源代码可在projectoberon.com[3,4,5] 中查阅,也可在该网站上名为 S3RISCinstall.zip. 的单个文件中进行查阅。该文件包括指令、SD 卡文件体系图画和FPGA 装备比特文件(关于Spartan-3开发板的 Platform Flash,此为PROM文件办法),以及SD 卡/ 鼠标接口硬件的结构详图。
RISC处理器
该处理器由算术逻辑单元、由16 个32 位寄存器组成的阵列和带指令寄存器、IR 及程序计数器PC 的操控单元组成。Verilog 模块RISC5 便是该处理器的典型代表。
该处理器具有20 种指令:4 种用于移动、偏移和旋转;4 种用于逻辑运算;4 种用于整数运算;4 种用于浮点运算;2 种用于存储器拜访;2 种用于分支。
RISC5 经过运转环境RISC5Top导入。该运转环境包括到各种(内存映射)器材和SRAM(256M×32 位)的接口。整个体系(图1)包括以下Verilog 模块(见行计算):
我将内存映射到是非VGA 显现器中,这样它只占用1024×768×1位/ 像素=98304 字节,根本上占 1MB 可用主内存的10%。该SD卡将替代初始体系中80MB 的硬盘驱动器,其可经过可以承受并序列化字节或32 位字的规范SPI 接口进行存取。键盘和鼠标经过规范PS-2 串行接口衔接。此外,还供给一根串行异步的RS-232 线和一个通用8 位并行的I/O接口。模块RISC5Top还带有一个每毫秒选用增量式计数的计数器。
OBERON操作体系
该操作体系软件由包括内存分配器(带废物收回器)的内核、文件体系以及引导载入程序、文本体系、浏览器体系和文本编辑器组成。
名 为“Oberon”的模块是中心使命调度程序,而“System”是根底指令模块。经过点击显现器上任何浏览器文本“M.P”上的中心按钮即可触发动作, 其间P 是模块M 声明的程序名。假如M 不存在,则会主动加载。可是,大大都文本编辑指令是经过简略的鼠标点击触发的。其间,左面一栏按钮用来设置 脱字 符,符号文本方位,右边一栏按钮用来挑选文本字段(text stretch)。
“Kernel”模块包括磁盘存储办理和废物收回器。我确保调查浏览器是平铺的,不堆叠。规范布局显现了多个浏览器的两条笔直轨道。只需拖动标题栏,就可以扩大、缩小或移动它们。图2 显现了在显现器上运转的用户界面以及Spartan-3 开发板、键盘及鼠标。
加载时体系占用模块空间112640字节(21%),占堆(heap) 的16128字节(3%)。体系包括所以下几个模块(见行计算),如图3 所示:
值得注意的是,该体系在加电或重置时,完结初始化仅需两秒钟。这包括文件目录中废物收回扫描。
OBERON编译器
体系自带的编译器选用简略的自上而下递归下降分析法。用户运用ORP.Compile @ 指令即可激活模块选定的源文本上的编译器。 包解析器经过扫描仪输入各种符号,包括辨认符、数字和特殊符号(如BEGIN、END、+等)。该计划已被证明在许多运用中有用且均体现非凡。这点在我著的书《编译器结构》[6,7] 中有具体阐明。
该包解析器调用代码生成程序模块中的程序。这些程序直接将指令添加在代码阵列上。假如已知一切分支目的地,向前跳转指令(forwardbranch instructions)在模块编译结束时则会供给跳转地址(批改)。
一切可变地址都与基址寄存器相关。这便是用于局部变量(运转时设置在程序输入)的R14(仓库指示器)或用于大局和输入变量的R13。
基址地址按要求经过地址保存在寄存器R12 内的体系大局模块表载入。R15 用于RISC 架构确认的回来地址(链接)。因而,R0-R11 可用于表达式评价和传递进程参数。
整个编译器由4 个相对较小的有用模块组成(见行计算):
编译器占用115912 字节(22%)的模块空间和17508 字节(4%)的堆空间(编译之前)。其源代码长约65KB。编译器本身的编译在25 MHzRISC 处理器上只需几秒钟[8]。
编译器一般运用值为NIL的指示查看数组索引和基准值。假如违反规定,这会形成圈套。这种技能具有高度的安全性,防止过错和溃散。现实上,只能经过选用伪模块SYSTEM中的操作,即PUT 和COPY,才干防碍体系的完整性。这些操作有必要局限于接入器材接口的驱动模块。在输入列表中,经过SYSTEM 很简略辨认它们。整个体系选用Oberon 编程,无需运用汇编码。
我挑选Digilent Spartan-3开发板是由于其成本低、操作简洁,这使其适于教育组织,以取得整套课堂教育套件。一个严重优势便是该开发板上有静态RAM,使得接口衔接十分简略直观(乃至用于字节挑选)。惋惜的是,一切新开发板均选用动态RAM,尽管存储空间更大,但接口衔接杂乱得多,因而刷新和初始化(校准)需求电路。这一电路与带静态RAM的整个处理器相同杂乱。即使操控器以单片式供给,这有悖于咱们的敞开查看准则。
最终的主意
40多年前,C.A.R. Hoare 说,在科学技能的一切分支学科中,学生在被要求用试验测验自己的主意之前,简略遭到许多演示性规划实例的影响。编程和软件规划与这种正确形式形成了鲜明对比。这儿,在阅览任何实例之前,要求学生从一开端就编写程序。
这种可怕现实的原因便是:简直不存在巨细适宜的演示实例。因而,我决议略微批改这种景象,我在1975年编写了《算法与数据结构》一书。随后(与J. Gut-knecht)担任操作体系教育使命,我规划了Oberon 体系(1986-88)。
尔后,编程教育并没有明显提高,而体系的规划和杂乱性明显添加。尽管开源的尽力颇受欢迎,但它并没有真实改动这种局势,由于大大都程序现已建成“运转”,但却没有真实投入运用。
我持续斗胆提议,应从头规划一切程序,不光是计算机,还有读取办法。这些程序应是可发行的。即使这种办法正确而有用,但这是一项比创立可执行程序更为困难的使命。这意味着,没有任何部分有必要用汇编码指定。
疏忽在这种“人为因素”的成果便是,在许多地方,新的运用没有得到精心规划,而是经过消除程序中过错来完结,其成果有时是令人担忧的。要做到“易懂”的要害便是坚持简略性和规律性,抛弃不用要的润饰,防止花里胡哨,正确区分传统与快捷。
该体系所占空间小,是小资源完结大作为的见证。尽管Oberon 体系包括一个文件体系、文本编辑器和浏览器(Windows)办理程序,但比较大都现代操作体系而言,其占用的空间少得不幸。意外的是它只是依托一些简略规矩,因而便于学习怎么运用。
最终,这种简略的体系的另一大优势便是,用户可以在该根底体系上安全构建所需程序,而不用忧虑是否存在不知道特征与功用,如后门程式(back door)。从体系完整性易遭到进犯的视点看,这是一个根本特点,是要害安全型运用不可或缺的。值得注意的是,咱们的体系硬件没有这种躲藏元件。究竟,在如此之大而又没人可以彻底了解的根底上构建的任何体系也不能予以确保。