没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记181(2007)19-33www.elsevier.com/locate/entcsJOLIE:一个Java解释语言解释引擎Fabrizio Montesi1,Claudio Guidi2,RobertoLucchi2 Gianluigi Zavattaro21Corso di Scienze dell'Informazione di Cesena,博洛尼亚大学,意大利2意大利博洛尼亚大学计算机科学系摘要面向服务的计算是一种基于服务的分布式应用编程的新范式。服务是简单的软件元素,通过展示它们的接口来提供它们的功能,并且可以通过利用简单的通信原语来调用在面向服务的计算中,为了提供更复杂的功能,用于组合服务的新兴机制协调器能够通过利用典型的工作流程模式(如并行组合、排序和选择)来调用和协调其他服务。编排语言的例子是XLANG [5]和WS-SQL [7]。在本文中,我们提出了JOLIE,一个解释器和引擎的编排程序。JOLIE的主要创新之处在于它提供了一个易于使用的开发环境(因为它支持一种对程序员更友好的类似C/Java的语法,而不是基于XML的语法),它是基于一个坚实的数学基础模型(在作者以前的作品[2,3,4])。关键词:SOA,协调,编排,Java,服务,引擎1引言面向服务的计算是一种基于服务的分布式应用编程的新范式。服务是简单的软件元素,通过展示它们的接口来提供它们的功能,并且可以通过利用简单的通信原语(所谓的单向和请求响应原语)来调用服务可以相互组合,以便通过利用编排来设计更复杂的服务。实际上,通过利用典型的工作流程模式(如并行组合、排序和选择),编配系统能够调用和此外,还可以实现由欧盟综合项目Sensoria部分资助的研究,合同n。016004。1电子邮件地址:famontesi@gmail.com2电子邮件:cguidi@cs.unibo.it,网址:lucchi@cs.unibo.it,zavattar@cs.unibo.it1571-0661 © 2007 Elsevier B.V. 在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2007.01.05120F. Montesi等人/理论计算机科学电子笔记181(2007)19通过遵循不同的方法,即编排,允许以俯视图的方式设计分布式系统[2,8]。处理面向服务的计算的最受信任的技术是Web Services,其目的是保证不同平台之间的互操作性,其规范是通过XML语言定义的。最重要的规范之一是WSDL [10],它定义了一种用于设计Web服务接口的语言接口允许通过操作访问服务功能。操作表示服务的基本交互模态,它可以是单向操作,其中调用消息被发送到服务,或者是请求-响应操作,其中调用消息被发送到服务,假设随后将从服务发送回响应消息。就编排而言,我们在这里引用WS-CDL [7],就编排而言,我们引用WS-CDL [9]。在我们以前的工作[2,3,4]中,我们已经分析了编排和编排作为分布式系统设计的协同方法,遵循形式化方法。我们的正式调查的目的是提供一个精确的形式化框架,我们可以开发面向服务的计算系统的设计工具,其中orchetration和编排语言发挥了重要作用。特别是,我们已经正式编排和编排语言的两个过程演算的手段,我们已经提出了一个正式的概念,它们之间的一致性的基础上互模拟。当这些作品出现时,配器代表了w.r.t.。编排是实现面向服务的应用程序的一个精细步骤非正式地说,如果一方面编排不产生可执行的系统,另一方面编排使得对应用中涉及的每个服务进行编程成为可能为了简洁起见,我们没有报告我们的编排语言的语法和语义的形式定义(为了更仔细地了解我们提醒以前的作品的语言)。我们只是简单地报告一个小例子,以给出我们所开发的那种微积分的解释。作为买方服务,通过在请求-响应操作中发送消息,向卖方服务请求特定种类商品的价格。然后,它通过在One-Way操作上发送消息来调用购买订单。我们可以按照如下方式对这样的服务对话框进行建模:买家::=[好:=苹果;价格@ S(好,价格);. ;apple@S(250),SB]B卖家::= [价格(好,欧元,好=苹果?欧元:= 100)|apple(n);.,买方是位于站点B的服务,其中good变量被初始化为苹果的价值 price@S(good,price)表示买方调用请求-位于站点S的服务处的响应操作价格发送可变货物并将响应存储到可变价格中。然后,买方执行一些内部计算(为了简洁起见,我们没有指定)。最后,它执行apple@S(250),这表示对位于S的服务的单向操作apple的调用,以便发起250个苹果的购买订单。;是一个顺序组合操作符,意味着所有语句必须在前一个语句完成后执行卖方是一个服务位于F. Montesi等人/理论计算机科学电子笔记181(2007)1921在S处,其接收关于请求-响应操作价格的价格请求;被请求价格的商品被存储到变量商品中。要发送回的响应来自变量eur,但在发送响应消息之前,卖方验证接收到的商品是否对应于苹果,在这种情况下,它将值100分配给变量eur。苹果的操作是并行的(利用操作符|)并等待苹果的购买订单。我们不具体说明卖方在收到采购订单后的行为术语SB和SS分别表示位点B和S站点状态是将站点变量与相应状态相关联的函数。在本文中,我们专注于编排,介绍JOLIE(Java编排语言解释器引擎),我们已经开发,以动画orchetration程序编写的语言的基础上正式的编排过程演算。JOLIE语言的语法类似于C/Java,以提供更友好的开发环境。实际上,典型的orchetration语言,如XLANG [5]和WS-XML [7],其基于XML的语法不太容易上面的卖家服务可以用JOLIE语言重写如下:3定义价格计算{如果(好==“苹果”){欧元= 100}}主{price< good>(call(priceCalc))||apple< n>;;.}其中,good、eur和n是变量,price是请求-响应操作,apple是单向操作。priceCalc是一个子例程(类似于C程序),可以通过使用语句调用(priceCalc)来调用。JOLIE的独特和原始特征在于,它将上面讨论的编排过程演算提供的坚实的数学基础与基于类似C/Java(而不是基于XML)语法的程序员友好的开发和执行环境相结合。这与大多数实际的Web服务编排语言形成了鲜明的对比,这些语言的正式操作语义已经被研究并(部分)在语法之后定义。这也与WS-EJB的发展趋势形成了鲜明对比,在定义了编排语言之后,目前正在开发一种扩展,包括利用和调用Java程序的可能性(参见例如BPELJ [6])。此外,JOLIE是我们在编配和编排语言研究中的基础步骤,因为它允许我们通过实验验证在过程演算的设计期间所采取的理论方法是否在编配程序实际运行和执行时实际上也是可行的例如,我们必须向JOLIE添加一些额外的结构,这些结构不包括在相应的过程演算中。特别是,JOLIE还实现了一个迭代语句while和一个定时语句sleep(msec),用于pro-对等待一定毫秒数的进程进行编程后者是[3]为了简洁起见,我们只给出整个代码的一部分。22F. Montesi等人/理论计算机科学电子笔记181(2007)19对于不愿意无限期地等待由于通信或服务故障而永远不会到达的服务响应的程序编排特别有用。还值得强调的是,JOLIE是通过大力利用封装原理和模块化方式开发的,这使得我们能够独立于协议和通信介质。也就是说,为了运行利用不同和异构通信介质(如SOAP、Internet套接字、共享文件等)的编排,扩展引擎是很简单的。本文的结构如下:在第2节中,我们介绍了JOLIE语言,而在第3节中,我们展示了解释器内部。在第4节中,我们使用JOLIE从[7]中提取了一个案例研究,在第5节中,我们报告了结论和未来的工作。2JOLIE语言概述JOLIE提供了一种类似C的语法来设计编排器服务。类似C语言的语法使得JOLIE语言对于熟悉它的程序员来说直观且易于学习。下面我们将介绍JOLIE语言的一些基础知识,除了表达式和条件语法与C语言类似。2.1身份证标识符(identifier,通常缩写为id)是存储在主机共享内存中的明确名称,用于标识位置、操作、变量或链接。标识符必须匹配以下正则表达式:[a-zA-Z]([0-9a-zA-Z])*一些JOLIE语句要求程序员提供一个标识符列表,该列表由逗号分隔的标识符组成(如“标识符1,标识符2,a,b,c”)。在下文中,我们使用名称id列表来引用标识符列表。2.2程序结构JOLIE程序结构由以下语法表示:程序::=位置{位置定义}操作{操作声明}变量{变量声明}链接{链接声明}定义main{进程}F. Montesi等人/理论计算机科学电子笔记181(2007)1923定义定义:=定义id{Process}其中我们用斜体表示非终结符,而Kleene星号表示零次或多次重复。为了清楚起见,下面分别解释非终结符位置-定义、操作-声明、变量-声明、链接-声明和过程2.2.1位置JOLIE通信是基于套接字的:一个协调器等待消息 网络端口(默认为25554)。为了与另一个协调器通信,知道它的主机名(或ip地址)和它正在监听的端口是很重要的:这些信息存储在一个位置。位置定义将标识符连接到主机名和端口。非终端如下:位置定义:=id=其中我们不定义主机名和端口非终结符,它们必须分别表示任何主机名和任何端口。在下文中,我们不定义自动解释非终结符,这些非终结符将使用斜体字符表示。下面我们给出一个程序片段,它显示了一个可能的位置声明:地点{localUri =“localhost:2555”,googleUri =“www.google.com:80”,ipUri =“192.168.0.1:2556”}2.2.2操作这些操作代表了JOLIE编配器与其他编配器进行交互的方式我们区分两种类型的操作:• 输入操作。• 输出操作。前者表示一个协调器用来与之通信的接入点,而后者用于调用另一个协调器的输入操作。我们区分两组输入操作:单向和请求-响应。单向操作只是等待消息,而请求-响应操作等待消息,执行代码块,然后向调用方发送响应消息。就输出操作而言,它们可以是通知或请求响应操作。前者用于调用另一个编排器的单向操作值得注意的是,在发送请求消息之后,请求-响应操作将被阻塞,直到它从被调用的服务接收到响应消息非终端如下:4默认端口可以通过命令行覆盖24F. Montesi等人/理论计算机科学电子笔记181(2007)19Operations-declaration:=单向:id列表|RequestResponse:id list| 通知:ID分配列表| SolicitResponse:id-assign listid-assign:= id =id根据定义,输入操作期望一个标识符列表,而输出操作期望一个id=id对列表(我们已经使用符号id-assign list来标识这样的列表)。就输出操作而言,我们区分了orchestrator中使用的操作名称和被调用操作的绑定操作名称。在idA=idB对中,idA表示内部操作名称,而idB表示要调用的外部操作的绑定名称。这种语言特性允许我们将编排器代码与外部操作名绑定解耦。在下面的程序片段中显示了操作声明的示例。操作{单程:ow1请求响应:rr1、rr2通知:n1 = serverOneWay1,n2 = serverOneWay2,n3 = serverOneWay3请求响应:sr1 = serverRequestResponse1}2.2.3变量JOLIE变量是无类型的。隐式支持的类型是整数和字符串。变量声明非终结符只需要一个标识符列表,表示共享内存变量。定义如下:变量声明:=id列表2.2.4链接链接用于内部并行进程同步。至于变量,links声明非终结符只需要一个标识符列表,其中id将表示用于同步目的的内部链接Links-declaration:=id list2.2.5定义定义允许定义一个过程,该过程可以通过调用语句被另一个过程调用。每个定义都将一个标识符连接到一个进程。从语法上讲,Process是由JOLIE语句组成的一段代码.非正式地,在定义中定义的进程可以被视为C函数的主体2.2.6主要主块允许定义在程序执行开始时运行的进程。非正式地说,它相当于C pro的主要功能F. Montesi等人/理论计算机科学电子笔记181(2007)1925克2.3报表本段简要介绍了JOLIE声明。2.3.1程序控制流程语句• call(id):调用并执行使用给定标识符定义的过程。• if(con diti on){. }elseif(con diti on){. }else{. }:condition语句• while(con diti on){. }:loopstatement2.3.2操作语句• id:等待在operations块中声明为id的OneWay操作的消息,并将其值存储在id list变量中• idid list>(Process):等待RequestResponse操作id的消息,将其值存储在第一个id列表变量中,执行代码块Process并发送包含第二个id列表变量值的响应消息• id@id:使用由第一个id表示的通知操作,向位于第二个id的编排器发送包含id list变量值的消息。第二个id可以是locations块中声明的location值得注意的是,这样的特征允许实现位置移动性。 事实上,有可能接收到一个位置,该位置可以被利用来执行通知或请求-响应。• id@idid list>:使用由第一个id表示的SolicitResponse操作,将包含第一个id列表变量值的消息发送到由第二个id(对于通知,可以是位置或变量)定位的编排器。一旦消息被发送,它就等待来自被调用的请求-响应的响应消息,并将其值存储在第二个id列表变量中。2.3.3同步语句• linkIn(id):linkIn和linkOut用于并行进程同步,必须始终一起考虑。特别地,linkIn等待由id标识的同一内部链路上的linkOut触发器。如果已经有一个或多个linkOut进程为同一个内部链接触发通过遵循非确定性策略将自己与其中之一• linkOut(id):触发由id标识的同一内部链路上的linkIn同步。如果已经有一个或多个linkIn进程在等待同一个内部链接,它会通过以下方式将自己与其中一个进程连接起来:26F. Montesi等人/理论计算机科学电子笔记181(2007)19不确定性政策。2.3.4控制台输入/输出语句• in(variable id):等待控制台用户输入并将其存储在给定变量中。• out(expression):在控制台上写入给定表达式的求值(注意,变量可以被视为表达式)。2.3.5别人• sleep(n):使当前进程休眠n毫秒,其中n是自然数。• nullProcess:no-op语句。52.4语句作曲家JOLIE提供了三种编写语句的方法:顺序、并行和非确定性选择.2.4.1序列序列是通过使用;;运算符组成的。设x1,x2,.,xn −1,xn是语句。然后,顺序组成x1;; x2;;. ;;xn−1;;xn执行x1并等待它终止,然后执行x2并等待它终止,并继续这种行为,直到它到达序列的末尾2.4.2平行并行进程是通过利用并行运算符组成的。操作符组合序列(注意,单个语句是一个元素的序列)。让s1,s2,.,sn−1,sn是序列。其次,平行结构s1s2... sn−1并行执行每个序列。当所有的序列都被终止时,并行合成被终止。2.4.3非确定性选择非确定性选择可以通过使用++运算符在不同的保护分支之间表示。分支保护只能是输入操作或linkIn语句,而分支可以是任何进程。让(g1,p1),(g2,p2),...,(gn−1,pn−1),(gn,pn)nullProcess语句通常在RequestResponse中被利用,因为在发送响应之前不需要执行任何操作。F. Montesi等人/理论计算机科学电子笔记181(2007)1927其中g是分支保护,p是被保护的进程。非确定性选择的语法如下:[g1] p1++[g2] p2++...++ [gn−1] pn−1++[gn] pn守卫的定义在方括号内。当一个非确定性的选择被编程时,它使解释器等待它的一个警卫的输入。一旦输入到来,相关的p进程被执行,其他分支被停用。2.4.4作曲家的优先权语句编写器的解释优先级是:;;++。在下面的例子中,A,B,C和D是语句,我们展示了优先级是如何工作的。[req1] A||B;;C ++ [req2< b>] D;;C;;B||D在此代码片段中,在由两个单向操作(req1 a>和req2 b>)保护的两个分支之间存在非确定性选择。通过考虑操作符优先级,相同的代码将被明确如下。[输入1](A||(B;; C))++[输入2]((D;;C;; B)||D)、2.5例如作为一个实际的例子,考虑一个场景,其中我们有一个协调器作为服务提供者。编排器声明了一个名为factorialRR的请求-响应操作,其目的是接收一个数字,并作为响应发送其阶乘。此外,协调器必须与日志服务器交互以便传达其活动以构建其使用的统计。下面的代码片段显示了一个可能的实现。为了简洁起见,仅示出了主要过程主要{而(1) {[ factorialRRn > result >(call(calcFactorial))]servedClients= servedClients+ 1++[linkIn(logLink)]notifyActivity@logServerUri servedClients >;; servedClients= 0}||而(1) {sleep(60000);;/* 60秒 */linkOut(logLink)}}主进程由两个并行进程组成。 前者定义在请求-响应(服务可在其上访问以返回阶乘计算)和在内部链接logLink上定义的linkIn进程之间的非确定性选择。 触发内部链接的linkOut进程logLink在第二个并行进程中定义,每60秒中断一次用于将所服务的客户端的数量发送到位于logServerUri的日志记录服务的服务。28F. Montesi等人/理论计算机科学电子笔记181(2007)19Fig. 1. JOLIE架构3JOLIE解释器结构这一节专门描述JOLIE的架构。3.1结构概览图1描述了JOLIE解释算法和解释器的组成部分。为了解释JOLIE是如何工作的,我们继续描述运行时环境的主要步骤,然后是它的主要组件:解析器,面向对象的解释树,然后是通信核心。算法1JOLIE解释器行为步骤1:初始化通信核心。步骤2:创建解析器的实例第三步:创建面向对象解释树(OOIT)。步骤4:调用OOIT根节点(对应于main节点)的run()方法现在我们将研究构成解释器的各个部分。3.2解析器和面向对象的解释树JOLIE是基于一个面向对象的基础设施,在解析要执行的编排过程中创建的,这是由一个递归的后代解析器实现的我们遵循的原则是创建尽可能小的对象,–abstracting这一目标是通过利用封装和组合机制来实现的为了理解这是如何实现的,我们首先介绍面向对象解释树中的主要组件:Process类和Basic过程和复合过程概念。前者是存在于实现,而后者是我们将用来区分Process对象的一般行为的概念F. Montesi等人/理论计算机科学电子笔记181(2007)1929图二.对象树表示a = 1;;out(a)3.2.1Process类Process是一个类,表示一段通用的JOLIE代码。 进程有一次运行()执行对象所表示的活动的方法。3.2.2基本过程基本流程是由JOLIE语言的单个语句组成的流程在这种情况下,run()方法执行这样的语句。3.2.3复合工艺复合流程是一个由其他流程对象组成的流程(通过并行、顺序或非确定性选择运行它们)。run()方法执行这种组合,并为此利用封闭Process对象的run()方法。例3.1为了说明如何使用这些概念,我们使用以下示例:a = 1;;out(a)解析器将创建三个Process对象(参见图2):• 一个SequentialProcess(作为Composite Process)对象,包含以下两个进程:· 一个AssignProcess(这是一个BasicProcess)对象,它将值1赋给a.· 一个OutProcess(一个BasicProcess)对象,在控制台上打印变量a的值。当运行时环境必须解释此代码块时,它将调用SequentialProcess对象的run()方法,该方法将依次调用AssignProcess及其包含的OutProcess对象的run()方法注意,SequentialProcess对象只知道它的子进程是Process实例;它只是调用它们的run()方法,而不知道它们的行为(例如,它们本身可以是复合过程对象)。30F. Montesi等人/理论计算机科学电子笔记181(2007)19图3.第三章。通信介质和数据协议由于整个OOIT都遵循这个进程封装原则,因此启动执行只需要调用根节点(包含主进程的对象)的run()3.3述通信核心通信核心提供了一个接口,用于支持服务之间的通信,使我们能够从以下方面进行抽象• 沟通媒介。• 通信数据协议。图3报告了通信介质和通信数据协议的一些示例。例如,支持通信的通信介质通信核心通过通信通道CommChannel对象支持这种抽象。运行时环境利用通信信道 来 发 送 和 接 收 数 据 。 一 旦 实 例 化 , CommChannel 对 象 就 能 够 发 送 和 接 收CommMessage(通信消息)对象,这些对象由以下内容组成:• 操作名称。• 值数组。其思想是,每个通信信道必须与通信介质和通信协议相关联,并且应该通过依赖于特定协议和介质的某些数据来识别。例如,考虑一个与SOAP数据协议和文件“host1@/home/services/op1.ss”通信介质相关联的通道,比如c。为了在该通道上发送消息M,进程必须在文件“host1@/home/services/op1.ss”上写入尽管这样的接口被设计为支持通信介质和数据协议上的这种灵活性,但是当前可用的JOLIE解释器版本仅支持套接字通信F. Montesi等人/理论计算机科学电子笔记181(2007)1931介质和内部默认数据协议。4采购订单案例研究在本节中,我们将介绍一个从WS-SQL规范中提取的采购订单案例研究。更确切地说,我们提出了在JOLIE中的翻译[7]中报道的一个这个例子的目的是说明JOLIE程序比用XML编写的WS-XML程序更具可读性和可管理性为了简洁起见,我们不报告XML代码;感兴趣的读者可以在[7]中找到它。该示例为处理采购订单的服务建模。服务在收到请求-响应操作sendPurchaseOrder上的消息后启动其活动。在发送响应消息之前,同时执行body子例程中定义的三个进程。一个亲-cess通过调用shipping服务操作requestShipping来选择发货人,另一个进程通过调用invoice服务opera来开始价格计算InitiatePriceCalculation , 第 三 个 流 程 通 过 调 用 生 产 调 度 服 务 的 操 作requestProductionScheduling启动生产调度。 值得注意的是,我们抽象了由名称shippingServiceUri、ServiceUri和productionServiceUri表示的服务位置。此外,我们重新标记了linkOut和linkIn语句用于同步并发亲,cesses。地点{shUri = shippingServiceUri,inUri =邮件服务Uri,舒里= production服务}操作{ OneWay:sendSchedule,sendInvoice通知:InPr= InitiatePriceCalculation,SnShPr =sendShippingPrice,rqPrSch =requestProductionScheduling,snShSch= sendShippingSchedule请求响应:sendPurchaseOrder征集响应:reqShp= requestShipping}变量{customerInfo、purchaseOrder、IVC、shippingInfo、scheduleInfo}联系我们按发票发货,按计划发货}define body {reqShp@shUri customerInfo > shippingInfo >;;linkOut(ship-to-invoice);; sendSchedule scheduleInfo >;;linkOut(ship-to-scheduling)||InPr@inUri customerInfo,purchaseOrder>;;linkIn(ship-to-invoice);;SnShPr@inUri shippingInfo>;;sendInvoiceIVC>32F. Montesi等人/理论计算机科学电子笔记181(2007)19||rqPrSch@schUri customerInfo,purchaseOrder >;;linkIn(ship-to-scheduling);; snShSch@schUri shippingInfo>}主{sendPurchaseOrder customerInfo,purchaseOrder > IVC >(call(body))}5结论JOLIE代表了[3,4]中提出的理论编排过程演算的严格实现随着创建一个协调系统的可能性(通过在同一台计算机或不同的机器上运行解释器的多个实例),解释器的内部结构特别适合未来的未来的工作将包括实施一种新的位置格式,其目的是利用通信核心的通信介质独立性。到目前为止,所有通信都使用网络套接字。未来的格式将允许在位置定义中指定通信介质,从而提供使用套接字、文件、内部管道等的可能性。目标是使操作块与WSDL定义交互。 为此,我们将利用面向对象的内部操作实现,与通信核心数据协议无关。通过这种方式,Orches- trator将能够使用其他协议,以便与外部应用程序交换数据。JOLIE也是将在[3]中开发编排过程演算的实现的起点,它将加入JOLIE以实现在以前的工作[1,3]中开发的理论框架的完整实现。引用[1] Busi , N. , R. 戈 列 里 角 圭 迪 河 Lucchi 和 G.Zavattaro, Choreography and Extrastration : A SynergicApproach for System Design , Proc.第 三 届面向服务的计算国 际 会 议 ( ICSOC'05 ) , LNCS 3826(2005),pp. 228-240[2] Busi,N.,R.戈列里角圭迪河Lucchi和G. Zavattaro,走向舞蹈的正式框架,在:Proc. 第三届分布式和移动协作国际研讨会(DMC 2005)。[3] Busi,N.,R.戈列里角圭迪河Lucchi和G. Zavattaro,Choreography and orchestration conformityfor system design , in : Proc. of 8th International Conference on Coordination Models andLanguages(COordination[4] 圭迪角和R.刘文,面向服务计算中的移动性机制,载于:第八届开放式基于对象的分布式系统形式化方法国际会议(FMOODS[5] IBM,http://www.gotdotnet.com/team/xmlwsspecs/xlang-c/default.htm。[6] IBM和IBM,http://www-128.ibm.com/developerworks/library/specification/ws-bpelj.[7] 绿洲,“网服务业务流程执行语言2.0版,工作草案,http://www.oasis-打开。Org/committeees/download.p p/10347/wsbpel-specifica-draft-120204. htm.F. Montesi等人/理论计算机科学电子笔记181(2007)1933[8] 佩尔茨角,Web Services orchestration and choreography,Web Services Journal(2003)。[9] W3C,http://www.w3.org/TR/2004/WD-ws-cdl-10-20041217.[10] W3C,http://www.w3.org/TR/wsdl
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功