(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf_第1页
(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf_第2页
(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf_第3页
(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf_第4页
(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf_第5页
已阅读5页,还剩67页未读, 继续免费阅读

(计算机应用技术专业论文)stc#脚本编译器的研究和实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浙江工业大学硕士学位论文 s t - c 卿本编译器的研究和实现 摘要 在应用软件中嵌入一个脚本编译器,能使软件支持脚本语言,用 户可以通过编写脚本程序来对软件进行二次开发,从而提升软件的功 能,更符合用户的需求。这种软件有很好的扩充性和通用性。目前越 来越多的应用软件基于n e t 开发,作者设计了能提供给这些应用软件 使用的s t - c # 脚本语言,并在股市神探软件中成功应用。本文结 合实践,阐述了笔者研究和开发s t - c # 脚本编译器及其相关部件的过 程。 脚本语言的设计涉及到语言的定义、虚拟机代码的格式定义、编 译器和虚拟机的开发。对s t - c # 脚本语言进行定义时,采用了类c 柏勺 语法,支持包含多种运算符、字符串、数组和函数的表达式运算,支 持自由的程序书写风格、函数重载等。还定义了函数库的构造,将函 数库分为内部函数库、系统函数库和用户函数库,使脚本语言达到实 用要求。 为了加快脚本程序的运行速度,需要将脚本程序转换成相应的虚 拟机代码提供给虚拟机执行,一般的虚拟机指令系统包含了类似汇编 指令的底层操作指令。为了降低编译器开发的难度和简化虚拟机的设 计,在对虚拟机代码的格式定义时,设计了基于最小指令数量的虚拟 机指令集,利用表达式树存放表达式的编译结果,结果仅用四条指令 就实现了程序的所有控制,虽然降低了表达式的运算速度,但也大大 i 浙江工业大学硕士学位论文 降低了编译器和虚拟机的开发难度。 。 还探讨了s t - c # 脚本编译器将脚本语言编译成虚拟机代码的过 程,分析了词法分析、语法分析和虚拟机代码生成时所采用的技术, 由于虚拟机代码设计得比较抽象,编译器的整个实现都与运行环境无 关,即相当于普通编译器的前端设计。而虚拟机则是对脚本语言的运 行支持,s t - c # 脚本语言的虚拟机分成指令解释器和表达式计算部件两 部分,指令解释器负责脚本控制代码的执行,表达式计算部件负责表 达式的运算,这样分开设计的好处是虚拟机的设计大大简化,结构清 晰。 最后对内嵌了该脚本编译器的软件股市神探做了介绍,分析 了脚本功能对该软件运行的支持过程,从而验证了s t - c # 脚本编译器 的实用性。 关键词:s t - c # 脚本语言,虚拟机指令集,脚本编译器,虚拟机 浙江工业大学硕士学位论文 r e s 础岖c h 6 心di m p l i ! m e 全a t i o no f s t - c 弹s c r i p t i n gc o m p i l e r a b s t r a c t a ne m b e d d e ds c r i p t i n gc o m p i l e rc a ns u p p o at h es c r i p t i n gl a n g u a g ei n t h e a p p l i c a t i o n s o f t w a r ea n d s u p p o r ts e c o n d a r yd e v e l o p m e n tb y u s e r d e f i n e d s c r i p t s ,t h u s b e a e r m e e t st h e u s e r s r e q u i r e m e n t s a n d i m p r o v e st h ee x t e n s i b i l i t ya n du n i v e r s a l i t yo ft h es o f t w a r e f u r t h e r m o r e , m o r ea n dm o r ea p p l i c a t i o n sa r ed e v e l o p e db a s e do i ld o t n e tr e c e n t l y i n t h i s p a p e r , as c r i p t i n gc o m p i l e rn a m e d “s t - c # i sd e v e l o p e d f o r t h e a b o v e m e n t i o n e dd o t n e tb a s e ds o f t w a r ea n di m p l e m e n t e di nt h e “s t o c k s e a r c h i n g ”s o f t w a r es u c c e s s f u l l y t h ei n v o l v e dp r o c e s s e so fd e s i g n i n gas c r i p t i n gl a n g u a g ec o n t a i n d e f i n i t i o n so ft h el a n g u a g e ;f o r m a to ft h ev i r t u a lm a c h i n e ,t h ed e v e l o p m e n t o ft h ec o m p i l e ra n dv i r t u a lm a c h i n e o u r “s t - c 妒l a n g u a g ei ss i m i l a rt o t h ec 撑l a n g u a g ef o r t h es y n t a xa n ds u p p o f t sa b u n d a n to p e r a t i o n sw i t h o p e r a t o r s ,c h a r a c t e rs t r i n g s ,a r r a y sa n df u n c t i o n s ,t h ef r e ew r i t i n gs t y l e , f u n c t i o no v e r l o a d i n ga n ds oo n m o r e o v e r ,t os u p p o r tr e a l t i m e ,t h e : 塑堡三些奎竺堡主堂篁笙壅 f u n c t i o n so f t h e “s t - c # ”a r ed i v i d e di n t ot h r e el i b r a r i e s :i n t r i n s i cf u n c t i o n l i b r a r i e s ,s y s t e m i cf u n c t i o nl i b r a r i e sa n du s e r d e f i n e dl i b r a r i e s i no r d e rt os p e e du pr u n n i n gs c r i p t s ,s c r i p t ss h o u l db ec h a n g e di n t o v i r t u a lm a c h i n ec o d ea n dp r o v i d e df o rt h ev i r t u a lm a c h i n et oi m p l e m e n t t h ei n s t r u c t i o ns y s t e mo fc o m n l o nv i r t u a lm a c h i n ei n c l u d e sl o w - l e v e l i n s t m c t i o n st h a ti ss i m i l a rt ot h ea s s e m b l ei n s t r u c t i o n s t om i n i m i z et h e d i f f i c u l t yo ft h ec o m p i l e rd e v e l o p m e n ta n ds i m p l i f yt h ed e s i g n o ft h e v i r t u a lm a c h i n e ,t h em i n i m u mi n s t r u c t i o ns e to fv i r t u a lm a c h i n ew a s j d e s i g n e dw h e nd e f i n et h e f o r m a to fv i r t u a lm a c h i n ec o d e t h et r e e s t r u c t u r ei su s e dt os a v et h ec o m p i l a t i o nr e s u l t s s ot h a t o n l y f o u r i n s t r u c t i o n sa r ee n o u g ht oc o n t r o lt h ep r o g r a m t h et r e es t r u c t u r em a y r e d u c et h ep e r f o r m a n c eo ft h ee x p r e s s i o no p e r a t i o n s ,b u tt h ed i f f i c u l t yo f t h ec o m p i l e ra n dv i r t u a lm a c h i n ed e v e l o p m e n ti sa l s or e d u c e de n o r m o u s l y i nt h i sp a p e r ,t h ep r o c e s so fh o wt oc o m p i l et h es c r i p t si n t ov i r t u a l m a c h i n ec o d ei n “s t c 妒s c r i p t i n gc o m p i l e ri sd i s c u s s e da n dt h ea d o p t e d t e c h n o l o g i e si nl e x i c a la n a l y s i s ,s y n t a xa n a l y s i sa n d v i r t u a lm a c h i n ec o d e g e n e r a t i o n a t ee l a b o r a t e d o u rc o m p i l e ri si n d e p e n d e n to ft h er u n n i n g e n v i r o n m e n tb e c a u s eo ft h ed e s i g n i n ga b s t r a c t i o no fv i r t u a lm a c h i n ec o d e , w h i c hi ss i m i l a rt ot h ef o r e e n do fag e n e r a lc o m p i l e r t h ev i r t u a lm a c h i n e i sd e s i g n e dt os u p p o r tt h er u n n i n go fs c r i p t i n gl a n g u a g e t os i m p l i f ya n d c l a r i f y o u rv i r t u a lm a c h i n eo f “s t c 矿t w oc o m p o n e n t si n c l u d i n g i n s t r u c t i o np a r s e rc o m p o n e n tt h a ti sr e s p o n s i b l ef o re x e c u t i n gt h ec o d ea n d e x p r e s s i o nc o m p u t a t i o nc o m p o n e n tt h a ti sr e s p o n s i b l ef o rc o m p u t i n gt h e 浙江工业大学硕士学位论文 e x p r e s s i o n sa r ec o n s t r u c t e d f i n a l l y ,t h e e m b e d d e ds c r i p t i n gc o m p i l e ri n “s t o c ks e a r c h i n g i s i n t r o d u c e da n dt h ep r o c e s so fm n n i n gt h e s c r i p t s i s e x p l a i n e d t h e e x p e r i m e n t a lr e s u l ts h o w st h a tt h e “s t - c # s c r i p t i n gc o m p i l e ri sm u c h p r a c t i c a b l e k e yw o r d s :s t - c # s c r i p t i n gl a n g u a g e ,v i r t u a lm a c h i n ei n s t r u c t i o n , s c r i p t i n gc o m p i l e r , v i r t u a lm a c h i n e 浙江工业大学 学位论文原创性声明 本人郑重声明:所提交的学位论文是本人在导师的指导下,独立进行研 究工作所取得的研究成果。除文中已经加以标注引用的内容外,本论文不 包含其他个人或集体已经发表或撰写过的研究成果,也不含为获得浙江工 业大学或其它教育机构的学位证书而使用过的材料。对本文的研究作出重 要贡献的个人和集体,均已在文中以明确方式标明。本人承担本声明的法 律责任。 作者签名:岔移以己日期:7 年,月? 萝日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学 校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被 查阅和借阅。本人授权浙江工业大学可以将本学位论文的全部或部分内容 编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和 汇编本学位论文。 本学位论文属于 1 、保密口,在年解密后适用本授权书。 2 、不保密囱。 ( 请在以上相应方框内打“v ”) 作者签名;钐己名巴 刷醛轹宵1 浙江工业大学硕士学位论文 1 1 研究的目的与意义 第一章绪论 根据软件定制能力的强弱可以分为以下几类软件:( 1 ) 功能固定的软件。用 户得到的是功能固定的软件,如果要添加功能需要等待软件的升级版本。( 2 ) 可 进行参数化设置的软件。用户可以通过设置参数来简单定制软件,如界面的定制、 部分功能的选择,这些功能必须事先编制到软件中,用户设置参数仅是挑选要用 到的功能,本质上用户不能为软件增加新功能,添加新功能是软件开发商的权利。 ( 3 ) 完全可定制软件。这类软件实际上具有了二次开发功能,用户通过二次开发 来实现自己的功能,哪怕这些功能原先软件并没有提供,用户通过编程的形式把 软件提供的基本功能有机组合起来产生新的功能。有两种常用的定制方式:( i ) 编制d 1 1 ,用户可以利用常用的语言开发工具编制。缺点是编程麻烦,对用户要求 较高,在软件运行时无法即时修改,也很难在运行时对叫本身的错误作出定位和 提示;优点是执行速度快,代码保密性强。( i i ) 编制脚本,用户通过软件定义的 脚本语言编制脚本,让软件执行。缺点是运行速度慢;优点是编程难度低,软件 在运行脚本时,可以对错误的脚本作出适当的提示,可以让用户即时修改和查看 脚本。具有二次开发功能的软件具有很大的灵活性,用户可以通过二次开发来扩 充软件的功能,达到个性化应用的目的。 j o h nko u s t e r h o u t 提出脚本语言和系统程序设计语言可以互为补充,典型的 应用是:组件由系统程序设计语言创建,并由脚本语言组合在一起。然而,速度 更快的机器,更好的脚本语言,图形用户界面和组件构造重要性的不断提高,因 特网的发展等发展趋势大大提高了脚本语言的应用。在今后的十年中,这种趋势 将继续,而且越来越多的完全使用脚本语言和系统程序设计语言书写的应用程序 将主要用来创建组件。1 1 】 具有脚本语言的软件具有广阔的发展前景。一方面,它使软件变得更容易开 发,开发人员只需关注软件的底层功能,使之适应二次开发,高层功能的开发阶 l :塑坚三些盔堂堡主兰垡堡塞 段可以成为独立的阶段,使软件变得非常容易扩充,软件能更方便地容纳更多的 功能。另一方面,修改脚本比修改编译好的程序要简单许多:发现脚本错误后, 可以直接对脚本进行修改,这些修改用户也可完成,甚至不用停止软件的运行就 能修改完成,开发人员少了很多的工作量,能更加专注于软件的基本功能。 笔者研究的s t - c # 脚本语言是自行定义的类c # 的脚本语言,笔者希望通过定 义、开发该脚本语言,将其应用到商用软件上,使软件具备二次开发能力,从而 提高软件的性能。另一方面,由于n e t 的历史比较短,因此基于n e t 的脚本语言 非常少,但n e t 的应用面已经越来越广,在n e t 上进行脚本语言的设计是个有益 的尝试。 1 2 国内外研究现状 国外很早就认识到脚本语言具有很广的发展空间1 1 1 。脚本语言的开发主要包 括:脚本语言的定义,以及编译器和虚拟机的设计。主要开发技术集中在编译器 的开发和虚拟机的开发上。 编译器的开发技术已经非常成熟,编译器前端包括词法分析、语法分析、中 间代码生成等过程,后端则与目标机器有关,包括目标代码生成,以及和目标机 器有关的优化等。编译器的构造主要有三条途径【2 】:( 1 ) 用某种程序语言书写出 编译程序:( 2 ) 通过l e x 、y a c c 等工具进行自动构造;( 3 ) 通过现有的编译基础 设施进行改造和组装。通俗地可以看成是手动开发和自动生成,或两者的结合。 编译器前端的很多分析过程实现了自动化,如常见的词法生成器有t 启x ( a l e x i c a la n a l y z e rg e n e r a t o r ) 3 、f l e x ( f a s tl e x i c a la n a l y z e rg e n e r a t o r ) 4 1 、j l e x ( j a v a l e x i e a la n a l y z e rg e n e r a t o r ) 1 5 】、j f l e x ( af a s tl e x i c a la n a l y z e rg e n e r a t o rf o rj a v a ) 6 1 等。 其中l e x 是1 9 7 5 年由美国贝尔实验室开发,运行予u n i x 系统上的词法分析器生 成器,生成的代码是c 程序,它是最经典的词法分析器生成器,后来的各种同类 工具大多都是参考l e x 实现的。 , 典型的语法分析器生成器则有:y a c c ( y e ta n o t h e rc o m pi l e rc o m pi l e r ) 1 7 、 b i s o n l s l 、a n t l r ( a n o t h e tt o o lf o r l a n g u a g er e c o g n i t i o n ) 卅、c u p ( j a v a b a s e d c o n s t r u c t o ro fu s e f u l p a r s e r s ) 1 1 们、j a v a c c ( j a v ac o m p i l e r c o m pi l e r ) 1 1 1 、 s a b l e c c ( s a b l ec o m p i l e rc o m p i l e r ) 1 2 1 、a c c e n t ( ac o m pi l e rc o m pi l e rf o rt h e e n t i r ec l a s so fc o n t e x t 2 f r e el a n g u a g e s ) ”】等。y a c c 是贝尔实验室研制的风靡世界 , 浙江工业大学硕士学位论文 的语法分析器生成器,它盼第一个版本是于1 9 7 5 年在u n i x 环境下开发的。从本 质上看,y a c c 是一种动作文法的l r 实现系统1 1 4 1 y a c o 要求语义动作必须用c 语 言来写,y a c c 提供了处理二义性文法、语法动作冲突及运算符优先关系的机制。 y a c c 的这些处理机制成为后来各种同类工具事实上的标准。1 9 8 6 年,y a c c 衍生出 一个新的版本称为y a c c + + 1 s l ,它继承了y a c c 的算法及特点,并且支持c + + 语言, 生成以类为主体的面向对象的语法分析器。 由于结构和算法等原因,传统编译器前端生成器的通用性和可扩展性较差1 1 6 1 , 并且还有以下缺点1 1 7 l :( 1 ) 对文法有限制;( 2 ) 嵌入式语义动作有负面影响;( 3 ) 目标语言单一;( 4 ) 代码的可读性差,难以调试和修改。 g c c ( g n u c o m p i l e r c o l l e c t i o n ) 是可重定向的编译程序,它是f s f 启动的g n u 工程的一部分,目前已支持的源语言有c 、c + + 、o b j e c t i v ec 、f o r t r a n 、a d a ,已 移植的平台有1 0 0 多种,涉及3 0 多种处理器、6 0 多种系统1 1 8 , 1 9 。g c c 属于自由 软件,在全世界范围内得到了广泛使用。g c c 采用两层中阅表示,它们分别为语 法树和r t l ( r e g i s t e r t r a n s f e r l a n g u a g e ) 表达的中间代码,其编译后端可以自动产生。 但它的体系结构描述不够精确,对于体系结构中并行部件数量、各部件流水特性 甚至数据通路资源等硬件信息无法表达,从而影响了优化的效果。 尽管编译器的自动生成有如此多的工具,但手动编制编译器也有其优势,手 动开发的编译器能针对编译器自身的特点做特殊处理,代码结构好,可读性强, 性能也较高,但比起自动构造花费时间多。手动编制中也大量采用了自动生成工 具中使用的思想和算法。 脚本语言一般被编译成虚拟机代码,再交由虚拟机执行。其思路是先编译成 虚拟机指令,然后针对不同计算机实现该虚拟机 2 1 1 。虚拟机定义了一组抽象的逻 辑组件,这些组件包括寄存器组、数据栈和指令集等等f 埘。虚拟机指令的解释执 行包括三步【2 3 1 :( 1 ) 获取指令参数;( 2 ) 执行该指令对应的功能;( 3 ) 分派下一 条指令。很多语言都采用了虚拟机作为运行环境1 2 4 1 ,如j a v a 的支撑环境是j a v a 虚拟机( j a v a v t r t u a l m a c h i n e ,j v m ) ,n e t 的支撑环境是通用语言运行库( c o m m o n la n g u a g er u n t i m e ,c l r ) 。j v m 是典型的虚拟机架构,编写的j a v a 程序可以在 任何j a v a 平台上运行而无需修改。j v m 定义了独立于平台的类文件格式和字节 码形式的指令集。虚拟机般都采用了基于栈的架构,这种架构易于实现( 2 5 1 ,虚 拟机方法显著提高了程序语言的可移植性和安全性,但同时也导致了执行效率的 浙江工业大学硕士学位论文 下降【2 6 】。目前许多关于如何提高虚拟机性能的研究都在进行当中【2 7 ,2 8 ,2 9 她3 n 。 国内也对编译器进行了很多的研究,包括和g n u 组织合作开发【3 2 】。在可重 定向编译器的研究i 刎中,戴桂兰等提出中间表示对提高编译器的可移植性以及代 码生成的有效性起到关键作用【3 3 1 ,提出了通过使用不受限制的高级中间表示,可 充分利用现有的前端阳。通过抽象语法能对现有中间表示提供自然编码的抽象中 间表示,提高了编译成份的可复用性和互操作性,简化了编译基础设施的建构, 进一步实现了高质量编译器的快速开发。在后端优化编译结果等方面,也有很多 深入的研究【3 5 瑚j ”8 ,叭。编译技术在各种场合里有着广泛的应用 4 0 4 1 4 2 4 3 朋t 4 5 问,吴 鹏等【4 3 】使用y 犯c 和v c 6 编制了一个可以实现画图功能的解释语言,其目标是实 现改进的g d i 变换功能,使软件具备t - 次开发能力。李蜀瑜等c 4 4 1 设计的解释器 以自定义的字节码为中间代码,为节省构造例行的词法分析和语法分析程序的时 间,词法分析和语法分析分别使用了l e x 和y a c c 自动化工具,使系统的可移植性、 通用性大大提高。 目前国内外支持脚本语言的软件大多是一些大软件,如m 洌览器能使用j a v a 脚本和v b 脚本,a u t h o r w a r e 、a u t o c a d 等使用自带的脚本语言,而国内的一些 软件更多地使用第三方的脚本控件,如金山w p s 使用的是微软的v b 脚本控件。 国内还有一些软件使用了自己开发的脚本语言,但功能大多不强,仅满足自身的 需要而设计,不具通用性。 1 ,3 研究的内容和目标 商用软件可以使用第三方的脚本控件来实现软件功能的脚本化,但很明显, 这种依赖于第三方控件来实现自己的功能,使软件在完整性、独立性上存在着不 足,一旦第三方控件功能发生改变,将严重影响应用程序的开发、发布和升级。 本文通过s t - c # 脚本语言的研究、设计及实现,探讨了一种内置于应用软件内的 脚本编译器的设计方法,它存在于应用软件内部,并配有相应的虚拟机,以便对 编译后的虚拟机代码进行运行,它需要配一个运行库来支持用户脚本对软件功能 的调用。 1 3 1 内嵌s t - c # 脚本编译器的软件构造 如图卜1 所零,具有内嵌式编译器的软件由五部分构成:应用程序外壳、内 4 浙江工业大学硕士学位论文 部功能库、脚本编译器、虚拟机和脚本库。其中脚本摩以可编辑和扩充的文本形 式存在,其他部分以二进制代码形式存在。 a :虚拟机代码数据流c 0 ,控制流 图1 - 1 内嵌删脚本编译器的软件构造 应用程序外壳是构成整个软件的骨架和平台,它提供软件运行需要的基础部 件,并将它们有机地组织好。这些基础部件可以是各种控件,它们是脚本运行时 操作和控制的对象,这些对象提供基本的操作方法,脚本在运行时通过对这些对 象的操作,从丽使软件产生各种动作。 内部功能库是软件内的函数库或类库,它对应用程序外壳提供了功能上的支 持。它提供一些基本运算和基本操作,还将一些外部不能实现的功能编制到内部 运行库中,如读写文件等操作。内部功能库是程序内部相对独立的模块。 脚本编译器和虚拟机是相互关联的两个核心部件,脚本编译器先将脚本编译 成虚拟机代码,然后由虚拟机对它进行执行。这样设计的考虑是:一般的解释器 可以对脚本边解释边执行,这样的脚本执行速度相对较慢,特别是对于需要重复 执行的脚本模块,速度会更慢;而采用先编译、后执行的方法会大大提高脚本的 运行速度。在软件运行时,应用程序外壳根据需要从磁盘读入脚本,或直接构造 出脚本,然后将脚本交给脚本编译器编译成特定形式的虚拟机代码。 虚拟机专门用于运行脚本被编译后的虚拟机代码。应用程序外壳在需要时将 虚拟机代码交给虚拟机来解释执行,在运行过程中,虚拟机代码通过对内部功能 库不停地调用来控制应用程序外壳,使外壳部件的状态发生改变,产生种种用户 5 塑望三兰兰奎兰堡主堂焦笙奎 需要的功能。 脚本库是软件功能的延伸,它用脚本编译器可以识别的语言编制,脚本编译 器和虚拟机并不提供有关软件操作的具体信息,而内部功能库以二进制形式存在, 不易扩充,因此软件的大部分功能都靠外部的脚本库来实现。一部分通用的脚本 由软件开发商直接提供,用户也可通过编制脚本实现对软件功能的定制和扩充。 具有内嵌式编译器的软件具有二次开发能力,比普通软件有更大的适应性, 具有更长的生命周期,软件通用性强。去掉脚本库后,软件本身并不提供具体的 功能,因此整个软件是靠脚本的运行来产生用户所需的功能,软件本身就好像是 一个脚本运行的平台,也是一个二次开发的平台。这种软件在功能上具有很大的 伸缩性。 1 3 2 内嵌s t - c 脚本编译器的软件运行机制 具有内嵌式编译器的软件可以全面实现用户功能的脚本化,即软件的二进制 部分几乎不含用户层面的功能代码,仅提供支持内部功能库,也就是对软件今后 所要表达的功能进行分割,构造出最小粒度的功能模块,这种功能模块可以是函 数调用,也可以将一系列相关功能封装成类,它们彼此孤立地存在着,每次对它 们的调用,都会产生一个相应的软件动作。脚本的作用就是将一系列动作组织起 来,当脚本连续运行时,反映到应用程序外壳上就是软件功能被脚本所驱动。 箧矗叫镣口受口旦叫嚣 数据流c = 控制流 图1 - 2 内嵌s t - - c # 艄i l 本编译器的软件运行机制 如图卜2 所示,二次开发人员根据功能库中提供的功能编写脚本,在软件运 行时,脚本经过脚本编译器转化成等效的虚拟机代码,该代码通过虚拟机的运行, 不停地按照脚本设定好的流程对内部功能库进行调用,从而使软件表现出各种功 能。这里虚拟机并没有直接控制应用程序外壳的运行,它是通过调用内部功能库 来间接操纵应用程序外壳的。另外,内嵌在软件中的脚本编译器和虚拟机对二次 开发人员也是不可见的,他只要关心软件的脚本库和功能库,通过将功能库中的 6 浙江工业大学硕士学位论文 功能写入脚本中来实现对软件的操纵。 由于软件的功能是脚本驱动的,因此软件升级可以分为软件的二进制部分的 升级和脚本库升级两种。软件的二进制部分的升级也就是可执行代码的升级,是 普通软件升级的主要途径,升级时需要修改软件的源码,并重新编译,工作繁琐, 受制约条件较多,大部分的升级是重新安装的过程,频繁升级会对用户使用造成 很大影响,因此这种软件的升级往往幅度较大,功能和性能改变较大。而脚本库 的升级则较简单,它不需要对软件的二进制代码进行改变,它的升级往往只是脚 本的复制。由于具有内嵌式脚本编译器的软件可以通过升级脚本来升级软件的功 能,因此这类软件具有更强大的适应性,它可以根据用户的不同需求,提供不同 的脚本库给用户,软件功能具有很强的个性化的特点。 1 3 3 研究的主要创新点 s t - c # y 挪本语言的实现过程中,虚拟机代码的设计是一个关键的部分,它一方 面涉及到编译过程如何实现,另一方面涉及到虚拟机如何运行,因此虚拟机代码 设计得好坏在很大程度上决定了项目的成败。普通虚拟机的指令系统包含了类似 汇编指令的底层操作指令,如读写堆栈、加减运算等基本指令,因此指令系统显 得比较庞大,编译器和虚拟机运行系统也相对较复杂,更重要的是它使编译器后 端份量加重,将影响脚本语言实施的难度。为了降低编译器开发的难度和简化虚 拟机的设计,笔者在对虚拟机代码的格式定义时,独创设计了基于最小指令数量 的虚拟机指令集,利用表达式树存放表达式的编译结果,结果仅用四条指令就实 现了程序的所有控制,虽然降低了表达式的运算速度,但也大大降低了编译器和 虚拟机的开发难度,提高了软件核心部件的可靠性。具体的研究内容和实施方法 将在第三章和第五章给出。 1 4 论文的体系结构 脚本语言的实现涉及到很多方面。实现一个脚本语言的步骤如下: ( 1 ) 对语言进行定义; 1 2 ) 定义该语言的目标代码( 即虚拟机代码) 的格式; ( 3 ) 设计出编译器,它能将脚本程序编译成虚拟机代码; ( 4 ) 设计出虚拟机,以便代码得以运行。 7 浙江工业大学硕士学位论文 论文就按照上述步骤来安排章节如下: 第二章介绍了s t - c # 脚本语言的定义,分析了笔者定义该脚本所作的一些思 考和定义时采取的手段。 第三章介绍了虚拟机代码的定义,着重提出了笔者的独创:基于最小指令数 量的虚拟机指令系统。 第四章介绍了s t - c # 语言的编译过程的实现。 第五章介绍了虚拟机的设计,描述了虚拟机的运行机制。 第六章介绍了s t - c # 脚本语言在股市神探软件中的应用情况。 第七章对研究工作做了总结和展望。 8 浙江工业大学硕士学位论文 第二章s t - - c # 脚本语言的定义 2 1 单词( t o k e n ) 和语言的描述工具 单词和语言的描述方法有很多种,常用的描述工具有:扩充的巴科斯一瑙尔范 式( e b n f ) 、文法、正规式( r e g u l a re x p r e s s i o n ) 等。 在e b n f 中使用了六种符号来表示语法构造,下面是这些符号和它们的含义哪: ( 1 ) “ ”;用左右尖括号括起来的文字表示语法构造成分,或称语法单位, 为非终结符。 ( 2 ) “:= 乙该符号的左部由右部定义,读作“定义为”。 ( 3 ) “l ”:表示“或”,意为左部可由多个右部定义。 ( 4 ) “ ”;表示花括号内的语法成分可以重复。在不加上下界时可重复0 到任意次数,有上下界时为可重复次数的限制。 ( 5 ) “ ”:表示方括号内的成分为任选项。 ( 6 ) “( ) 气表示愿括号内的成分优先。 上述符号称“元符号”,如果在文法符号中需要用至这些符号,需要用引号 括起。 例:如果将标识符定义为字母开头、后跟字母和数字的符号组合,则它的e b n f 可描述为: := ( 字母 ( 字母 l := a l b 卜i x i y i z :- - 0 1 1 1 2 1 1 9 它的特点是全部由文本构成,容易编辑。 9 浙江工业大学硕士学位论文 2 1 2 文法 首先给出规则的定义:规则,也称重写规则、产生式或生成式,是形如口一口 或a :帮的0 ,d 有序对,其中4 称为规则的左部,声称作规则的右部。 文法g 定义为四元组( 瞻,v r ,p ,研。 其中瞻为非终结符集;v r 为终结符集;p 为规则( 口叩) 的集合,ae ( v m u 玢) + 且至少包含一个非终结符,户( 珞u 功;h ,玢和p 是非空有穷集。s 称作识 别符或开始符,它是一个非终结符,至少要在一条规则中作为左部出现。 c h o m s k y 把文法分成四种类型,即0 型、1 型、2 型和3 型。 2 型文法对产生式作了如下限制:对文法中的每一个产生式口叩满足口是一 个非终结符,p e ( v n u 蹦。有时将2 型文法的产生式表示为a 叩的形式,其中 彳吩,也就是说用夕取代非终结符a 时,与一所在的上下文无关,因又称为上 下文无关文法( c o n t e x t f r e e ) ,它有足够的能力描述现今程序设计语言的语法结构。 3 型文法也叫正规文法,每一个产生式的形式都满足;爿唧口或a - - a ,其中 a 和口都是非终结符,口盯 2 1 3 正规式 正规式也称正则表达式,也是表示正规集的工具,常用以描述单词符号。下 面是正规式和它所表示的正规集的递归定义: 设字母表为s ,辅助字母表s = f ,e ,i ,。( ,) ) 。 ( 1 ) e 和f 都是s 上的正规式,它们所表示的正规集分别为 对和f ; ( 2 ) 任何口s ,口是s 上的一个正规式,它所表示的正规集为和 ; ( 3 ) 假定旬和勿都是s 上的正规式,它们所表示的正规集分别为工) 和l , 那么,( e i ) ,e ls e z ,e l e 2 和e j 也都是正规式,它们所表示的正规集分别为l ( e j ) , 0 j ) u l ( e 2 ) t 工( e 】) 工( e 2 ) 和g ( e j ) ) ; ( 4 ) 仅由有限次使用上述三步骤而定义的表达式才是s 上的正规式,仅由这 些正规式所表示的字集才是s 上的正规集。 其中的“l ”表示“或”,。”表示“连接”,矿”表示“闭包”。在不引起混 淆的情况下,括号可省去,但规定算符的优先顺序为先矿”,再“”最后“h 连接符“”一般可省略不写。矿”、“”和“f ”都是左结合的。 1 0 浙江工业大学硕士学位论文 2 2s t - o # 脚本语言的基本定义 2 2 1 关键宇的定义 关键字的定义吸取了c # 关键字的特征,全部采用小写字母组成,在s t - c # 语 言中只使用了核心的1 4 个关键字,这些关键字和它们的含义在表2 1 中给出,其 他众多功能借助脚本提供的内部函数来实现。如c # 中的n e w 、d e l e t e 等关键字, 在s t - c # 脚本语言中被一些相应的内部函数所替代。这样做的好处是编译器可以 变得相应简单,软件构造更简洁,从而提高软件的可靠性和可扩展性。 表2 - 1s t - c # 脚本语言的关键字列表 关键字 含义 v o i d 函数定义时写在函数名称前,表示不返回值 i n t 整型数据类型声明,表达式中为强制类型转换 d o u b l e 双精度数据类型声明,表达式中为强制类型转换 s t r i n g 字符串数据类型声明 i f 用于条件 , e l s e用于条件 d o用于循环 w h i l e 用于循环 f o r用于循环 b r e a k 从循环中中断 c o n t i n u e 继续循环 g u r u 无条件转跳 r e t u r n函数调用返回 f u n c t i o n函数定义 2 2 2 数据类型的定义 s t c # 脚本语言设计了六种数据类型。分别是整型、双精度浮点型、字符串和 它们的数组类型,见表2 2 。其中数组类型的表达采用了和c # 类似的格式,即“ ” 浙江工业大学硕士学位论文 作为类型名的一部分。 表2 - 2s t - c # 脚本语言的数据类型 类型名称 i n t 整型 d o u b l e双精度浮点数 s t r i n g 字符串 i n t 整型数组 d o u b l e 】双精度浮点数组 s t r i n g 字符串数组 下面是关于常量的描述; 常量有整数常量、双精度浮点常量和字符串常量三种。整数常量分为十进制 和十六进制的表示,其中以4 0 x ”或“0 x ”打头为十六进制常量。双精度浮点常 量可以用定点小数表示,也可以用科学计数法表示。字符串常量的内容两端双引 号来表示。 约定:为了表述方便,用d 表示十进制数字,正规式表示即d = 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 : 用h 表示大于9 的十六进制数字,即h = a l b i c l d l e l f l a l b l c l d l e l f 。 无符号十进制整数常量定义为十进制数字串。它的正规式是r 1 - o = a d 。 无符号十六进制整数定义为以“o x ”或“0 x ”开头。后跟十六进制数字组成 的串。它的正规式是r 1 6 = ( o x l o x ) q l ) ( d 竹y 。 无符号十进制浮点实数的非形式描述如下:它由三部分组成,整数部分、小 数部分和指数部分,其中后两部分可选,指数部分以“e ”或“e ”开头,后跟有 符号十进制整数。它的正规式是r l o f - - d d ( 埘ie ) ( c e i o ( + l - le ) 引+ l ) 。 2 ,2 3 函数 2 2 3 1 函数定义 s t - c # 语言的函数定义格式参照了酣的函数定义格式,并将其简化。它的 e b n f 定义描述为: := f u n c t i o n ( ) , 1 2 浙江工业大学硕士学位论文 := l | v o i d ( 参数列表 := 变量名称 lp := , if :- i n t d o u b l e s t r i n g i n t 【】 d o u b l e 。【】l s t r i n g f 】 说明: 是普通的语句和语句块序列,f 代表 。 2 2 3 2 函数重载 s t - c # 提供对函数重载的支持,使得脚本代码具有更强的表现力,虽然增加了 编译器的设计难度,但所获得的性能也是巨大的。同时考虑到对重载函数的分析 主要集中在脚本的预处理和词法分析阶段,对虚拟机代码的生成没有影响,也与 虚拟机无关,因此对函数重载的支持设计部分比较集中,增加的是局部的设计难 度和工作量,所以最终决定为s t - c # 增加了函数重载功能; 函数重载是对相同函数名称、而函数参数和返回值不相同的函数的重新定义, 在使用时编译嚣根据参数类型和数目的不同查找到正确的函数。表2 3 是对s t - c # 脚本语言支持函数重载的简要说明。 表2 - 3s t - c # 脚本语言支持的函数重载 m a x 函数的各种形态参数描述重载结果 i n tm a x ( i n ta ,i n t6 )两个整型参数原函数 i n t m a x ( i n t a ,i n t b ,i n tc ) 具有不同的参数数目正确的重载 d o u b l e 小麟( d o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论