六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 80|回复: 0

一个脚本解释器的实现与分析(HOC改进版)

[复制链接]

升级  37.33%

26

主题

26

主题

26

主题

秀才

Rank: 2

积分
106
 楼主| 发表于 2013-1-27 04:41:17 | 显示全部楼层 |阅读模式
HOC(High Order Calculator)是一个解释型的程序语言,最初的版本由Brain Kernighan和Rob Pike在《The UNIX Programming Environment》[UNIX编程环境]一书中作为一个例子给出。本身由lex/yacc构造,结构十分清晰,作为一个教学语言,HOC支持函数,具有类C的语法,有简单的I/O,变量赋值,表达式计算,错误恢复等机制。
 
后来,Bell实验室又陆续开发出了一些改进的版本,使得HOC可以平坦的移植到各种Linux系统中,我在上学的时候阅读过[UNIX编程环境]这本书,并且对其中的HOC做了一些简单的改进,后来又找到了Bell实验室的一个版本,深入的学了一遍,由于这个发布版本出自Research UNIX系统,我又对源码做了一些修改,并将其移植到了Windows平台。
 
在第一次学习HOC解释器的时候,是在编译原理课程结束后,当时是想在linux下设计一个通用的数学计算引擎,然后将计算出的数据通过一个前端展示系统(最好平台无关)展示给最终用户。开始,准备用Delphi自己写一个,但是一直没有实现,这个项目就停止了。直到后来发现了一个优秀的绘图工具gnuplot(关于gnuplot的更多细节,请参看我的另一篇文章), 用它来做前端似乎再合适不过了,于是,我决定将原来的改进后的HOC移植到Windows下,然后进行一个简单的整合。
 
下面是用HOC语言写的一段代码:


代码很简单,先定义一个过程:plotSin(在HOC中有procedure,function之分,前者没有返回值,而后者有),这个过程定义了三个临时变量begin,end,step,其中PI是一个常量,其值为3.1415926, 然后是一个for循环,begin不断加step(0.1),直到不小于end,退出循环,同时每次迭代时,先计算sin(begin)的值,并打印此时的begin和sin(begin)值。最后,调用这个过程,执行计算并退出。
 
这个是程序生成的数据:


将数据交给gnuplot展示,gunplot可以轻易的从数据文件中读出数据,并以第一列为横坐标,第二类为纵坐标画出图形来,根据上边这个数据文件,gnuplot画出的图形结果如下:


如果需要绘制3-D的图形,事实上更为简单一些。如下面的代码所示:


代码很简单,就是两层循环,计算出sin(x)*cos(y)的值,打印出来,一次x迭代结束后,打印一个空行,这样gunplot可以识别次文件,并画出3-D的图形来。
 
使用gnuplot的3-D绘制命令,splot,可以得到下边的图形:


z = sin(x)*cos(y)


 z = x * y


 z = x^2 - y^2 (鞍面)
 
整个思路很清晰,没有什么难懂的地方,而这个HOC的原始版本就是在UNIX下用lex/yacc开发的,只要对正则表达式和BNF形式比较熟悉就可以很快的理解整个解释器的实现(建议直接去看源码)。如果不太熟悉,那么就接着往下看,我会详细解释这些工具的用法和一些形式语言的理论。
 

  • 形式语言
在计算机科学中,形式语言是用精确的数学定义或者机器可识别的公式定义的语言,形式语言跟自然语言很类似,包含两部分:语法语义。形式语言的定义为:
<div class="quote_title"> 写道
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表