课程设计(论文)VC基于Windows的功能测试软件研究—脚本技术的实现.doc
基于Windows的功能测试软件研究脚本技术的实现摘 要:对于开发灵活的科学软件来说,脚本语言是一个强大的工具。本课题研究内容就是设计一种基于Windows简单脚本语言,然后利用VC开发该语言的解释器,最后完成软件功能测试。关键字:功能测试;脚本语言;VCAbstract: science for the development of flexible software, the scripting language is a powerful tool. The content of the research is to design a simple scripting language based on Windows, and then using VC development of the language interpretation, the final completion of software testing. Keyword: functional testing; scripting language; VC目录第一章 绪论31.1引言31.2脚本语言31.2.1脚本构件粘贴41.2.2脚本语言的特点51.2.3 脚本语言的构成71.3选用语言的策略71.4脚本语言的应用81.4.1图形用户接口(GUI)81.4.2 Internet91.4.3构件框架91.5其它语言9第二章 脚本语言和系统编程语言的互补性102.1 使用脚本语言开发应用程序的步骤10第三章 Windows脚本组件技术133.1脚本组件技术133.1.1脚本组件的运行133.1.2脚本组件文件的框架143.1.3脚本组件的使用143.2脚本组件应用实例153.2.1脚本组件文件153.2.2应用脚本组件17第四章 C/C+代码自动生成脚本语言接口的实现184.1国内外现状184.2可扩展的编译器(IG)194.2.1 IG的实现194.2.2关键技术214.3小结及以后的工作24参考资料25总 结26致 谢27第一章 绪论1.1引言在过去30年里,编程人员在编写程序的过程中更多注重的是如何使用高级程序设计语言编写出具有个性的应用程序,但这一观念目前正逐步发生了根本性的变化.这种变化表现为由高级程序设计语言(例如C或C+)向脚本语言(例如Perl或TCL)的过渡。因此,比较脚本语言和高级程序设计语言的各自特点有利于我们了解这种变化的必然性。脚本语言与高级程序设计语言不同.各自适用于不同的任务。高级程序设计语言是从最简单的计算机基本元素例如内存字开始构造数据结构和算法,而脚本语言是以构件“粘贴”的方式进行设计,假定已经存在有一组强有力的构件,主要任务是怎样将这些构件连接起来。高级程序设计语言是一种强类型的用于复杂处理的语言,而脚本语言是一种无类型的只需在构件之间简单地建立连接实现快速应用开发的工具语言。脚本语言和高级程序设计语言的关系并不矛盾,两者具有互补性.60年代以来的大多数主要的计算平台都包括这两种语言。构件框架集成是这种互补性的典型代表,它的一般形式是首先使用高级程序设计语言建立构件,然后再使用脚本语言将构件粘贴在一起。随着近年计算机及其相关技术的发展,例如更快的机器、更好的脚本语言、图形用户接口GUI>的普遍使用、以及Internet的高速发展,大大加速了脚本语言的应用。这种发展趋势将会持续到下个世纪,到那时会有更多更新的完全使用脚本语言编写的应用程序,而高级程序设计语言仍将是构筑构件的主要语言。1.2脚本语言在运用脚本语言设计应用程序的过程中,一般来说只需了解构件的外部特性,无需知识构件内部复杂的算法和数据结构。因此脚本语言有时又被称为粘贴语言或系统集成语言。1.2.1脚本构件粘贴运用脚本语言设计应用程序的过程本质上是一种粘贴过程,即是将符合粘贴条件的构件拼装在一起形成应用。参与粘贴的脚本构件的基本条件如下:1)软件构件之间自由相关,因而几乎不需要预先假设与它相交互的有哪些别的软件构件,且构件可以被简单地重用.2)编程者以“黑盒”方式使用构件,即只能示例和使用它们,不能对其修改、扩展,也不必了解它们的内部执行过程.为了满足这两个条件,使用语言解释器作为可重用构件的中介。解释器能够根据不同的构件类型完成命令解释、示例构件、和控制交互等操作。构件之间的交互一般采用两种方法:粘贴代码方法和配置脚本方法.粘贴代码交互方法主要完成构件和构件之间的交互。其特性为:构件之间松散偶合:即构件之间的相互依赖性很小;构件可重用,能在尽可能多样的类型环境中使用它们;构件在运行过程中被动态地组合成应用;构件能够被那些甚至没有墓本的编程技能的编程者使用。使用粘贴代码方法需要较多的内存,且为了完成每个构件到构件交互操作会带来额外系统开销,因而执行效率低。对于带有图形用户接口的应用程序,或是那些需要在构件之间传送大量数据的场合不能使用这种方法。配置脚本直接方法主要用于设计构件和解释器之间的交互。从构件的观点来看,解释器也可以视为一组专门处理构件之间交互参数的构件集合,所以构件和解释器之间的交互,也是一种构件和构件之间的交互。但由于这种交互在相互之间需要大量的数据传送,因而不能采用粘贴代码方法。必须采用效率高且需要内存少的配置脚本方法。具体方法如下·为构件定义二进制接口。·将脚本层次的“handles”直接指向一个二进制构件接口,实现一个构件对另一个构件的解释。·脚本命令的传送是通过示例脚本且在脚本之间传送接口句柄来实现。构件之间通过相互包含指向对方的二进制接口句柄实现交互。采用配置脚本方法,构件之间不是松散偶合关系。编程人员必须细致设计构件之间的潜在交互和它们在这些交互中所遵循的规则。如果使用C+设计,这些规则和交互能够使用抽象数据接口来定义.如果在C中实现,它们能够使用函数指针和返回值定义。整个脚本语言体系的实现是这两种方式的结合。一般使用枯贴代码方法进行相互独立构件之间的灵活交互,而构件与解释器之间的交互采用配置脚本方法实现。例如,文Tk的Button工具使用粘贴代码方法去指示当用户按下按钮时发生什么事件和通过一个二进制接口句柄去向它的图形管理者发出请求.从某种意义上说采用高级程序设计语言的程序设计也是一种构件的粘贴,只不过此时的构件被看作是高级程序设计语言中的对象或函数.此种构件之间的关系紧密,且这种关系是编写程序时预先设定好的,并在程序完成时固定下来,不能动态地改变。设定这种关条需要对整个目标应用及实现工具有着透彻的了解,与脚本构件的粘贴存在着本质上的不同。总之,一个脚本构件的使用应不依赖于应用中的别的构件。构件和构件之间的交互行为不是固定的。它能由脚本编写者参数化,并在执行期间动态地改变。由于枯贴代码方法必须解释执行,用脚本语言编写出的脚本必定会为这种灵活性付出性能上的代价。1.2.2脚本语言的特点由以上脚本构件的灵活的粘贴特性的要求,脚本语言必须具有如下特点:(1)脚本语言的无类型性。为了粘贴构件任务的简易性,脚本语言要求是无类型的。例如Tu和VbScript中的一个变量在某一时刻保存有一个字符串而在另一时刻可能保存有一个整数。脚本语言对于构件的形式没有预先的限制,而且所有的构件和值都以统 一的形式表示因此,任何构件或值可以在任何场合使用。为了某一目的设计的构件可以用于设计者没有想到的完全不同的目的。例如,文2在Unix shell中所有的过滤程序从输入读入一个字节的流然后写一个字节的流到输出,任何两个程序可以通过这种方式连接起来。下面的shell命令叠放三个过滤器在一起以计算包含有字”scripting”的行数: select grep scripting weselect程序读取当前显示中被选择的文件并且输出文件到输出端,再由grep程序读入并且对于包含有"scripting”字符串的行输出,并由w。程序计算输出行的行数。这些程序中的任何一个都可以应用于执行其他不同任务的多种场合。由此看来,脚本语言的无类型特性似乎允许某些错误存在,但是实际上脚本语言与高级程序设计语言是同样安全的。对于参数错误检查,脚本语言一般是在运行时进行。强类型高级程序设计语言是在编译时进行,因此在运行期间检查所需的时间花费被节省下来。这样以效能为先决条件的结果限制了信息的使用,同时减少了程序的灵活性。(2)脚本语言的被解释执行。脚本语言和高级程序设计语言的另一点不同是脚本语言通常是被解释执行,而高级程序设计语言是编译执行。解释执行不需要花费编译时间,能够快速地实现应用。由于允许用户在运行期间编制应用程序,解释器还可以更加灵活地粘贴构件。例如,某些集成电路的综合分析工具就集成有Tcl解释器。另外解释器还允许通过以动态产生代码的方式使得实现功能的工作更加有效。例如,一个基于Tcl的网络浏览器能够通过使用几乎没有规则的表述代替翻译主页的HTML成为一个Tcl脚本语言,然后执行脚本语言将页显示在屏幕上.脚本语言比起高级程序设计语言来较为低效,部分原因是由于它们使用解释器代替了编译器,也有部分原因是为了使它们的基础构件更加有效而对其进行了封装,使得其更加易用。例如,脚本语言可以根据情形的不同使用可变长度的串,而高级程序设计语言必须使用一个对应单个机器字的二进制值,并且脚本语言使用Hash表,而高级程序设计语言使用索引数组。幸运的是,性能并不总是主要因素。脚本语言的应用程序通常比高级程序设计语言的应用程序要小,并且使用脚本语言设计的应用的性能也受到其构件性能的影响,而构件的实现完全使用高级程序设计语言。脚本语言比高级程序设计语言处于更高的层次.一条语句比起高级程序设计语言能够做更多的工作。一条典型的脚本语句能够执行几百或几千条机器指令,而相对来说高级程序设计语言的语句大约能够执行五条机器指令。这些差异的产生,部分原因是由于脚本语言使用了解释器,根本原因还是由于脚本语言中的原语操作具有更强的功能。例如,Perl对于规则表达式的引用就象对整数地址的引用一样容易。1.2.3 脚本语言的构成脚本语言的基本构成和一般系统程序设计语言大体相同,可以说是系统程序设计语言的一个子集,支持整型、浮点型、字符串等基本数据类型,支持无类型变量,支持顺序、循环、条件等基本语句结构.脚本语言的特点主要是无类型性、解释性、简单性和高效性。一个程序设计语言的类型特性的强弱是指程序中的数据信息在使用前要求作出说明的严格程度.在一个具有强类型特性的语言里,程序员必须预先对每个数据信息怎样被使用作出严格的规定,然后在使用中,如果违背了这些约束就认为是错误;而在一个无类型特征的语言里,不必对数据信息怎样被使用做预先的限制,信息的具体含义由使用方式决定.在存储器里字可以表示任何种类的值,如整型、浮点数,指针或一条指令,值的含义是由使用它的方式决定。脚本语言的无类型特性使得它能更方便地进行组件粘贴和组合,不需要对组件怎样被使用做预先的限制.并且所有组件和数据都用统一的方式表示,这样任何组件或数据都能在任何情况下使用;为了某一目的而设计的组件能被用作设计者从未预见到的完全不同的目的.例如:在Unix Shell中,一个过滤器程序总是从输入口读入字节流而从输出口输出字节流,任何两个程序都能通过管道互相联接起来.下面的shell命令通过管道把3个程序联接到一起计算出被选定文本中包含单词“VBScript”的行的数目:select |grep VBScript| wcselect读入当前显示器上选中的文本并输出到打印机,grep读入该文本并打印包含“VBScript”的行,wc计算输入的行数.这些命令都还可用于实现其它不同的目的.这就是无类型的优点。1.3选用语言的策略脚本语言不能取代高级程序设计语言,反之亦然。它们各自适用于不同任务。有了粘贴和系统集成,使用脚本语言设计应用程序速度可以提高5到10倍。高级程序设计语言需要大量加工和转换代码来连接不同的部分,而这种连接在脚本语言中是直接进行的.对于复杂的算法和数据结构,使用强类型的高级程序设计语言使得程序更加容易管理。同时对于要求执行速度的应用.使用高级程序设计语言能够比脚本语言快10到20倍,这是由于高级程序设计语言不需要运行时的检查。在接手一个特定的任务时,判断究竟是使用脚本语言还是高级程序设计语言可以考虑以下几个方面:·建立应用的主要工作是否是连接一些预先存在的主要构件?·应用是否将处理多种不同种类的事物?·应用是否包括GUI?·应用是否需要对许多串进行处理?·应用的函数是否需要快速的研制?·应用是否需要扩展?对以上问题的肯定回答建议使用脚本语言。脚本语言和高级程序设计语言是井生的。此两种语言的结合使用,能提供具有强大功能的编程环境,高级程序设计语言被用来编制供脚本语言使用的构件。例如.Javascript中一个非常吸引人的特点是能够简单地使用C编写的ActiveX构件设计应用CaI。在UNIX中同样可以使用C编写的应用较容易地编写shell脚本。1.4脚本语言的应用脚本语言已经存在很长时间,直到最近几年,多方面因素的结合才使其显得越发重要起来。其中最重要的因素是混合应用向粘贴应用的转换。这种转换的三个典型例子是GUIs,Internet、构件框架。1.4.1图形用户接口(GUI)GUIs首先出现于80年代早期,到了后期得到了广泛的应用。GUIs目前在一个程序设计工程中占有全部工作的一半或更多。GUIs是最基本的枯贴应用,其目的并不是建立一些新的功能而是建立起图形构件库和应用的内部功能之间的联系。1.4.2 InternetInternet的广泛应用也促进了脚本语言的流行。Internet从本质上来说就是一个粘贴工具,它并没有建立一些新的计算和数据,只是使已经存在的大量数据可方便地被访问。用于Internet程序设计任务的最理想的语言是能够很好地连接所有构件在一起的脚本语言。例如.Perl被用来编写CGI脚本和JavaScript被用来编写Web页。1.4.3构件框架面向脚本应用的第三个例子是构件框架,例如ActiveX和JavaBeanso高级程序设计语言适合于完成建立构件的工作,而脚本语言适合于组织构件成为应用的工作。如果没有一个好的脚本语言来处理构件,那么构件框架的强大功能就会失去。了解到这一点就会明白为什么构件框架在以VB Script为便利的脚本工具的PCs中取得了巨大的成功。1.5其它语言这篇文章并不针对所有编程语言的全部特性。目前许多语言并不能明确地将其区分为高级程序设计语言或脚本语言,而是结合了此两类语言的各自的优点。例如,Visual Basi。语言就是这样一种混合型语言。它综合了脚本和高级程序设计语言各自的优.点 ,既提供了大量GUI控件和对某些标准构件框架如ActiveX粘贴功能的支持.同时又可以运用属于高级程序设计语言类的标准BASIC语句和函数编写程序。目前许多传统的高级程序设计语言都在逐步发展为混合语言,就连以自由灵活、低级高效著称的C语言也是如此,如微软公司的Visual C+6. 0.第二章 脚本语言和系统编程语言的互补性尽管对于粘贴型和系统集成型应用程序,用脚本语言能以几乎快10倍左右的速度开发,但是对于包含复杂算法和数据结构的系统,系统编程语言的强类型性能够使程序更容易控制.在那些运行速度要求很高的地方,系统编程语言能以比脚本语言快10到20倍的速度运行.而且脚本编程所使用的组件都需要用系统编程语言精心组织和编写.显然,两类语言具有很强的互补性.把它们结合起来使用就能产生强大功能的编程环境:系统编程语言用于生成组件,脚本语言把它们组合起来构成应用程序。历史的发展也说明了它们是互补的.从下表1可以看出,在过去的30年里,它们始终是同处于相同的环境之中,并没有随着时代的变迁而出现谁代替谁的情况。表1 脚本语言和系统编程语言的发展统计表2.1 使用脚本语言开发应用程序的步骤 一般具有以下特征之一的应用任务,使用脚本语言编程,可以成倍提高系统开发速度,获得更高的商业利润。.主要任务是连接已经存在的组件.Web数据库应用.包含大量GUI图形用户接口.系统演变速度快在确定使用脚本语言开发系统以后,在实施开发时,可按以下基本步骤进行: 1)进行应用需求分析设计,建立应用组件框架;2)组件准备:网络下载,市场购买或现场开发;3)选择脚本语言和相关工具:根据组件特征和运行环境,选择合适的脚本语言和相关工具;4)用脚本语言编写程序,粘贴组件,完成应用开发.本文在LSPMIS的Web浏览器应用系统的开发中,遵循上述步骤,第1步,首先建立Web浏览器应用系统组件框架模型(如图2.1)。图2.1 LSPMIS Web浏览器应用系统组件框架模型 整个LSPMIS Web浏览器应用系统主要包括主控、发电、设备、热工、物资、燃料、劳资、化学、综合、可靠性、财务等28个子系统130个网页,每个网页的功能都是实现数据的查询,分析和显示.系统使用的通用组件主要有:数据对象组件、内容链接组件、文件系统组件、浏览器功能性组件、广告转子组件、曲线图显示组件、条形图显示组件、圆饼图显示组件、数据列表显示组件等;专用组件有:设备可靠性分析组件、人员结构分析组件、财务分析组件等.系统采用VBScript脚本语言粘贴组合各类公用组件和专用组件,形成对应网页的脚本程序,通过ASP(Active Server Page)5执行网页脚本程序,访问DBMS,完成相应功能。第2步,根据图1进行组件准备,公用组件一部分从Internet下载,一部分从公司购买;专用组件则用Java语言自行设计.第3步,根据组件的特征,选择VBScript作为脚本语言.第4步,开发小组通过2天学习,熟悉VBScript,HTML,明确具体编程任务.在实际编程过程中,由于有大量现存组件作基础和VBScript强有力的组件粘贴特性及组件的重用特性,使得我们的开发工作共用了120个工作日就圆满完成了,根据过去用C或C+开发的经验,像这样复杂的程序恐怕1200个工作日也完成不了。2.2 脚本语言效果统计分析根据本文开发的多个应用系统以及国外的有关实例,分别对采用系统程序设计语言C或C+、脚本语言VBScript、JavaScript进行编程对源程序代码行数以及行数比、脚本程序组件重用率、开发费用比、开发周期比等特征参数进行了统计,其统计结果为表2.1所示。表2.1 C或C+语言和脚本语言的效果分析注*组件重用率=各种组件使用总次数/不同组件个数;*行数比=C或C+代码行数/脚本代码行数 从表2.1可以看出,使用脚本语言编程在减少编程工作量、提高组件重用率、缩短开发周期、降低开发费用等方面较系统编程语言具有明显的优势,这一方法适应了软件组件体系结构和组件技术的发展。需要指出的是:在开发一个实际的应用系统时,究竟采用什么样的编程语言,这是需要认真考虑的.正如作者在第3节中指出的那样,只有具有4个特征之一者,使用脚本语言编程才有显著的效果.并且在设计系统时,必须采用软件组件体系结构方法,尽量采用商用组件,以获得更高的软件生产效率。第三章 Windows脚本组件技术Windows脚本组件技术为开发者提供了用脚本语言创建功能强大、可复用的COM组件的简便方式. 开发者可以使用任何支持Microsoft ActivcX Scripting接口的脚本语言来创建脚本组件,支持这些接口的脚本语言有JScript, VB-Script和PERLScript等。使用脚本组件uJ以为多种任务创建COM组件,如访问和操作数据库数据、给应用程序添加事务处理以及使用DHTML Behavior给Web页添加交互效果等。3.1脚本组件技术3.1.1脚本组件的运行脚本组件的运行涉及三方面内容:脚本组件运行时程序( Scrobj.dll),接口处理程序和脚本组件文件(扩展名为wsc)。(1)脚本组件运行时程序(Scrobj.dll)用来帮助将COM请求发送到脚本组件。Serobj.dll是主机应用程序的入口点并作为脚本组件的inproc服务器执行。(2)接口处理程序是己经编译好的实现特定COM接口的组件。复杂的COM组件叫以包括多个接口的实现。最常使用的接口处理程序包括COM Automation接口处理程序、ASP接口处理程序以及用于DHTML Behavior的处理程序。这些处理程序都己内置于脚本组件运行时程序中,其它处理程序叫作为外接组件或嵌在相关的应用程序中。其中,Automation组件是最常使用的COM组件类刑,该组件拥有属性和方法,其它应用程序可以调用这些属性和方法。实现这些功能所必需的低层次COM接口都内置于Automation接口处理程序中。在脚本组件文件中只需定义需要说明的属性、方法和事件,便可确保主应用程序对Au-tomation处理程序的正确调用。(3)脚本组件文件属于可扩展的标记语言(eXtcnsiblcMarked Language,简称XML)文件。用户可遵循XML元索的规则来开发只包含简单函数功能的COM,也叫开发包括外接组件的复杂COM。3.1.2脚本组件文件的框架Windows脚本组件文件采用XML来编写。XML元索定义了脚本组件及其操作。下面的示例演示了个脚本组件文件的框架。其中几个主要脚本元索意义如下:(1) <componcnt>元索包含的是个完整的脚本组件定义。在同一个.wsc文件中可出现多个<component>元索,但这些<component>元索应包含在一个<package>元索内。(2) <rcgistration>元索包括用来将脚本组件注册为C_OM组件的信息。如果宿主应用程序(如IE)在创建该脚本组件的实例时没有直接用到Window、注册表,则该元索可省略。(3)<script>元素包含用来实现脚本组件逻辑的脚本,这取决于所创建的COM组件类型。如果开发者创建的是COM Automation组件,-则可以在<public>元素中声明属性、方法和事件,然后用一个或多个<script>元素编写脚本来定义这些内容。(4 ) <reference>元素引用在脚本中需使用的类型库. 3.1.3脚本组件的使用在Windows资源管理器中, 用鼠标右键单击脚本组件(.wsc) 文件,然后选择”注册”,或者使用新发布的Regsvr32.exe注册程序,并使用下述命令。Regsvr32UTL/componentname.wsc在创建和注册Windows脚本组件后,就可以像使用任何COM组件一样,通过宿主应用程序调用来使用该脚本组件。宿主应用程序可以是VB、C+、IE等应用程序。根据宿主应用程序和脚本组件类型,以及部署该脚本组件的位置,在创建脚本组件的实例时会有各种选项。其中最主要的差别是在本地还是远程创建脚本组件的实例。实例化本地组件实例化远程组件3.2脚本组件应用实例编写脚本组件不像使用VC、VB等高级语言编写COM组件那样需要复杂的集成开发环境。开发者只需使用简单的文本编辑器就可以进行脚本组件的开发。下面结合一个脚本组件实例(简要阐述应用脚本组件进行系统业务开发的过程。这个脚本组件将连接数据库服务器,并打开数据库连接.3.2.1脚本组件文件3.2.2应用脚本组件创建和注册脚本组件以后,开发者就可以在VC、VB、IE等宿主程序中使用组件,如下是在IE中使用组件的一个例子。开发者除了可以像以上直接实例化组件对象使用脚本组件外,还可以为脚本组件生成一个类型库,该类型库包括组件的接口和成员的信息。在有些宿主应用程序(如VB)中,如果要给脚本组件编写事件能力,则类型库是必需的。使用类型库可以将事件绑定到脚本组件上,并且在VB中可见。此外,在编写脚本组件的相关VB代码时,对象浏览器中将出现类型库信息,从而使开发者能够很方便地查看和使用脚本组件的方法、事件等成员。开发者可以像以下这样为一个脚本组件生成类型库。在Windows资源管理器中,用鼠标右键单击脚本组件文件,然后选择”生成类型库”。这将为脚本组件生成一个与脚本组件文件名同名的.tlb文件,并在Windows注册表中注册。该文件将与脚本组件文件处在同一文件夹。如果要更精确控制类型库的生成,开发者可以在脚本组件文件中动态地生成类型库,或者也可以使用命令行接口,如下为脚本组件(创建了一个类型库。第四章 C/C+代码自动生成脚本语言接口的实现4.1国内外现状解决脚本语言和C/C+代码集成的主要办法是开发一个可扩展的接口编译器,将C/C+代码转换成指定的脚本语言接口。这样,很多问题就迎刃而解。比较出名的工具有:(1)SWIG(simplified wrapper and interface generator):它是由一个具有特殊用途的C+编译器发展而来的。最早出现在1995年Los Alamos国家实验室,用来为SPaSM短程分子动态学代码生成脚本语言接口。(2)F2PY(Fortran to Python interface generator):主要是在Fortan和Python之间提供一个连接。它实际上是Python的一个扩展工具,根据指示文件产生Python C/API模块。它不支持C/C+。我们自己设计了一个IG(Interface Generator)可扩展的接口编译器。它支持Tcl、Python、Perl和C、C+等多种语言,同时也高效地支持了C/C+高级编程风格。目前,IG用于自动测试工具中并取得了良好的效果。随着IG的不断优化,其用途必将越来越广。4.2可扩展的编译器(IG)IG是一个简化脚本语言和科学软件集成的接口编译器,但不是一个完整的C/C+编译器。其基本原理是:直接把C/C+头文件编译成脚本语言接口。4.2.1 IG的实现4.2.1.1实现IG的前端是由一个扩展的C+预处理器和分析器组成,但它们的实现方式与传统的不一样。原因在于它们的输入文件同时混合了特殊的IG指示(前面以%开头)和C+声明。IG主要关心的是接口,因此不会去分析函数体。从内部来说,IG构造了一个完整的分析树并提供了一个横向的API。那些API与XML-DOM规范中所描述的相类似。在代码生成期间,一系列分层次的处理函数来处理分析树节点。处理函数会决定是直接生成包代码还是转换节点并交给其它处理函数来处理。利用C+类虚拟方法选择机制来定义每个目标语言的行为。从最小要求来看,一个语言模型仅仅需要实现产生函数和变量的处理函数。例如:为了能对类和结构体打包,一个语言模型通常会实现更多的处理函数。下面是IG实现Tcl语言模型:其余的语言模型实现方式都是类似的。4.2.1.2 IG组织结构图1显示了IG的组织结构。预处理器的功能是实现条件编译和宏扩展,生成IG和C编译器都可接受的接口/头文件。IG的核心部分是一个YACC(Yet AnotherCompiler-Compiler)分析器。分析器的输入是一个包含IG指示和声明的文件。为了生成代码,分析器调用大约10多个的函数来实现如下的一些功能:写一个包装函数,连接一个变量,对一个C+成员函数打包等。每个目标语言都是以一个C+类来实现的。当然,这个类也包含能产生C代码的函数。文档系统实现的方式也是类似的。能产生的文档有:ASCII,LaTeX或HTML。IG的输出是一个C文件和一个文档文件。C文件也可以集成到解释器中;文档文件仅供大家参考。图1 IG的组织结构4.2.2关键技术该小节主要解决类型、类、对象和一些C+高级编程风格的转换问题。4.2.2.1类型体系实现IG真正的问题在于复杂的类型体系。对于类型,需要正确地处理程序中的typedef,名字空间和其它类型相关的声明。类型是语言之间数据编组的焦点;同时也是许多C+问题(包括:内存管理,重载,模板和继承)的基础。IG的默认方法是:导出所有的非基本的类型并把它们看成是非透明的类型标签指针。这样就可以避免上述相关问题;同时在脚本解释器中可以操作任何类型的对象。IG使用一个运行类型体系来确认:只有可以接受的类型指针才传递到包中。下面以指针为例来分析IG处理类型的方法。IG把指针映射成包括值和类型的字符串。例如,一个"Vector*"指针在Python中类似:_100f8e2_p_Vector。在Python中,指针是非透明的对象。但能够在不同的C函数之间传递并操作。总的说来,指针在Python中和C中的工作方式是一样的。二者根本区别在于:Python中不能废弃指针。换言之,不能够查看对象内部并进行操作。这样做的好处在于,避免了许多数据表示相关的难题,并且适合多目标语言。其实,Python中操作C+对象也是采用类似指针的方法。结构体和联合体的实现机制与3.2.2节中的类实现相似。4.2.2.2类和对象对于面向对象编程来说,IG把过程和变量映射到目标语言等价对象中去。例如,一个C函数映射成脚本语言中的一个命令,一个全局变量映射成脚本语言中的变量。对于C+来说,IG能够创建一个真实反映目标语言中类接口的包。例如,定义一个类如下:为把类打包,首先把类压缩成过程包。如:接下来,这些过程用来构建用目标语言写的代理类。如,用Python:在代理类中,对于下层的C+对象保存在一个特殊的属性中(.this)。属性值包括指针值和类型表示符。例如,一个Complex*对象的属性值:_100f8ea0_p_Complex在包中的类型信息用于运行类型检查。类型检查遵循C+相同的规则,如:继承,域和typedef。此外,IG完全支持多重继承。4.2.2.3特殊的指示对于复杂的应用程序,IG可能需要一些帮助才能产生包。IG提供了很多特殊的指示用来控制包代码产生。这些指示可以放在输入文件的任何地方,也可以与C+声明混合。假设想把C+重载操作符与Python操作符联系起来。一种方法如下:特殊的指示还可以解决如其它一些问题:C+中的模板和目标语言并不支持的C+风格。例如,Python中的赋值语法完全不同于C+中的。于是,可以忽略赋值操作符:4.2.2.4自定义利用一些特殊的指示可以修改IG代码生成器。最常用的指示如类型映射。类型映射改变IG中转换包中函数数据的方式并集成到类型体系中。其余自定义是与所有声明有关。例如,如果想在一个指定的类方法中获得一个C+异常并转换成一个Python异常,那么可以按如下方法:如果Object是一个基类,异常处理代码会被粘贴到衍生类中出现getitem的地方。既然只需定义一次且衍生类自动继承,所以这种方法非常有利于用抽象类定义接口。常见的自定义指示有:%rename,用于解决名字冲突;%ignore,忽略无用的C+风格;%exception;%extend,简单的使用新属性来扩展已经存在的类和结构;%feature等.其具体应用参考IG用户手册。事实上,大量的IG指示只不过是宏的预处理,最后都扩展成%typemap或%feature指示。4.3小结及以后的工作IG是一个简化脚本脚本语言和科学软件集成的编译器。它特别适合现有软件并支持一系列的C+语言特点。使用自动代码生成器如IG,程序人员很容易在程序开发的各个阶段使用脚本语言。科学家利用脚本语言很容易构造集数据分析、可视化、数据库管理和网络等一体的软件。设计IG的目的是用来支持C/C+开发软件,它不适合其他语言。IG不是一个完整的C+编译器,也不支持某些先进的C+特性,如嵌套类定义。此外,诸如重载操作符和模板也需要额外的指示。IG以后的工作主要集中在生成代码的质量,支持更多的语言和增加可靠的特点。参考资料1 Windows脚本技术 介绍Windows脚本的基础知识2 WMITools 学习脚本必备,包括CIM Studio、Event Registration、Event Viewer和Object Browser四个工具3 WMI技术指南 出版社:机械工业出版社 作者:Marcin Policht4 System Administration Scripting Guide 包含大量WMI脚本示例5 Script Encoder 官方脚本编码工具6 微软脚本中心7 MS Windows Script Host 2.0 Developers Guide总 结在这次由我自已亲自参加、亲自设计制作的数据库系统中,收获非常的大. 从一开始策划到制作的整个流程中,遇到了非常多的困难,首先,由于VC的基础知识掌握得不够劳固,以致在开发过程中不知从何如手,并且在涉及到VC高级知识的运用的时候,更是非常的困难,但这并没有成为我迈向知识殿堂的障碍,反而以此为动力,通过四处查询、积极参与、询问老师,以前所面对的问题一个一个迎刃而解。在这次课程设计的制作中我体会地体会到了要想从事计算机程序开发这方面的工作,那和做为一个程序员的我们本身所具有的素质是非常的关键和重要的,它与项目开发的结果息息相关,比如说:要是一个程序员在开发的过程中遇到了一时间不能解决的问题的时候,不能够有一颗良好的心态去面对、去解决这个问题、而是选择了放弃或逃避问题的话,那么这个问题是始终不能解决的,所以在这次程序的开发中我不仅学到了很多关心VC编程的知识,懂得了许多以前不懂的格式、技术。而更重要地是我在这次事情的参与中明白了做了一个程序员来说:我们必须时刻发挥我们年轻人拼搏、努力向上奋斗、大胆挑战自己、踏实的品质。也明白了做程序重要的是要有耐心,要坚持不懈,要善