本发明专利技术提供了一种把传统软件转化为富客户端软件的代码拆分方法,属于软件工程领域。该方法包括:首先对应用程序进行数据传输量的插装并进行测试,据此生成模块调用图,然后对该图求最小割集,将图拆分成两部分,并将两部分分别作为客户端代码和服务器端代码,从而保证了拆分后的应用的网络传输量最小。本发明专利技术可以使得传统应用向富客户端应用转型时,代码拆分后网络传输量最小,从而提高富客户端应用的性能。本发明专利技术同时还允许程序开发设计人员将一些函数直接放置在他们认为合适的一端,并且能保证拆分后代码产生最低的网络传输量,这使得本发明专利技术能够适应从传统应用转向富客户端应用的各种情况。
【技术实现步骤摘要】
本专利技术属于软件工程领域,具体是一种把传统应用软件转化为富客户端应用软件 时的代码拆分方法。
技术介绍
富客户端应用是客户端/服务器模式的网络应用的一种形式。它是指除用户交互 界面之外,将网络应用的一部分运算任务交由客户端完成,从而提高客户端的反应速度和 用户体验。它既包含基于桌面客户端富客户端应用,也包括使用浏览器作为客户端的富客 户端Web应用。绝大多数的基于桌面客户端的网络应用和大部分最新的Web应用都是富客 户端应用。基于桌面客户端的富客户端应用一股依赖于C,Java, C#等桌面开发技术,以及 网络传输层技术;富客户端Web应用主要依靠JavaScript技术,DOM技术和AJAX技术。在代码拆分方面,微软公司的研究人员在2008年曾经发表过一篇有关对web应用 进行代石马拆分的论文(Benjamin Livshits, and Emre Kiciman, Doloto :code splitting for network-boundweb 2. Oapplications, in Proceedings of SIGS0FT '08/FSE-16 Proceedings of the 16th ACMSIGSOFT International Symposium on Foundations of software engineering, pages 350-360,2008.)。该研究的主要内容是将富客户端web应 用的浏览器端代码拆分成若干部分,并根据用户的需要分批下载到浏览器端执行。该研究 与本专利技术不同该研究解决的问题是拆分富客户端web应用的浏览器端代码,而本专利技术是 将传统应用的全部代码拆分成富客户端代码和服务器端代码两部分。本专利技术要使用到最小割集算法,最小割集是图论中的一个概念,对于一个带权图 G (V, E,f),其中V为节点集,E为边集,f为边权函数,割集是边集E的一个子集E’,满足 G(V, E/E’,f)不连通。最小割集是一个图的所有割集中边权和最小的割集。特别的,(s, t)_最小割集,是指在图中的所有将s和t两个节点拆分到不同连通子图的割集中,边权和 最小的割集。求(s,t)_最小割集的经典算法为-karp算法(Jack Edmonds and Richard Μ. Karp(1972). “Theoretical improvements in algorithmic efficiency for network flow problems". Journal of the ACM 19(2) :248_264)。现有常见的代码拆分方法是由人工对代码进行分析拆分,这种方法的主要缺点是 没有对代码之间的依赖程度进行定量分析,因此没有办法保证拆分后较低的网络传输量, 使得拆分后程序的性能较差。
技术实现思路
本专利技术的目的是提供一种代码拆分方案,对于传统单机应用和传统Web应用,将 它们的代码进行拆分,得到客户端代码和服务器端代码两部分,保证拆分后客户端与服务 器端之间的网络数据传输量最低。本专利技术的主要思想是通过对传统应用程序进行插装和大量测试,定量的估计应用 中代码块之间的数据传输量,然后根据代码块之间的数据传输关系和数据传输量生成一个模块调用图,最后对这个图求最小割集,将图拆分成两部分,并将两部分分别作为客户端代 码和服务器端代码,从而保证了拆分后网络传输量最小。本专利技术包含三部分内容1、应用程序的数据传输量插装与测试;2、模块调用图的 生成;3、模块调用图的拆分。其总体流程图如图4和图5所示。下面分别讲述各个部分(1)应用程序的数据传输量插装与测试对应用程序进行函数级别的数据传输量插装,即在每个函数调用点加写两条 语 句,在执行到函数调用的时候分别输出函数实参的大小和函数返回值的大小。这种插装可 以通过使用现存的自动化插装工具(例如Java语言的ASM,C#语言的CCI等)找到插装位 置,然后插入数据传输量输出语句,也可以手工找到插装位置,然后插入数据传输量输出语 句。数据传输量输出语句即输出函数调用时实参和返回值大小的语句,其中函数实参 或返回值的大小按下面的方法判定1.若为整数,固定为所使用语言的整型数的字节数(例如Java语言为8字节);2.若为字符串或字符指针,则调用字符串长度函数(语言库函数提供,例如Java 为String, length())求出字符串长度,即为实参大小;3.若为结构体或类对象指针,则根据结构体和类的定义,对结构体或类的域变量 的大小求和。其中域变量若为整数,字符串则按照1,2中规则求出大小,若为结构体或类对 象指针,则按3中的规则递归求出它的大小。4.若为数组或向量,则根据调用数组或向量的长度函数(Java中List的长度为 List, length())求出数组的元素个数,然后乘以每个元素的大小,其中每个元素的大小根 据规则1-4求出。在对应用程序进行插装之后,即可使用测试数据进行测试,插装后的应用程序在 测试过程中将会输出一系列函数调用事件的序列,其中每个事件包含调用时传递实参的大 小的信息。(2)模块调用图的生成在步骤(1)获得函数调用事件的序列之后,接着从函数调用事件序列中生成模块 调用图。模块调用图是一个带权图。图中的节点是函数调用事件序列中涉及的函数,边是 函数之间的调用关系,边上的权是函数调用中的总数据传输量,即两个函数间所有次调用 的数据传输量(调用实参与返回值的大小之和)的总和。模块调用图生成的算法如下输入函数调用事件序列输出模块调用图1.获得函数调用事件序列中的下一个函数调用事件;2.如果事件中的主调函数对应的节点在模块调用图中,转4 ;3.添加主调函数对应的节点;4.如果事件中的被调函数对应的节点在模块调用图中,转6 ;5.添加被调函数对应的节点;6.如果模块调用图中,主调函数与被调函数对应的节点之间有边,转8 ;7.在主调函数与被调函数对应的节点之间添加一条无向边,权值为0 ;8.主调函数与被调函数对应的节点之间的边权值+ =函数调用事件中的实参大 小与返回值大小之和;9.如果未到函数调用序列结尾,转1 ;10.模块调用图中每一条无向边(u,v,w(U,ν))(其中w(U,ν)为边权值)变为两 条具有相同权值方向相反的有向边,S卩(U,V,W(U,V))和(v,u,w(u,v)); 11.算法结束(3)模块调用图的拆分首先,确定界面函数与存储函数。其中界面函数为和用户界面交互的函数(例如 Java中的JButton. setText ()等,PHP中的echo等);存储函数为和数据库或者文件交互 的函数。这两类函数集合均可以通过相应语言的库函数文档获得。然后,在模块调用图中,获取界面节点集合和存储节点集合,其中默认界面节点集 合为界面函数对应的节点的集合,默认存储节点集合为存储函数对应的节点的集合。程序 开发设计人员可以根据自己的需要将某些函数对应的节点添加到界面节点集合或存储节 点集合中ο接着,进行节点集合的融合,即将界面节点集合融合为界面节点、存储节点集合融 合为存储节点。在融合的过程中,去掉节点集合内部的所有点和边,并产生一个新的节点 new,对于任意一条节点集合中的点a到集合外的点b的边,本文档来自技高网...
【技术保护点】
一种把传统应用软件转型为富客户端软件的代码拆分方法,其特征是:拆分后生成的富客户端软件的网络数据传输量最小;该方法主要包含以下步骤:第一步、对应用程序进行数据传输量的插装并进行测试;第二步、根据测试结果生成模块调用图;第三步、对模块调用图求最小割集,将图拆分成两部分,并将两部分分别作为客户端代码和服务器端代码。
【技术特征摘要】
【专利技术属性】
技术研发人员:王啸吟,张路,梅宏,
申请(专利权)人:北京大学,
类型:发明
国别省市:11[中国|北京]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。