




已阅读5页,还剩49页未读, 继续免费阅读
(计算机应用技术专业论文)函数模板抽象描述语言设计及到c的转换.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 描述是随着人类实践的发展而发展的,是人类文明进步的重要过程。计算机 程序设计语言就是人们为描述计算过程而设计的一种具有语法语义描述的记号。 程痔设计语言经历了咒个阶段的发展,基前,人们普遍采用面向对象程序设 计语言来开发软件系统。面向对象技术极大地提高了软件开发的效率,其中,重 用技术是提高面向对象软件开发效率的重要机制之一,因此,本文尝试提出种 合理的描述方式,对e + + 中一种能有效地减少源代码并增强软件可维护性的强大 机制一函数模板进行进一步的抽象,设计豳数模板抽象描述语言,并进行了该 语言到c + + 的转换系统的研究。本文的主要工作如下: 1 设计一种函数模板抽象摇述语言h d l o f t 。通过深入研究函数模板表述的 特点,抽象出它们表述上的共性,设计一种豳数模板抽象描述语言a d l o f t ,以力 求在程序设计中使用大量的函数模板时利用该语言能快速生成所需要的函数模 板,从而减轻程序设计人员的工作量。 2 设计了由a d l o f t 程序到c + 手的转换系统。该系统包含了词法分析器、语 法分析器、语义分析器、符号表和代码生成器的设计和实现。在设计中使用了一 些常用的设计模式,使得模块化程度高,易于维护和升级。 关键词:描述;软件复用:a d l o f t 语言;函数模板;转换系统 a b s t r ac t d e s c r i p t i o n , w h i c hi sd e v e l o p i n ga l o n gw i t hh u m a np r a c t i c e ,i sa ni m p o r t a n t p r o c e s so fh u m a nc i v i l i z a t i o n c o m p u t e rp r o g r a m m i n gl a n g u a g ei sad e s c r i p t i o n m a r kw i t hg r a m m a ra n ds e m a n t i ct h a tp e o p l es p e c i a l l yh a v ed e s i g n e dt od e s c r i b e c a l c u l a t ep r o c e s s 。 t h ed e v e l o p m e n to fp r o g r a m m i n gl a n g u a g eh a sg o n et h r o u g hs e v e r a ls t a g e s a t p r e s e n t ,i t i s w i d e l yu s e d t o d e v e l o p s o f t w a r e s y s t e m sb yp e o p l e w i t h o b j e c t o r i e n t e dp r o g r a m m i n gl a n g u a g e 。o b j e c t o r i e n t e dt e c h n ol o g yh a v eg r e a t l y i n c r e a s e dt h ee f f i c i e n c yo fs o f t w a r ed e v e l o p m e n t ,a m o n gt h e m ,r e u s et e c h n o l o g yi s o n eo ft h ei m p o r t a n tm e c h a n i s m st oi m p r o v et h ee f f i c i e n c yo fs o f t w a r ed e v e l o p m e n t s ot h ep a p e ra t t e m p t st op u tf o r w a r dar e a s o n a b l ed e s c r i p t i o nm e t h o d ,a n df u r t h e r a b s t r a c tt h ef u n c t i o nt e m p l a t e st h a tc a ne f f e c t i v e l yr e d u c et h es o u r c ec o d ea n d e n h a n c es o f t w a r e m a i n t a i n a b i l i t y ,d e s i g na n a b s t r a c td e s c r i p t i o nl a n g u a g eo f f u n c t i o nt e m p l a t e s ,a n dm a k ear e s e a r c hf o rt r a n s f o r m a t i o ns y s t e mf r o mt h e l a n g u a g et oc + + t h em a i nw o r ki nt h i sp a p e rc a nb es u m m a r i z e da sf ol l o w s : 1 d e s i g n ak i n do fa b s t r a c t d e s c r i p t i o nl a n g u a g e o ff u n c t i o n t e m p l a t e ( a d l o f t ) 。b yd e e p l ys t u d y i n g t h ed e s c r i p t i o nc h a r a c t e r so ff u n c t i o n t e m p l a t e s ,a b s t r a c t l ya t t r a c t i n g t h ec o m m o na b o u ts t a t e m e n t s ,d e s i g na na d l o f t w h i c ht oa p p l y i n gt h el a n g u a g et og e n e r a t i n gt h er e q u i r e df u n c t i o nt e m p l a t e sw h e n u s e al a r g en u m b e ro ff u n c t i o nt e m p l a t e si np r o g r a md e s i g n ,t h u sw h i c hc a nr e d u c e t h ew o r k l o a do fp r o g r a md e s i g n e r 2 d e s i g nt h et r a n s f o r m a t i o ns y s t e mw h i c hc a nt r a n s f o r mt h ea d l o f tp r o g r a mt o c + + p r o g r a m t h es y s t e mi n c l u d e s t h ed e s i g na n di m p l e m e n t a t i o no fl e x i e a l a n a l y z e r ,s e m a n t i ca n a l y z e r ,s y m b o lt a b l ea n dc o d eg e n e r a t o r i nt h i sp a p e r ,s o m e c o m m o nd e s i g np a t t e r n sb eu s e d ,w h i c hm a k et h em o d u l a r i z a t i o ni sg o o da n dt h e s y s t e mi se a s i l ym a i n t a i n e da n du p d a t e d k e yw o r d s :d e s c r i p t i o n ;s o f t w a r er e u s e ;a d l o f tl a n g u a g e ;f u n c t i o nt e m p l a t e ; t r a n s f o r m a t i o ns y s t e m l i 长沙理工大学 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所 取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任 何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡 献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的 法律后果由本人承担。 作者签名:犹务磊 日期:2 0 0 8 年 月朋日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同 意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许 论文被查阅和借阅。本人授权长沙理工大学可以将本学位论文的全部或 部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制 手段保存和汇编本学位论文。 本学位论文属于 1 、保密口,在年解密后适用本授权书。 2 、不保密团。 ( 请在以上相应方框内打“4 ”) 作者签名:旅叁历 日期:2 0 0 8 年j - 月日 导师签名: 巧汽 日期:2 0 0 8 年瑚功日 1 1 研究背景和意义 第一章绪论 计算机技术的不断发展为计算机及其应用提供了大量技术先进、功能强大的 应用软件系统。软件系统是对客观世界中问题空间与解空间的具体描述,是客观 事物的一种反映。所谓描述是指主体对对象的客观写照,它的发展不仅在人类文 明进步过程中具有决定性的意义n ,而且也是整个计算机领域的中心议题1 。描述 是随着人类实践的发展而发展的,是人类文明进步的重要过程,这也正是深入系 统地研究描述的重要意义所在。合理的描述至少应该满足以下几个具体要求:较 强的描述能力、自然地描述对象、具有一定的抽象层次和面向问题。对于计算机 领域来说,还要求描述的可操作性较好,并且一般还要求具有一定的可构造性。 随着计算机应用领域的不断扩大,人们对计算机软件产品的功能、质量、开 发成本和时间提出了越来越高的要求。但软件系统开发一直被两大难题所困扰, 一是如何超越程序复杂性障碍,二是如何在计算机系统中自然地描述客观世界。 长期以来,人们一直致力于研究如何在计算机系统中更加合理地描述客观世界, 并且取得了长足的进步,每一次的进步本质上都是以更合理的方式在计算机系统 中描述客观世界。 任何能描述算法和数据结构的标记都可以构成一种程序语言。在软件技术发 展的初期,机器语言或汇编语言中的指令是描述客观世界的基本方式,这种描述 方式的抽象层次很低,是面向机器的低级语言,软件的生产效率非常低。2 0 世纪 5 0 至6 0 年代,出现了以a l g o l 和f o r t r a n 等为代表的高级语言,它们以算法技 术描述客观世界,这种描述方式是充满技巧和窍门的,程序的可读性很差。7 0 年 代,出现了以p a s c a l 、c o b o l 和c 等为代表的高级语言,它们使用了结构化的 程序设计技术,实现了模块化的数据抽象和过程抽象,可以在更高的抽象层次上 描述客观世界,大大改善了程序的可读性。然而,随着软件规模的不断增大,软 件自身的复杂性迅速增长,这种描述方式仍然难以克服程序复杂性的障碍,灵活 性也不够高。8 0 年代初面向对象程序设计语言诞生并逐步流行,出现了以 s m a l i t a l k 、c + + 等为代表的面向对象语言,为人们提供了一种以对象为基本计算 单元,以消息传递为基本交互手段的描述方式。它实质上是以拟人化的观点来描 述客观世界,即客观世界是由一系列对象构成,这些对象之间的交互形成了客观 世界中各式各样的系统,使人们能够以更合理的方式描述客观世界晦1 。面向对象技 术以其良好的抽象性、封装性、灵活性和可复用性,在理论研究和工程实践中都 成为较成功的软件开发技术,已经成为软件开发的主流技术1 1 。随着面向对象技 术的广泛应用,其固有的一些不足和缺陷也得以显露出来,9 0 年代中期泛型程序 设计( g e n e r i cp r o g r a m m i n g ,g p ) 开始发展,并得到越来越多的关注。泛型程序 设计技术是对面向对象技术的超越,它在面向对象的组件技术基础上研究如何进 一步对算法、数据结构和其他软件概念进行抽象和系统化组织,可以进一步提高 描述的抽象程度和程序的通用性“”。c + + 不仅支持面向对象的程序设计,同时也支 持泛型程序设计,其具代表性的是s t l ( s t a n d a r dt e m p l a t el i b r a r y ) ,它是迄今 最为成功和卓越的g p 范例,并被当作近年来程序设计技术领域里的一个里程碑式 的成就,获得了普遍的关注和认同抽,。 随着软件系统复杂度的不断增加,高效率地开发正确、可靠的软件,己成为 一个亟待解决的问题- 。软件技术的不断发展,计算机的应用范围也得到不断的扩 展,对软件系统的需求急剧上升,软件开发从质量、效率等方面均不能满足应用 的需求,为了更大程度的开发满足人们要求的软件,软件的可重用性思想产生了。 软件重用的概念是随着软件开发方法的不断发展而逐步建立起来的。所谓重用是 指利用现有的软件及其构件或者它们的抽象来构造新的软件系统,即将原有软件 或系统中的代码、数据和方法或者由它们抽象而得到的构件作为其中的一部分直 接引用。当今软件开发的主流思想即是如何在最短的时间内完成设计任务,采用 重用技术由于直接引用了原有的成分,必然能够提高软件的开发效率;另外重用 成分一般是经过检验的,质量可以保证,因此软件重用可以明显地提高软件质量。 由于软件系统越来越庞大,重用显得尤为重要。 代码重用是重用技术中的基本问题。c + + 中通过继承实现了派生类对基类的代 码重用,这种重用包含源代码和目标代码两方面,但它在目标代码中起的作用更 明显。与此对应,c + + 中的模板提供了一种更有效地减少源代码并增强软件可维护 性的强大机制。模板,又称参数化类型( p a r a m e t e r i z e dt y p e s ) 或类属( g e n e r i c s ) , 可为功能或结构相近的一族函数或类提供一种抽象处理模式( p a t t e r n ) ,即适应 广泛数据类型的可重用代码,在具体使用时则由编译器针对不同数据类型具体实 现。它可在很大程度上解决软件开发者最头痛的问题之一功能或结构相近代 码的重复编写,而减少源码量正是提高软件生产率的重要因素之一。因此,它被 看作是c + + 重用机制中可能最有影响和前途的一种方法。 c + + 的模板包括类模板和函数模板,模板是c + + 标准中相当重要的一部分,模 板具有可重用性和可扩展性,可以利用s t l 来实现效率很高的代码,它是通用程 序设计成为现实的理想方法。模板在现代程序设计中的应用非常广泛。 基于此,研究模板表述的特点,抽象它们的共性和特性,以便能达到更高程 度的复用是非常有意义的。本课题着重探讨函数模板表述的特点,总结共性,尝 试设计一种合理的描述方式,力求做到在程序设计中使用大量的函数模板时能快 速的生成所需要的函数模板,而且可以有效地转换为目标语言代码,从而减轻程 序设计人员的工作量,提高软件开发的效率。 2 1 2 国内外研究现状 描述是随着人类实践的发展而发展的,是人类文明进步的重要过程。计算机 程序设计语言是人们为描述计算过程而设计的一种具有语法语义描述的记号。 从计算机诞生至今,程序设计语言随着计算机技术的进步而不断发展。在高 级语言出现之前,机器语言或汇编语言中的指令是描述客观世界的基本方式,程 序生产效率很低,质量难以保证。后来出现的f o r t r a n 、a l g o l 等的高级语言是面 向解题过程的,可用接近自然语言和数学语言的语言对操作过程进行描述,但描述 方式是充满技巧的。七十年代出现的p a s c a l 、c 等的高级语言,使用结构化的程 序设计技术,在较高的抽象层次上描述客观世界,大大改善了程序的可读性。八 十年代出现了以s m a l l t a l k 、c + + 等为代表的面向对象技术,面向对象方法中的概 念和处理逻辑更接近人们解决计算问题的思维模式,使开发的软件具有更好的构 造性和演化性。高级语言的出现是计算机技术发展道路上的一个里程碑,它把计 算机从少数专业人员手中解放出来,使之成为大众化的工具。 软件是客观事物的一种反映,客观世界的不断变化促使软件技术的不断发展, 这种事物发展规律促使软件工程不断的向前发展。软件复用是软件工程中的重要 问题。目前,人们非常关注软件复用问题,真正的复用是为了支持软件在应用维 的演化,更好地凸现软件的构造性和演化特性,使用“为复用而开发的软件( 构 件) 来更快、更好地开发新的应用系统”。易于复用的软件,一定是具有很好构 造性和演化性的软件。 复用的思想在软件工程中已经广泛探讨了将近4 0 年了。复用概念的第一次引 入是在1 9 6 8 年n a t o ( 北大西洋公约组织) 软件工程会议上,m c i l r o y 的论文“大量 生产的软件构件”中。之前,子程序的概念也体现了复用的思想,但其目的是为 了节省当时昂贵的机器内存资源,并不是为了节省开发软件所需的人力资源”。 所谓重用是指利用现有的软件及其构件或者它们的抽象来构造新的软件系统,即 将原有软件或系统中的代码数据和方法或者由它们抽象而得的构件作为其中的一 部分直接引用。自从软件重用思想产生以来,计算机科学家和软件工程师就致力 于软件重用技术的研究和实践。在将近4 0 年的时间内,出现多种软件重用技术, 如库函数、模板、面向对象、设计模式、组件、框架、构架等1 “。各种重用技术 的发展为我们开发高效率的软件提供了可能,如果软件重用技术能够在软件开发 中普遍实践,估计十几年后就可以减少5 0 以上的软件预计成本”。 软件重用有很多吸引人的地方,不过要实现软件重用却不那么容易。有不少 公司和个人投入大量的时间和精力,然而成效不大,因为可重用项目的开发比常 规项目的要求高得多。可重用项目必须经过更加严格的测试,开发者还必须对本 领域很熟悉,同时要有较强的预见性。要进行全方位的软件重用是很困难的,但 代码重用是最直观、最容易想到的部分,也是程序员们最乐意追求和有成就感的 部分】。 9 0 年代中期泛型程序设计思想开始发展,并褥到越来越多的关注。c + 语蠢是 面向对象程序设计语言的杰出代表,c + + 不仅支持面向对象的程序设计,同时也支 持泛型程序设计,模板枧制就是泛型程序设计思想的体现。在c + + 中,模板 ( t e m p l a t e ) 这个概念已经存在十几年了,1 9 9 0 年出版的a n n o t a t e dc + + r e f e r e n c e m a n u a l ( 即“a r m ) 就已经介绍了模板的一些内容。近年来,c + + 的新发展主要 是在g p ( 泛型程序设计) 方面大放异彩:标准库,b o o s t 库,容器,迭代子程序, 仿函数等都是围绕g p 不断呈现出来的,它们代表了如今c + 十程序设计的特性。然 而在这种种技术的背后,隐藏着一种根深蒂固的共性:模板技术,处处都是模板 代码。可以说泛型程序设计本身就是基于模板的程序设计。也正是模板的这种编 译期机制,进一步地展现了g p 的优越,体现c + + 高效率的特点,更有助于g p 达 到与0 0 并驾齐驱的地位。 模板作为一个工具,可以用来开发更加干净,更具效率,更加智能的软件。 事实上,模板已经成为许多c + + 程序设计范例( p a r a d i g m s ) 的基石。与大多数传 统的语言构造相比,模板的不同之处在于:它允许我们在代码中对类型和函数进 行参数化。把局部特化和递归实例化组合起来,将会产生出入意外的强大威力。 模板的神奇在于我们可以针对多种类型对类和函数进行参数化。编译器用模板为 各种各样的函数和类产生代码,相同的模板可以用来产生许多的实例。 代码重用是高效率进行程痔设计的重要手段,c 语言中的类枫制、模板机制 都给代码重用提供了极大的方便。c 中的模板包括类模板和函数模板两种。由于 模板是语言本身所具有的特性,所以它完全支持类型检查和作用域,在现今的程 序中,模板的应用非常广泛。函数模板可大大简化很多具有相似或相近功能的模 块,从而可构成流程清晰简练、可维护性更好的代码。模板的这一特色可以使很 多遴焉算法的实现既简练又有广泛的适用性,这在软件开发中毒 常有意义。虽然 函数模板和据此生成的模板函数并不减少目标代码,但却可使程序开发者不做重 复工作且保证程序的正确和有效性,而且其使用也非常灵活。 在软件开发的过程中合理有效的使用重用技术是提高软件开发效率的重要手 段,模板就是代码重用技术中的一种重要机制,在现今的软件开发中应用非常广 泛。本文尝试设计一种合理的摇述方式对蘧数模板进行攒述,使程序员能够只用 简单的语句,便可描述出结构相似的函数模板,并且快速生成可执行的目标语言 代码,在一定程度上实现程序编码的自动化,并且能达到重用的目的。 1 。3 主要工作 本文在深入理解当前较为流行的面向对象程序设计语言中的模板机制的基础 上,通过分析函数模板表述的特点,抽取它能的共性,对函数模板的一些主要概念 进行了抽象、简化、设计了一种函数模板抽象描述语言a d l o f t ( a b s t r a c td e s c r i p t i o n l a n g u a g eo f f u n c t i o nt e m p l a t e ) ,并设计开发基于这种语言的简易开发环境。使用 毒 这种语言定义的函数模板可以方便地转换为面向对象的程序设计语言。使用这种 语言,程序员用简单的语句,便可描述出结构相似的函数模板,并且快速生成可 执行的目标语言代码,在一定程度上实现程序编码的自动化,并且能达到重用的 目的。 本文主要的工作大体分为以下阶段进行: 1 、研究函数模板表述的特点,抽象出它们表述的共性。函数模板是那些被参 数化的函数,它们代表的是一个函数家族。根据函数模板的表述特点进行抽象, 定义出函数模板抽象描述语言语法结构。 2 、设计该抽象描述语言的文法、语法定义,并设计它们的语义。任何一种语 言都有其相应的词法规则和语法规则,为了使语言简单易学,词法规则不应该太 复杂,但必须能够准确描述该语言;语法规则的定义也应该既简单明了,又能够 正确描述,而且还不会给语法分析带来困难;语义的设计也要能够正确地反映所 抽象定义的语言。 3 、函数模板抽象描述语言到c + + 的转换系统研究。该系统包含了词法分析器、 语法分析器、语义分析器、符号表和代码生成器的设计和实现。 本文基于对函数模板描述的分析,设计了函数模板抽象描述语言的文法、语 法和语义;采用编译原理技术,设计了函数模板抽象描述语言到c + + 的转换系统, 在一定程度上实现程序编码的自动化,达到了重用的目的。因为在语言设计中考 虑了简单易用和易于实现的原则,所以具有较好的实用性。 1 4 论文结构 本文主要研究函数模板抽象描述语言设计及到c + + 的转换。 本文的主要结构如下: 第一章,阐述了软件系统开发中软件可重用性、软件开发效率问题,提出了 可行的解决方法,并简要地介绍了本文的主要研究内容。 第二章,介绍了函数模板抽象描述语言的设计思想,包括该语言的设计所采 用的模型,设计的理论基础,以及各种语言特性的设计等。 第三章,给出了函数模板抽象描述语言的文法,对文法进行了解释,并且设 计出了它们的语义,最后给出了一个简单的例子说明用这个语言定义该函数模板 的过程。 第四章,介绍了a d l o f t 语言的词法分析器的设计,语法分析器的设计,符号 表的设计,语义分析器的设计和代码生成器的设计,并给出了从a d l o f t 语言到c + + 转换系统的部分实现。 第五章,对论文进行了总结,并对本文研究工作的前景作了展望。 第二章函数模板抽象描述语言的设计思想 软件开发过程中合理有效的使用重用技术是提高软件开发效率的重要手段, 模板就是代码重用技术中的一种重要机制。在现今的程序中,模板的应用非常广 泛。函数模板可大大简化很多具有相似或相近功能的模块,从而可构成流程清晰 简练、可维护性更好的代码。虽然函数模板和据此生成的模板函数并不减少目标 代码,但却可使程序开发者不做重复工作且保证程序的正确和有效性。本文在函 数模板的基础之上采用函数型语言的方式来介绍函数模板抽象描述语言a d l o f t 的 设计思想,确立了a d l o f t 语言设计的基本目标和基本原则;介绍了各个语言特性 的选择及设计思想。 2 1 设计目标 函数模板抽象描述语言设计的主要目的,是当程序员使用大量结构相似的函 数模板时,能够只用简单的语句来快速构造出这类函数模板,减少代码书写量, 提高程序编写效率。然后通过转换系统快速生成可执行的目标语言代码,在一定 程度上实现程序编码的自动化。通过使用这种语言来编写代码,可在一定程度上 提高代码的重用度,从而提高软件开发的效率。 2 2 设计原则 要使设计出来的语言能够达到预定的目标,在进行语言设计时必须遵循一定 的原则,用这些原则来指导整个函数模板抽象描述语言的设计,这包括各个语言 特性的选择与设计。 1 简单易用 设计出的语言只有简单,容易学习使用才能被用户所接受,因此简单易用是 指导该语言设计的基本原则之一。该语言的设计目的是提高代码重用度,减少代 码书写量,提高程序员的编码效率,减轻程序员的工作量。然而如果语言设计得 非常复杂,需要花费很多的时间和精力去学习,这就违背了减轻程序员的工作量 的初衷,就失去了设计该语言的意义。所以在进行该语言的设计时,不会引入很 多的语言特性,语言特性太多,就会增加学习使用的难度。对于一些有用但又比 较复杂,学习起来较困难的特性,会寻找其它较简单的特性去代替。 2 实用性强 设计该语言的目的是提高程序员编码效率,因此除了简单易用外,还必须是 实用性强的,能够对程序员的实际编码工作有帮助。对语言特性的选择,必须是 有助于提高编码的效率的。设计该抽象描述语言及其转换系统,使得程序员可以 6 利用该工具快速生成所需的蘧数模板,从藤节省开发时阆和成本,提高软件开发 的效率。因此,实用性也是该语言设计的基本原则。 3 容易实现 设计该语言的各个特性时,也要考虑到它必须容易实现。如果必须要透过复 杂算法才能芷确有效实现,就不满足简单的原则。因此,在设计语言的各个特性 时,也要考虑容易实现的原则。 4 重用支持 软件重用是软件工程中的重要问题。目前,人们非常关注软件重用问题,软 件重用作为软件工程的一个很有活力的子领域,已逐渐成为研究和开发的主流方 向之一。软件重用可以提高软件开发的效率、缩短软件开发餍期、提高软件的开 发质量。因此,重用的支持也是该语言的设计一个重要的原则。 2 3 词法规则设计思想 简单易用是进行a d l o f t 语言设计的基本原则,因此该语言的词法规则不应该 太复杂,词法规则太复杂,就会增加使用者学习的负担。所以,在进行该语言设 计时采用了大部分程序设计语言中用得最必广泛的词法规则,院如标识符必须是 由字母开头的,后面由若干个字母、数字或下划线组成。既不允许有连续两个下 划线出现,也不允许以下划线结束。这种词法规则在程序设计语言中非常常见, 因此用户学习起来菲常简单,实现起来也十分方便。 2 4 函数模板结构模型设计 设计凄的语言要能够篱单易用,那么用该语言写出的程序形式就要和大家都 比较熟悉的形式相似,这样人们就会产生一种天然的亲近感,学习起来就比较容 易,理解记忆起来也比较方便。 如果若干个函数模扳的形参在形式上具有相似性,只是丞数模板名称和返回 值类型有所不同,将它们的相似性加以概括,用一种通用的描述语畜描述出它们 的关系,我们就可以把它们归为同一个函数模板结构。 例如有如下这样一类函数模板: t e m p l a t e t lf 1 ( tx ,ty ) ) ; t e m p l a t e t 2f 2 ( tx ,ty ) 。 ; 7 它们是不同的函数模板,分别表示了函数模板f 1 和函数模板f 2 等等,但从结 构上看,它们又非常相似,如果不考虑函数模板的具体实现细节的不同,只考虑 它们的抽象结构,则它们的抽象结构可以如下表示: t e m p l a t e f f ( tx ,ty ) t lf 1 ,t 2 岔 ,t mf m ; ) 由上可见,虽然f 1 、f 2 这些函数模板描述是不同的事物,但它们之间又 有一定的联系,如果不考虑这些事物的具体细节,从更高的抽象层次上看,它们 的抽象结构是相同的。这种结构的抽象可以推广到多个参数的情况。 2 5 函数模板概念的抽象 c + + 中的模板包括类模板和函数模板两种。模板,又称参数化类型 ( p a r a m e t e r i z e dt y p e s ) 或类属( g e n e r i c s ) ,可为功能或结构相近的一族函数或 类提供一种抽象处理模式( p a t t e r n ) ,即适应广泛数据类型的可重用代码,在具 体使用时则由编译器针对不同数据类型具体实现。 使用函数模板可大大简化很多具有相似或相近功能的模块,从而可构成流程 清晰简练、可维护性更好的代码。函数模板提供了一种函数行为,该函数行为可 以用多种不同的类型进行调用,也就是说,函数模板代表了一个函数家族强”,。它 的表示看起来和普通的函数很相似,区别在于有些函数元素是未确定的,这些元 素将在使用时被参数化。从总体上来说,一个函数模板主要由函数模板参数列表, 函数模板返回值、函数模板名、函数模板调用参数列表、函数模板定义几部分构 成幢2 9 1 。 1 函数模板的模板参数列表 每一个函数模板都必须有一个模板参数列表,以区别于普通函数。函数模板 的模板参数列表位于函数模板的名称前面,在一对尖括号内部进行声明。不同的 语言的声明方式可能是不同的,但基本的声明方式如下:t e m p l a t e , 其中t 就是模板参数,它代表了某一种数据类型。模板参数列表中的参数可以是 类型参数t 或非类型参数n t ,但一个函数模板至少要带有一个类型参数口”。非类 型参数可以是任何有效的类型,而类型参数则是当编译器分析程序时,根据在函 数调用中所给定的实参类型来确定所代表的类型的,这个过程称为实例化n “。也 就是说,是在进行函数模板实例化时,用具体的类型来代替模板参数。在函数模 板内部不能指定缺省的模板实参。 我们也可以根据需要声明有多个类型参数的模板参数列表,如t e m p l a t e ,类型参数t l ,t 2 ,t 3 , t 4 可以代表不同的数据类型,但它们代表的数据类型也可以是相同的,参数问用 逗号分隔。对于具有多个类型参数的函数模板,编译器通过对实参的类型进行静 态类型分析来确定在函数模板中对应位置的类型参数所参数化的类型n ”。 2 函数模板的返回值 与普逶滋数类似,在定义函数模板时,每个蘧数模板都必须要有一个返隧值 类型,返回值类型可以是各种内罱类型( i n t ,d o u b l e 等) 、类类型,也可以是函数 模板参数类型t l 或t 2 等,它们分别代表不同参数类型或者是任何一种合理的具 体数据类型。 3 函数模板的名称 同函数定义相同,每一个函数模板都必须要由一个名称来标识,它是一个文 本串,组成方式由词法规则决定。除了重载函数模板外,各个函数模板的名称应 该是唯一的。函数模板名称的命名方式和添数命名相似,在不同的语言中的命名 规则可能有所不同,但基本上是相似的,因此,在a d l o f t 语言的设计中,函数模 板的名称是一个标识符,组成方式由该语言的词法规则决定。 4 函数模板的调用参数列表 函数模板除了模叛参数列表外,还有函数模板的调翔参数列表,位于函数模 板名称之后,在一对圆括号内部进行声明。这和普通函数的形式参数声明非常相 似,声明方式为( 参数类型参数名) ,参数类型可以是各种内置类型或类类型, 迫可以是函数模板参数类型。僵是,由于模扳参数所代表的类型的推导完全根据 实参的类型进行,所以,每个模板参数必须出现在函数说明的调用参数列表中, 否则将被视为错误。而参数名则是按照语言的词法规则命名的标识符。在a d l o f t 语畜中,蘧数模板调用参数的声明也是如此设计的,这样理解起来就很容易。 5 函数模板的定义 函数模板的定义和普通函数定义也非常相似。对于不同的面向对象程序设计 语畜,函数的定义部分也是有所不同的,但基本上都是由两个特殊的标识符号来 表明定义部分的开始和结束。不同的程序设计语言,不| 砑的函数的定义部分包含 的内容不同,但基本上都包含了变量的声明,操作的声盟,函数的调用等,但函 数的定义是不允许嵌套的,即不能在一个函数内部定义另外的一个函数。 函数定义的这些基本特征在处理上的不同,给a d l o f t 语言的函数模板定义部 分的抽象描述带来了很大的困难。如果在a d l o f t 语言中不支持函数模板的定义部 分的抽象描述,就满足了简单易用的原则,但用户只能用这个语言描述函数模板 的抽象框架,在需要描述函数模板的定义部分的时候,还要荐借助于相应的语言 编辑器,不同的工具之间进行频繁转换很不方便,不符合实用性的要求,因此在 a d l o f t 语言的设计中还是不能取消这部分的支持。 因此,借鉴了师兄朱泽彬的处理方法,选用一个运算符把以文本形式表示的 丞数模板的定义部分原封不动地加到溺数模板的定义中去。 9 2 6 函数模板形参相似性抽象 在程序设计语言中,函数模板的声明、定义有时有很大的相似性,其表现在 函数模板的形参形式非常相似,只是函数模板名称或返回值类型有所不同,在进 行程序设计时如果需要使用很多此类的函数模板,每一个函数模板都定义一次, 显然是既费时又繁琐的,而如果能够将它们的相似性加以概括,用一种通用的描 述语言描述出它们的关系,用户在使用时只需按照通用描述语言的规则来声明和 定义一次函数模板,再通过转换系统将其转换到相应的程序设计语言,就可达到 减轻使用者工作量的目的。 2 7 泛型设计的抽象 泛型程序设计思想最早来源于对软件重用的追求n ”。在2 0 世纪7 0 年代末, s t e p a n o v 提出了泛型程序设计思想,该思想来源于一个朴素的观察:算法相对于 数据类型的抽象性,即算法的实现与其操作的数据类型无关,只和数据类型所具 有的某些语义属性有关。所谓泛型程序设计,就是将这些程序段封装成一个模块, 然后将所要处理的数据类型作为该模块的一个参数进行传递,从而可以避免对不 同数据类型的操作重写一个不同的模块陆”。使用这种技术不仅可以大幅度地节约 代码、提高代码的可重用性,而且程序的可维护性也较好。 目前,有很多程序设计语言都反映出了泛性程序设计的思想,c + + 中的模板就 是泛性程序设计的机制之一。模板是对源代码进行重用,而不是通过继承和组合 重用对象代码,当用户使用模板时,参数由编译器来替换。通过使用模板可以使 程序具有更好的代码重用性。 函数模板就是对数据类型进行参数化,对不同的数据类型的操作只需编写一 次,而所要处理的数据类型在进行函数模板调用时作为实际参数来进行传递,这 正体现了泛型程序设计的思想。泛型程序设计n 7 。川的核心是对类型和操作的泛化, 因此,泛型设计的抽象描述的设计都是从这个核心出发的。a d l o f t 语言本身是对 函数模板相似性的抽象,因此也必然支持泛型程序设计。 2 8 复用支持的考虑 软件复用是解决软件危机、提高软件生产率和质量的现实可行的途径,受到 了广泛的重视。通过软件复用,在应用系统开发中可以充分地利用已有的开发成果, 消除了包括分析、设计、编码、测试等在内的许多重复劳动,从而提高了软件开发 的效率,同时,通过复用高质量的已有开发成果,避免了重新开发可能引入的错误, 从而提高了软件的质量。 1 0 2 8 。 代码的重用 软件复用是软件开发中避免重复劳动的解决方法。随着软件工程技术的不叛 发展,出现了多种软件重用技术。面向对蒙技术的趱现,把复用技术推向了另一 个离潮,面向对象技术串的抽象、封装、对象、类等的概念,类的继承、类库等 的机制为软件复用提供7 可能辟蚰。泛型程序设计技术的出现,是复用领域熬又一 座丰碑,比如程序设计语言e + 中的模叛技术;框架、组件泔喇,和母闻彳譬技术,等 也是复用技术领域中取得的骄入成果。 丞数模叛是e + 模板技术之一,其本震是对代鹳的重用,嚣代码重用是软件重 用中比较誊观和容易实现的部分。对我们设计的a d l o f t 语言来说,由于它是对函 数模板相似性的抽象描述语言,所以它使得代码重用得到了提高。 2 8 。2 季盘象结构的复用 a d l o f t 语言提供了一种抽象接述方式,使褥糕痔员畿够以较简单豹方式箍述 一类吴有稳似性的函数模板之闻的插象结构,从两提高程序员鲍工作效率。 1 抽象结构复用模型考虑 a d l o f t 语言实现了一般的代褥重用,那么蔽数模板结构是否可l :冀加以复用也 成为我们要考虑的问题。 考虑如下的函数模板的例子: t e m p l a t e ; t e m p l a t e t y p e n a m ep t 2f 2 ( tx ,ty ) ) ; 上述酶函数模板是互不相同的的蘧数摸板,分裂表示了涵数模板f 圭和蹑数模 板f 2 ,等等一类醋数模板,但从结构上看,它们叉菲常相似,如果不考虑这些函数 模板的具体实现细节的不同,只考虑它们的抽象结构,则它们的抽象结构可以如 下表示: f t m p l s f f ( tx ,ty ) t l 爨,黾f 2 ,t 氆f m ; ) 虽然f l 、f 2 等等的这些函数模板攒述是不同的事物,但它们之闻又有一定的 联系,翔采不考虑这些事物的吴体缨节,从更高酶抽象层次上看,它佛的抽象结 构是相同的。如果能对已有的函数模板抽象结构加以复用,就能够充分提嘉程序 开发的效率。 2 对复用模型的分析 在文献5 碡3 中,姊冤来泽彬提撼了一种类层次掬象结构复用模整酶影式攒述, 如果采用类似的复用模型描述,函数模板抽象结构的复用模型可如下描述: 设r 是一个已存在的抽象函数模板结构的名称,毛是f t 中涉及到的函数模板 抽象描述的名称,i = l ,2 ,n ,n 为r 中涉及到的函数模板个数;f t 是希望得到的 抽象函数模板结构名称,是t t 中涉及到的函数模板抽象描述的名称, j = l ,2 m ,m 为r 中涉及到的函数模板的个数,m = n 。则有 r = n ( f i f i ,i l l & ,与) i = n ,i 这两 个语法符号分别用来表示函数模板定义的开始和结束标志。出现在语法符号“f ” 和“,奉”之间的内容在映射成特定的目标语言程序时就作为函数模板的定义部分 出现在生成的目标语言文件中。如下面的这个语句: t e m p l a t e t if t n a m e ( t ) 函数模板定义的代码 ) 幸; 显式定义了函数模板的定义方式,映射成目标语言程序时,在“+ ”和“ 之间 的内容会作为函数模板的定义部分出现在生成的目标语言文件中。 在考虑函数模板定义的开始和结束标志时,我们可以使用简单和常用的符号, 比如大多数语言使用的“ 和“ ”来给出一个函数模板的定义。使用这样的符 号来定义函数模板,对用户来说非常熟悉,不需特别记忆,使用起来没有任何困 难
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 器械健身课程说课
- 更新理念2024西医临床试题及答案
- 深度把握文化产业管理证书考试的试题及答案技巧
- 母猪行为观察的新方法及其效果试题及答案
- 网络技术应用场景分析试题及答案
- 财务会计基本问题试题及答案
- 肥城会考试题及答案
- 高效制造母猪饲料策略试题及答案
- 高价值专利的挖掘与保护方法试题及答案
- 美术学院素描试题及答案
- 高二下学期《家校携手凝共识齐心协力创辉煌》家长会
- (二模)沧州市2025届高三总复习质量监测 生物试卷(含答案详解)
- 2025年四川蓬安相如旅游开发有限责任公司招聘笔试参考题库含答案解析
- 2025建筑材料供应商采购合同模板2
- 机械基础试题库及参考答案
- 2024-2025学年人教版数学八年级下册期中检测卷(含答案)
- 江苏省南京市联合体2023-2024学年七年级下学期期中英语试卷
- 固体物理(黄昆)第一章
- 认识餐饮环境(课堂PPT)
- 常用拉铆螺母规格表
- 橡胶坝毕业设计
评论
0/150
提交评论