没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记127(2005)87-99www.elsevier.com/locate/entcs面向版本控制系统、错误报告和源代码元模型的集成朱利亚诺·安东尼1马西米利亚诺·迪·潘塔2哈拉尔·加尔3马丁·平茨格41, 2RCOST-软件技术研究中心意大利圣尼奥大学工程系Palazzoex Poste,Via Traiano 82100 Benevento3苏黎世大学信息学4维也纳技术大学信息系统研究所摘要版本控制系统存储库和错误跟踪系统是研究大型开源软件系统演变的宝贵信息来源。然而,被设想为特定目的,即,为了支持开发或触发维护活动,它们既不允许简单的信息浏览,也不支持软件演化的研究。例如,不提供诸如定位和浏览错误最多的方法之类的查询。本文解决了这些问题,并提出了一种方法和框架,以一致地合并从源代码,版本控制存储库和错误报告中提取的信息。我们的信息表示利用属性概念的FAMIX信息交换元模型,允许表示,浏览和查询,在不同层次的抽象,感兴趣的概念。这允许用户在版本控制系统修改报告、错误报告和源代码之间来回导航。本文介绍了分析框架和方法来填充它,工具开发和正在开发的,以及在分析几个版本的Mozilla的经验教训。关键词:源代码分析,发布历史,错误报告,面向对象元模型1571-0661 © 2005 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2004.08.03688G. 安东尼斯等人理论计算机科学电子笔记127(2005)871介绍在软件开发和维护活动中使用配置管理工具通常采用诸如并发版本控制系统(CVS)之类的版本控制系统,特别是对于大型项目。通常,版本控制系统由错误报告工具补充,这些工具构成了对纠正性维护的基本支持。这两个工具系列是研究软件演化的宝贵信息来源; CVS可以被利用来了解演化的大小、复杂性、更改量以及从源代码或更改日志中可以挖掘的任何信息另一方面,错误报告系统提供了关于可靠性的见解,以及关于组织如何管理缺陷的信息(例如,什么是平均缺陷修复率,统计缺陷严重程度)。有几个免费的或商业的工具,例如Bugzilla[24]或Rational ClearCase5,集成了CVS存储库和bug跟踪系统。然而,有趣的是还集成描述从源代码中提取的事实的元模型。这将允许维护人员和项目经理获得整体视图。例如,它将是可行的,以确定一个子集的组件(类,功能或方法以上的一个给定的大小),其中表现出更多的缺陷比其他人。 类似地,可以分析缺陷和某些语言结构之间的关系,例如,使用指针或继承与缺陷倾向。作者认为,通过采用元模型可以简化集成异构信息源的任务,该元模型允许容纳源代码抽象、源代码更改以及错误报告的详细信息已经提出了不同的模式和元模型来表示过程和面向对象(OO)软件;然而,所提出的模式要么是针对特定语言(如C,C++ [8],Smalltalk或Java)定制的,要么没有用源代码级别的细节进行注释,要么没有与其他相关信息源(如错误报告和CVS数据)集成。本文建议使用从混合源(即源代码、CVS和错误跟踪存储库)中提取的详细信息来丰富FAMIX信息交换Meta模型[21]1网址:http://alpha.rcost.unisannio.it/antoniol2网址:http://www.rcost.unisannio.it/mdipenta3网址:http://www.ifi.unizh.ch/swe/4网址:http://www.infosys.tuwien.ac.at/Cafe/5http://www.rat ion al. C omG. 安东尼斯等人理论计算机科学电子笔记127(2005)8789FAMIX提供了属性的概念,其自然地导致感兴趣的装饰实体(例如,类或方法)的各种细节。显然,实体装饰取决于特定的实体。有些修饰,如文件名和子系统名,对所有实体都是通用的。变更和缺陷是适用于类、方法和函数实体的修饰。最后,其他属性,如参数的数量,只属于模板,方法和函数。对变更、错误和源代码实体进行推理,将事实联系起来或者提取统计数据,我们必须在不同的概念之间建立一个可追溯性图。在这个目的,我们遵循的方法的灵感来自Unix工具的差异和补丁。变更通过文件名和行号识别,在此称为地点。这允许集成从源代码、错误报告和CVS更改日志中提取的信息。上述选择源于以下观察。修改报告(MR)-十个细节涉及文件和更改的代码行;一旦文件和更改的行被识别,更改的上下文(类和方法)可以通过解析从CVS存储库中提取的源代码来定位。反之亦然,给定上下文信息(文件、开始行和结束行),可以识别影响该代码区域的问题报告(PR)。为了验证可行性,发现特定的优势,问题和陷阱,该框架被应用于Mozilla的几个版本。Mozilla是一个拥有数百万个LOC的开源项目,通过CVS存储库和bug跟踪系统进行管理。源代码信息,CVS信息和错误信息被用来装饰我们的实例化元模型。特别是,从1.0到1.3.1的版本被用作案例研究。在撰写本文时,集成已经在文件级实现;更细粒度的集成,即在类,方法或行级仅部分支持。本文的其余部分组织如下。在回顾了相关工作之后,第三节提出了我们的方法和框架。第4节描述了Mozilla案例研究。第5节描述了我们开发的用于提取信息和填充存储库的工具;第6节报告并总结了在填充存储库的第一个版本时获得的经验。最后,第7节总结并概述了可预见的研究活动。2相关工作目前的工作源于Fisher等人的发布历史数据库[10]。作者建议将CVS修订数据与错误报告数据相6http://www.mozilla.org90G. 安东尼斯等人理论计算机科学电子笔记127(2005)87并添加一些缺失的信息,例如合并点。相同的作者还对相同的数据进行了专门针对轨道特征的分析[9]。最后,Gall等人[14]分析了CVS发布历史数据,以检测逻辑耦合。在[18]中,维护请求根据维护类别分类1219 [1],然后使用基于频率的方法在故障严重性量表上进行评级。Ball等人[5]提出了一种从版本控制系统中提取数据的可视化方法,而[15]中提出了发布历史的三维彩色可视化过去已经进行了一些其他相关的研究,目的是了解Mozilla开源项目的架构和演变。特别是,Godfrey等人集成了不同的逆向工程工具,并使用它们来提取MozillaMockus等人研究了两个大型开源项目的发展,即Apache和Mozilla[17]。Eick等人[7]对计算机日志进行了图形分析。3框架定位、浏览和集成异构信息的主要思想是依靠按站点定位:类、方法、函数以及缺陷和更改必须通过文件和行号定位。以下小节提供了已实现或正在开发的方法的详细信息,这些方法用于在代码区域(类、方法、函数)、PR和MR之间构建可跟踪性映射。在编写源代码时,PR和MR在不同的粒度级别上进行管理。已经实现文件级集成,仅支持从源代码实体到代码区域的类、方法或代码行级浏览。3.1Bugzilla和CVS仓库发布历史数据从版本控制系统(如CVS [12])和错误跟踪系统(如Bugzilla[24])中检索。特别是,我们从CVS获得MR,从Bugzilla获得PR。图1描述了我们的发布历史数据库的核心,其中链接了MR和PR。MR存储在RHDB的cvsitemlog实体中,PR存储在bugreport实体中。有关MR所属文件的信息存储在cvsitem中。MR和PR之间的链接存储到表cvsitemlogbugreport中。建立这种联系是生殖健康与发展数据库人口进程的一个重要问题关于CVS和Bugzilla,这需要单独完成。只要在MR中找到对PR的引用,就会存储链接MR中的PR值为G. 安东尼斯等人理论计算机科学电子笔记127(2005)8791*1**比格雷波特拟步甲cvsitemlogbugreportidcvsitemid修订日期拉德山. . .cvsitemlogidrcsfile工作文件. . .cvsitemidbug_severityshort_desc. . .11Fig. 1. RHDB的核心使用正则表达式搜索(例如,#128764)。由于这些数字是作为自由文本输入的,因此结果也包含正确和误报匹配。为了提高数据质量,所有匹配的数字都使用PR中可用的信息进行验证,如果此文件名与MR文件名相对应,则链接有效[9]。关于bug报告和CVS处理的更多细节可以在[9,10,14]中找到。总而言之,RHDB包含关于每个版本的每个文件的版本控制、变更和缺陷相关数据,这些数据必须与源模型数据集成,如下所述。3.2源代码建模所有的概念,在设计层面上,如通过UML图,功能调用和软件度量建模提取和表示。源代码元模型的灵感来自FAMIX [21]信息交换元模型7。FAMIX规定了CASE数据交换格式(CDIF)[6]作为信息交换的基础。其他标准和交换格式存在,例如XMI,基于XML的交换格式[20]或Rigi标准格式(RSF)[22]。RSF起源于Rigi程序可视化,逆向工程和程序理解环境,是一种基于三重的规范化语言,可以轻松定制并导入到不同的工具中。图2示出了类表示的RSF摘录。我们使用RSF来表示感兴趣的概念,如类、类属性和方法、类型或不同种类的软件度量等。7http://www.iam.unibe.ch/92G. 安东尼斯等人理论计算机科学电子笔记127(2005)87type nsAutoRefCnt“Class”contain./dist/include/xpcom/nsISupportsImpl.hnsAutoRefCnt行nsAutoRefCnt“88”type nsAutoRefCnt::mValue“Attribute”将nsToClass nsAutoRefCnt::mValue“nsAutoRefCnt”type nsrefcnt“DataType”hasType nsAutoRefCnt::mValue“nsrefcnt”访问控制器nsAutoRefCnt::mValue“PRIVATE”type nsAutoRefCnt::nsAutoRefCnt()“Method”is抽象nsAutoRefCnt::nsAutoRefCnt()“TRUE”表示nsToClass nsAutoRefCnt::nsAutoRefCnt()“nsAutoRefCnt”type nsAutoRefCnt“DataType”hasType nsAutoRefCnt::nsAutoRefCnt()“nsAutoRefCnt”访问控制器nsAutoRefCnt::nsAutoRefCnt()“PUBLIC”图二. 一个类RSF表示的摘录图3以高抽象级别显示了Mozilla浏览器执行的步骤和提取的信息。为了避免遗漏文件、错误的依赖关系和编译错误的问题,该方法是两阶段方法。首先,对源代码进行初步编译以生成目标可执行文件。然后解析源代码并提取信息。两阶段方法确保应用程序针对当前架构、操作系统以及一般硬件和软件环境的实例进行了适当的配置。显然,当PR引用依赖于配置的源代码时,需要确保PR和源代码事实之间的一致性。本文重点介绍与Linux操作系统和Intel架构的单一配置相关的源代码(以及PR)。图三. C++信息抽取G. 安东尼斯等人理论计算机科学电子笔记127(2005)8793为了重用已有的工具,提取的信息首先通过一种中间语言的扩展来表示,这种中间语言名为抽象对象语言(AOL)。AOL是一种通用的设计描述语言,它能够表达OO软件设计阶段的概念。它已经扩展到表示软件度量,结构,模板和其他事实,如方法或函数调用。关于AOL的更多细节可以在[2,3,4,11]中找到。图4详细描述了图3的框PrepProc + Compile所包含的步骤。第二个编译依赖于包装C和C++编译器的包装器。这是为了避免手工修改编译脚本和生成文件所需的易出错活动。预处理文件包含应用程序和系统信息。因此,可能需要进一步的步骤来去除不可用的信息,即,删除系统包含文件。见图4。 C++处理总之,RSF信息包括:• 逆向工程类模型,包括继承、关联和聚集关系;• 函数和方法级软件度量,例如传递参数的数量、最大嵌套级别或语句的数量• 模板和结构的详细信息;以及• 类、方法和函数的位置。3.3整合信息源对于源模型和发布历史数据的集成,必须确定两个信息空间共有的实体。如前所述,在本文的上下文中,我们将重点放在源文件作为公共实体上,94G. 安东尼斯等人理论计算机科学电子笔记127(2005)87原因文件是从版本控制和错误报告系统中检索的版本控制、变更和缺陷数据的主题。一个更细粒度的集成级别正在开发中,并正在进行工作。在我们的方法中,源模型信息可在符合FAMIX的RSF文件中获得发布历史信息存储在关系数据库中,可以使用SQL进行查询。链接两个信息源的键连接器是两个存储库中包含的文件的唯一名称。根据这些唯一文件名执行数据集成过程这个过程很简单,它包括两个步骤:1)查询RHDB并在RSF中输出结果;2)将结果与源模型RSF文件集成。在第一步中,我们查询RHDB数据库中与MR和PR数据相关的依赖性。查询的输入是感兴趣的源文件的唯一名称的列表。根据图1,我们查询cvsitem表以获得文件标识符,这些文件标识符本身用于查询与cvsitemlogbugreport和bugreport连接的cvsitemlog 关系 获取所选源文件之间的更改相关依赖关系对 于 MR 和 PR , 我 们 引 入 了 两 种 新 的 关 系 类 型 rhdbCoupled 和rhdbDependent。这两种关系类型的基本原则是,从更改的角度来看,如果两个源文件被相同的源代码修改所影响,则它们在逻辑上是耦合或依赖的[13]。因此,如果两个源文件已签入源存储库(即,CVS),它们是逻辑耦合的。此外,如果两个文件被同一个PR引用,那么从更改的角度来看,它们是相互依赖的。此外,我们计算了被检测的MR和PR的数量,以确定这些关系的权重。查询的结果以RSF元组的形式输出集成过程的第二步涉及将计算的RSF元组集成到源模型数据。这包括在源模型数据库中确定一个已删除的源文件,并为每个集成的rhdbCoupled和rhdbDependent关系计算新的边缘集成过程的结果包括用发布历史数据丰富的源模型存储库,其本身包括源文件实体之间的rhdbCoupled和rhdbDependent关系,以及每个关系的权重4案例研究为了评估集成源代码级别和质量相关信息的可行性,分析了开源Web浏览器Mozilla的几个版本。表1中报告了提取的关键特征。Mozilla是G. 安东尼斯等人理论计算机科学电子笔记127(2005)8795大多数是用C++开发的; C代码只占整体大小的一小部分。XML,HTML和脚本语言配置和支持程序也存在。最新的Mozilla版本包括超过10,000个源文件,大小高达3.7兆字节,位于2,500个子目录中。Mozilla基本上由90个模块组成,由50个不同的模块所有者维护。Bugzilla bug跟踪系统包含超过180,000个PR,CVS存储库包含大约430,000个MR。释放#C文件#h文件#C++语言文件大小类方法Func.继承-特斯相关,tions聚合物-tions1.019877,5193,9823.54,54550,9125,7375,0316,9933,4041.0.119957,6034,0223.54,56154,7425,7405,0517,0063,4401.0.219877,6354,0493.54,57251,1985,7405,0657,0293,4611.119977,6744,0543.64,59452,4535,7425,0957,0483,4661.2a19847,7694,0583.64,47551,1045,7414,9927,1073,5141.2b19917,9724,1223.74,51253,6975,7945,0297,1414,8041.219917,9814,1293.74,52651,6896,1925,0447,1554,8171.2.119917,9814,1293.74,52452,9535,7945,0447,1564,8171.3a18237,8804,1453.64,57451,8275,8095,0817,1576,0901.3b18307,9244,1643.64,58951,5805,8365,1017,3396,2001.318307,9114,1583.64,57753,1065,8365,0887,3236,1811.3.118307,9354,1983.74,57751,4535,8365,0887,3236,181表1 Mozilla主要特性5的工具若干工具被重新使用、修改或开发,以从不同来源提取和整合信息。5.1包装机C和C++编译器包装,模仿相同的编译器接口,已经用Perl开发gcc和g++specific选项以及链接器选项完全支持和管理。压缩预处理的源代码以减少磁盘空间使用。5.2C++信息抽取一个受岛屿驱动解析启发的工具[19]已经被重用和修改,以逆向工程类图并提取类级别和方法级别的度量。岛解析方法允许克服与解析C++代码相关的大多数困难(固有的语言困难,诸如解析Mozilla时遇到的GNU方言等)。工具96G. 安东尼斯等人理论计算机科学电子笔记127(2005)87是在以前的项目中开发的,以提取AOL。更多的细节可以在[2,3,4,11]中找到。5.3FAMIX导出和RSF集成导出器和集成工具包括两个Perl脚本,用于处理AOL文件并以RSF输出FAMIX数据,以及将两个RSF文件的数据集成为一个。AOL是C/C++解析器用来输出提取事实的格式。我们使用FAMIX模型的扩展点来指定额外的属性,这些属性包含为每个源模型实体提取的各种度量。此外,我们还在源文件之间添加了两个新的关系,以存储逻辑耦合rhdbCoupled和隐藏依赖rhdbDependend。导出器执行两个步骤,即:1)将AOL映射到RSF数据; 2)将RSF文件集成到一个源模型数据文件中。基本上,解析器生成单独的AOL文件,用于存储有关源文件、类、方法和函数的提取信息。在第一步中,这些文件中的每一个都被输入到导出器中,导出器打印出包含信息的普通RSF元组。执行初步检查,考虑存储在文件中的数据。例如,AOL类文件的类和继承关系被检查是否存在基类和子类。未通过检查的AOL记录不会打印。在第二步中,不同的RSF文件被集成到包含整个源模型的文件中。在此集成过程中,对关系实体和属性记录进行存在性检查,但在此步骤中,检查涉及整个数据源。有关源文件之间的逻辑耦合和隐藏依赖关系的数据因此,应用集成脚本将此关系和权重属性添加到现有的源模型数据。输出是一个RSF文件,其中包含FAMIX符合RSF元组的集成源模型数据,可以通过现有的可视化工具(如Rigi[23]或SHriMP [25])进行处理。6教训本节总结了在集成来自12个Mozilla版本的错误报告、CVS信息和数据时所获得的经验教训Mozilla是一个大型软件系统,包含各种编程语言,风格和习惯用法。如果一种语言包含一个特性,那么不管它对可理解性、可移植性、可维护性或可演化性的影响如何,都会有人使用它。例如,C++是一种强类型的OO语言。 但是,它保留了C兼容性,并将结构视为只包含公共G. 安东尼斯等人理论计算机科学电子笔记127(2005)8797美德.先知-愿这意味着可能存在从结构继承的类,例如,结构nsBandData和类nsBlockBandData。应该注意的是,这与用类包装结构不同,因为它破坏了信息隐藏和封装。nsBandData被声明为一个结构,似乎没有理由不将其声明为一个类,但允许从C访问事实上,C++编译器编译C代码,如果它不违反C++规则,例如,新标识符导致编译失败。然而,C和C++编译器有不同的约定,因此上述做法可能会使从C代码中打破C++封装的任务变得容易。以同样的方式,我们观察到包含方法声明的结构例如,nsID是一个内部声明了三个函数的结构,其中一个函数在Equals中声明和定义。同样,没有明显的原因,但允许从C代码更容易地访问模板构成了一种强大的机制,可以支持参数化代码开发。然而,作者认为,在某些情况下,它也可能被滥用。虽然模板应该用于创建新的抽象数据类型,但在Mozilla中发现了模板的奇怪用法。例如,我们发现了模板的示例,例如,nsCOMTypeInfo,用于参数化结构。这些后一种特殊的使用或滥用引发了关于元模型应该注释什么的讨论资料是有的,但不完全清楚某些事实是否以及如何必须加以说明。例如,结构nsBandData可以表示为类,然后标记为OO编码风格冲突,或者我们必须扩展FAMIX,以便类可以从结构继承另一方面,应该注意的是,编码风格违规通常不是源代码元模型的一部分。总而言之,它进一步导致需要修改初始集成模型,例如,以处理从结构或带方法的结构派生的类。7结论和进行中的工作一致地集成大型软件系统的不同存储库,例如开源软件Mozilla及其CVS和Bugzilla数据,是一项艰巨但富有成效的任务。它允许用户表示,浏览和查询-在不同的抽象级别-感兴趣的特定概念,从源代码级别到错误报告和修改级别。在本文中,我们提出了一个多层次概念导航框架的第一步,该框架表示符合FAMIX元模型的Rigi Standard For- mat(RSF)中的源实体我们将Mozilla浏览器作为案例研究,并提取其C++源代码98G. 安东尼斯等人理论计算机科学电子笔记127(2005)87超过12个版本的RSF代表。将此类数据与通过过滤相关错误报告和修改报告填充到发布历史数据库(RHDB)中的发布历史数据相结合。这个版本的数据集成企业使我们能够突出遇到的问题,困难和陷阱。Work–in–progress is devoted to manage the discovered information over-flow将问题跟踪到类和方法),并确保适当的查询和浏览能力。8致谢这项研究得到了欧洲科学基金会建立的RELEASE Excellence网络的部分支持。引用[1] “IEEE std 1219: Standard for Software maintenance,”[2] 安东尼,G.,B. Caprile,A. Potrich和P. Tonella,面向对象系统的设计代码可追溯性,软件工程年鉴9(2000),第10页。35比58[3] 安东尼,G.,G. 卡萨扎湾Di Penta和R.Fiutem,面向对象的设计模式恢复,系统与软件杂志59(2001),pp.181-196.[4] 安东尼,G.,R. Fiutem和L. Cristoforetti,使用度量来识别面向对象软件中的设计模式,在:第五届国际软件研讨会论文集- METRICS98,Bethesda MD,1998,pp.23比34[5] 鲍尔,J. M. Kim,A. Porter和H.如果你的版本控制能说话。. . 软件工程的过程建模和经验研究ICSE研讨会,波士顿,MA,美国,1997。[6] 委员会,C。T.,“CDIF Framework for Modelling and Extensibility,” Electronic IndustriesAssociation EIA/IS-107,[7] Eick,S. G.,M. C. Nelson和J. D. Schmidt,Graphical analysis of computer log files,Communications of the ACM37(1994). 50比56URLciteseer.ist.psu.edu/eick94graphical.html[8] 费伦茨河,S. E.西姆河C.霍尔特河,巴西-地Koschke和T. Gyimothy,Towards a standardschema for c/c++,in:Working Conference on Reverse Engineering,2001,pp. 49比58URLciteseer.nj.nec.com/ferenc01towards.html[9] Fischer,M.,M. Pinzger和H. Gall,Analyzing and Relating Bug Report Data for FeatureTracking,in:10th Working Conference on Reverse Engineering(WCRE),Victoria,Canada,2003,pp. 90比99[10] Fischer , M. , M. Pinzger 和 H. Gall , Populating a release history database fromversioncontrol and bug tracking systems,in:Proceedings of IEEE International Conferenceon SoftwareMaintenance,Amsterdam,The Netherlands,2003,pp. 23比32[11] 菲乌特姆河和G.1998年,在IEEE软件维护国际会议论文集上,Antonzio,识别面向对象软件中的设计-代码不一致性,Bethesda MD,1998年,pp.94比102G. 安东尼斯等人理论计算机科学电子笔记127(2005)8799[12] 自由软件 基金会,“版本 管理 与 CVS,”1.11.14 版(2003年),http://www.cvshome.org/docs/manual网站。[13] Gall,H.,K. Hajek和M. Jazayeri,基于产品发布历史的逻辑耦合检测,在:软件维护国际会议论文集(ICSM[14] Gall , H. , M. Jazayeri 和 J.Kraubrski , Cvs release history data for detecting logicalcoupling , in : Proceedings of the International Workshop on Principles of SoftwareEvolution,Helsinki,Finand,2003,pp.13比23[15] Gall,H.,M. Jazayeri和C.Riva,Visualizing software release histories:The use of colorand third dimension , in : Proceedings of IEEE International Conference on SoftwareMaintenance,Oxford,England,1999,pp.99比108[16] 戈弗雷,M。和E.Lee,Secrets from the Monster:Extracting Mozilla[17] Mockus,A.,R. 菲尔丁和J.Herbsleb,开源软件开发的两个案例研究,ACM软件工程和方法学学报11(2002),第11页。309-346[18] Mockus,A.和L.Votta,使用历史数据库确定软件更改的原因,在:IEEE软件维护国际会议论文集,加利福尼亚州圣何塞120-130[19] 穆宁湖,Generating robust parsers using island grammars,in:Working Conference onReverse Engineering,2001.[20] OMG,[21] 软件组合组,伯尔尼大学,http://www.iam.unibe.ch/~scg/Archive/famoos/FAMIX/“FAMIX 2.0规范”,2.0版(1999),www.example.com。[22] Tilley , S.R., K.Wong , M.-A.D.是 的 。A.Müller ,Programmablereserverseengineineering , International Journal of Software Engineering andKnowledge Engineering4(1994),pp.501- 520[23] Wong,K.,S. Tilley,H. A. Muller和M. D. Storey,Structural redocumentation:A casestudy,IEEE Software(1995),pp. 46比54[24] BugzillaBugTracking System,http://www.bugzilla.org.[25] Shrimp views:Simple hierarchical multi-perspective,http://shrimp.cs.uvic.ca/(2004).
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- GO婚礼设计创业计划:技术驱动的婚庆服务
- 微信行业发展现状及未来发展趋势分析
- 信息技术在教育中的融合与应用策略
- 微信小程序设计规范:友好、清晰的用户体验指南
- 联鼎医疗:三级甲等医院全面容灾备份方案设计
- 构建数据指标体系:电商、社区、金融APP案例分析
- 信息技术:六年级学生制作多媒体配乐古诗教程
- 六年级学生PowerPoint音乐动画实战:制作配乐古诗演示
- 信息技术教学设计:特点与策略
- Word中制作课程表:信息技术教学设计
- Word教学:制作课程表,掌握表格基础知识
- 信息技术教研活动年度总结与成果
- 香格里拉旅游网设计解读:机遇与挑战并存
- 助理电子商务师模拟试题:设计与技术详解
- 计算机网络技术专业教学资源库建设与深圳IT产业结合
- 微信小程序开发:网络与媒体API详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功