CN101833455A - 把传统软件转化为富客户端软件的代码拆分方法 - Google Patents

把传统软件转化为富客户端软件的代码拆分方法 Download PDF

Info

Publication number
CN101833455A
CN101833455A CN201010170937A CN201010170937A CN101833455A CN 101833455 A CN101833455 A CN 101833455A CN 201010170937 A CN201010170937 A CN 201010170937A CN 201010170937 A CN201010170937 A CN 201010170937A CN 101833455 A CN101833455 A CN 101833455A
Authority
CN
China
Prior art keywords
node
function
limit
size
weights
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201010170937A
Other languages
English (en)
Other versions
CN101833455B (zh
Inventor
王啸吟
张路
梅宏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Original Assignee
Peking University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Peking University filed Critical Peking University
Priority to CN201010170937A priority Critical patent/CN101833455B/zh
Publication of CN101833455A publication Critical patent/CN101833455A/zh
Application granted granted Critical
Publication of CN101833455B publication Critical patent/CN101833455B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Transfer Between Computers (AREA)

Abstract

本发明提供了一种把传统软件转化为富客户端软件的代码拆分方法,属于软件工程领域。该方法包括:首先对应用程序进行数据传输量的插装并进行测试,据此生成模块调用图,然后对该图求最小割集,将图拆分成两部分,并将两部分分别作为客户端代码和服务器端代码,从而保证了拆分后的应用的网络传输量最小。本发明可以使得传统应用向富客户端应用转型时,代码拆分后网络传输量最小,从而提高富客户端应用的性能。本发明同时还允许程序开发设计人员将一些函数直接放置在他们认为合适的一端,并且能保证拆分后代码产生最低的网络传输量,这使得本发明能够适应从传统应用转向富客户端应用的各种情况。

Description

把传统软件转化为富客户端软件的代码拆分方法
技术领域
本发明属于软件工程领域,具体是一种把传统应用软件转化为富客户端应用软件时的代码拆分方法。
背景技术
富客户端应用是客户端/服务器模式的网络应用的一种形式。它是指除用户交互界面之外,将网络应用的一部分运算任务交由客户端完成,从而提高客户端的反应速度和用户体验。它既包含基于桌面客户端富客户端应用,也包括使用浏览器作为客户端的富客户端Web应用。绝大多数的基于桌面客户端的网络应用和大部分最新的Web应用都是富客户端应用。基于桌面客户端的富客户端应用一股依赖于C,Java,C#等桌面开发技术,以及网络传输层技术;富客户端Web应用主要依靠JavaScript技术,DOM技术和AJAX技术。
在代码拆分方面,微软公司的研究人员在2008年曾经发表过一篇有关对web应用进行代码拆分的论文(Benjamin Livshits,and Emre Kiciman,Doloto:code splitting for network-boundweb 2.0applications,in Proceedings of SIGSOFT‘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 M.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,v))(其中w(u,v)为边权值)变为两条具有相同权值方向相反的有向边,即(u,v,w(u,v))和(v,u,w(u,v));
11.算法结束
(3)模块调用图的拆分
首先,确定界面函数与存储函数。其中界面函数为和用户界面交互的函数(例如Java中的JButton.setText()等,PHP中的echo等);存储函数为和数据库或者文件交互的函数。这两类函数集合均可以通过相应语言的库函数文档获得。
然后,在模块调用图中,获取界面节点集合和存储节点集合,其中默认界面节点集合为界面函数对应的节点的集合,默认存储节点集合为存储函数对应的节点的集合。程序开发设计人员可以根据自己的需要将某些函数对应的节点添加到界面节点集合或存储节点集合中。
接着,进行节点集合的融合,即将界面节点集合融合为界面节点、存储节点集合融合为存储节点。在融合的过程中,去掉节点集合内部的所有点和边,并产生一个新的节点new,对于任意一条节点集合中的点a到集合外的点b的边,增加一条new到b的边,对于任意一条节点集合外的点a到集合中的点b的边,增加一条b到new的边,最后将多重边进行融合。融合算法如下:
输入:模块调用图,融合节点集合S
输出:模块调用图
1.模块调用图中产生一个新的节点new;
2.读入融合节点集合中的下一个节点a;
3.对于从a出发有边的每一个节点b,如果b属于S,转5;
4.添加一条边从new到b,权值为边(a,b)的权值;
5.对于到达a有边的每一个节点b,如果b属于S,转7;
6.添加一条边从b到new,权值为边(b,a)的权值;
7.从模块调用图中删掉S中的所有节点,以及它们关联的边;
8.对于模块调用图中的每一节点对(u,v),如果从u到v存在不止一条边,则删掉这些边,并增加一条边(u,v)权值为之前从u到v的所有边权值之和。
一个节点集合融合的例子如图1~图3。
最后,以存储节点为源,以界面节点为漏,执行最小割集算法,求出一个将存储节点s与界面节点t分开的(s,t)-最小割集。这个割集将模块调用图拆分成两部分,其中与界面节点连通的部分即为客户端代码,与存储节点连通的部分即为服务器端代码。
本发明的有益效果:利用量化的模块调用信息和模块调用图的最小割集拆分,本发明可以使得传统应用向富客户端应用转型时,代码拆分后网络传输量最小,从而提高富客户端应用的性能。本发明同时还允许程序开发设计人员将一些函数直接放置在他们认为合适的一端,并且能保证拆分后代码产生最低的网络传输量,这使得本发明能够适应从传统应用转向富客户端应用的各种情况。
附图说明
图1:模块调用示意图;
图2:融合节点后带多重边的模块调用图;
图3:融合多重边后得到的模块调用图;
图4:总体流程简图;
图5:总体流程详图;
图6:函数调用关系图;
图7:增加EditUI节点;
图8:增加showTextF节点;
图9:在EditUI和showTextF间添加边;
图10:给边添加的权值;
图11:处理fileManageF节点;
图12:增加EditUI和showTextF节点之间的权值;
图13:模块调用图;
图14:有向模块调用图;
图15:融合UI模块之后的模块调用图;
图16:执行分割后的模块调用图。
其中图1~图3为一个节点融合的例子,其中圆圈代表节点,边上的数字代表权值;图6~图16为实施例中使用的图形。
具体实施例
下面用一个例子来对本发明作进一步的说明,但本发明并不仅限于如下实施例。
一个单机版的记事本软件,这个软件的界面部分包含编辑界面EditUI,文件处理界面FileUI,字体选择界面FontUI。数据存储部分包含一个文件打开存储部件FileIO。中间运算部分包括拼写检查函数checkF,文件格式转换函数fileTransF,文件管理函数fileManageF,字体控制函数fontCtrF,文本展现函数showTextF,文本操作函数manageTextF,时间日期函数timeF。这些函数之间的调用关系如图6。
现在计划将这个记事本软件变成一个网络记事本软件,即用户在本地编辑文本,并将文本存储到远端的服务器上,这样用户就可以在不同的地点(例如家里和办公室)对文本进行编辑,而且不同的用户可以同时对同一文本进行阅读和编辑。下面使用本发明对这个软件进行拆分。
第一步,对软件进行数据传输量插装。例如下面的EditUI对showTextF的调用:
struct extendString{
char*str;
int font;
}//extendString表示一个带格式的字符串
EditUI(){
extendString*stringList;
int option;
... 
stringList=showTextF(option)
}
增加下面的插装语句(加粗):
EditUI(){
List<extendString>stringList;
int option;
...
int size=0;
size=size+sizeof(option);
stringList=showTextF(option)
for(int i=0;i<stringList.length();i++){
size=size+str_len(stringList[i].str)+sizeof(stringList[i].option;);}
print(“call from EditUI to showTextF,with size%d”,size);
}
然后使用测试用例对插装后的程序进行测试。可以得到一个调用事件序列,例如:
call from EditUI to showTextF,with size 3000
call from showTextF to fileManageF with size 2000
call from EditUI to showTextF,with size 1000
call from showTextF to fileManageF with size 500
...
第二步,从上面的调用序列中得到模块调用图,使用模块调用图生成算法。例如对于上面的调用事件序列,首先初始化模块调用图为空图,然后取第一个事件(算法第1步)“callfrom EditUI to showTextF,with size 3000”,判断(算法第2步):主调函数EditUI不在模块调用图中,则增加节点EditUI(算法第3步)如图7。
然后判断(算法第4步):被调函数showTextF不在模块调用图中,则增加节点showTextF(算法第5步)如图8。
然后判断(算法第6步):图中从EditUI到showTextF之间没有边,则增加边(算法第7步)如图9.
然后执行第8步,边权值增加调用事件的数据传输量3000,如图10。
第9步,判断:事件序列中还存在事件,转第1步,取下一个事件“call from showTextFto fileManageF with size 2000”,然后执行2-8步,得到如图11。
然后判断事件序列中还存在事件,转第1步,取下一个事件“call from EditUI toshowTextF,with size 1000”,然后执行2-8步,其中第8步在从EditUI到showTextF之间的边上增加1000权值,得到如图12。
然后依次继续取事件序列中的调用事件,不停执行2-8步,直到事件序列中的最后一个事件为止。此时可以得到模块调用图如图13。
最后执行算法第10步,得到一个有向的模块调用图14。
第三步,根据上面的这个模块调用图进行节点融合和拆分。首先将三个UI模块进行融合,得到如下的模块调用图15。
然后使用最小割集算法对这个调用图进行分割得到下面的分割后的模块调用图16。
则得到代码拆分的结果:
应当将UI(EditUI,FileUI,FontUI),checkF,showTextF,manageTextF四部分放在客户端,其余部分放在服务器端。
虽然通过实施例详细描述了本发明代码拆分方法,但是本领域的技术人员应当理解,本发明并不限于实施例中所公开的内容和范围,在不脱离本发明的实质和精神范围内,可以对本发明进行各种变换、修改和替换。

Claims (8)

1.一种把传统应用软件转型为富客户端软件的代码拆分方法,其特征是:拆分后生成的富客户端软件的网络数据传输量最小;该方法主要包含以下步骤:
第一步、对应用程序进行数据传输量的插装并进行测试;
第二步、根据测试结果生成模块调用图;
第三步、对模块调用图求最小割集,将图拆分成两部分,并将两部分分别作为客户端代码和服务器端代码。
2.如权利要求1所述的方法,其特征是:第一步中插装的方法为,在每个函数调用点加写两条语句,在执行到函数调用的时候分别输出函数实参的大小和函数返回值的大小。
3.如权利要求1所述的方法,其特征是:第二步中模块调用图是一个带权图,图中的节点是函数调用事件序列中涉及的函数,边是函数之间的调用关系,边上的权是函数调用中的总数据传输量。
4.如权利要求1或3所述的方法,其特征是:第二步中生成模块调用图的算法为:
1)获得函数调用事件序列中的下一个函数调用事件;
2)如果事件中的主调函数对应的节点在模块调用图中,转4);
3)添加主调函数对应的节点;
4)如果事件中的被调函数对应的节点在模块调用图中,转6);
5)添加被调函数对应的节点;
6)如果模块调用图中,主调函数与被调函数对应的节点之间有边,转8);
7)在主调函数与被调函数对应的节点之间添加一条无向边,权值为0;
8)把主调函数与被调函数对应的节点之间的边权值设置为主调函数与被调函数对应的节点之间的边权值加上函数调用事件中的实参大小与返回值大小之和;
9)如果未到函数调用序列结尾,转1);
10)模块调用图中每一条无向边变为两条具有相同权值方向相反的有向边。
5.如权利要求1所述的方法,其特征是,第三步的实现步骤为:
I)确定界面函数和存储函数;
II)在模块调用图中,获取界面节点集合和存储节点集合;
III)进行节点集合的融合,将界面节点集合融合为界面节点、存储节点集合融合为存储节点;
IV)以存储节点为源,以界面节点为漏,执行最小割集算法,求出一个将存储节点与界面节点分开的最小割集,这个割集将模块调用图拆分成两部分,其中与界面节点连通的部分即为客户端代码,与存储节点连通的部分即为服务器端代码。
6.如权利要求2所述的方法,其特征是,实参和返回值大小的计算方法为:
a)若为整数,固定为所使用语言的整型数的字节数;
b)若为字符串或字符指针,则调用字符串长度函数求出字符串长度,即为它的大小;
c)若为结构体或类对象指针,则根据结构体和类的定义,对结构体或类的域变量的大小求和。其中域变量若为整数,字符串则按照a),b)中规则求出大小,若为结构体或类对象指针,则按c)中的规则递归求出它的大小。
d)若为数组或向量,则根据调用数组或向量的长度函数求出数组的元素个数,然后乘以每个元素的大小,其中每个元素的大小根据规则a)-d)求出。
7.如权利要求5中所述的方法,其特征是,第I)步中确定界面函数和存储函数的方法是:根据相应语言的库函数文档判断,或者用户自行确定。
8.如权利要求5所述的方法,其特征是,第III)步中进行节点融合的算法为:
i)模块调用图中产生一个新的节点new;
ii)读入融合节点集合中的下一个节点a;
iii)对于从节点a出发有边的每一个节点b,如果节点b属于S,转v);
iv)添加一条边从节点new到节点b,权值为边(a,b)的权值;
v)对于到达节点a有边的每一个节点b,如果节点b属于S,转vii);
vi)添加一条边从节点b到节点new,权值为边(b,a)的权值;
vii)从模块调用图中删掉S中的所有节点,以及它们关联的边;
viii)对于模块调用图中的每一节点对(u,v),如果从u到v存在不止一条边,则删掉这些边,并增加一条边(u,v)权值为之前从u到v的所有边权值之和。
CN201010170937A 2010-05-13 2010-05-13 把传统软件转化为富客户端软件的代码拆分方法 Expired - Fee Related CN101833455B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201010170937A CN101833455B (zh) 2010-05-13 2010-05-13 把传统软件转化为富客户端软件的代码拆分方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201010170937A CN101833455B (zh) 2010-05-13 2010-05-13 把传统软件转化为富客户端软件的代码拆分方法

Publications (2)

Publication Number Publication Date
CN101833455A true CN101833455A (zh) 2010-09-15
CN101833455B CN101833455B (zh) 2012-10-10

Family

ID=42717536

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201010170937A Expired - Fee Related CN101833455B (zh) 2010-05-13 2010-05-13 把传统软件转化为富客户端软件的代码拆分方法

Country Status (1)

Country Link
CN (1) CN101833455B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104182235B (zh) * 2014-08-26 2017-04-12 北京航空航天大学 一种用于解决软件潜通路的软件体系结构系统及设计方法
CN107102861A (zh) * 2017-04-25 2017-08-29 中南大学 一种获取开源代码库中函数的向量的方法和系统
CN108415828A (zh) * 2018-01-23 2018-08-17 广州视源电子科技股份有限公司 程序测试方法、装置、可读存储介质和计算机设备
CN108885547A (zh) * 2016-04-28 2018-11-23 微软技术许可有限责任公司 基于有状态桌面应用的分布式应用

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101267441A (zh) * 2008-04-23 2008-09-17 北京航空航天大学 一种c/s和b/s混合架构模式实现方法和平台
US20090249310A1 (en) * 2008-03-28 2009-10-01 Microsoft Corporation Automatic code transformation with state transformer monads

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090249310A1 (en) * 2008-03-28 2009-10-01 Microsoft Corporation Automatic code transformation with state transformer monads
CN101267441A (zh) * 2008-04-23 2008-09-17 北京航空航天大学 一种c/s和b/s混合架构模式实现方法和平台

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104182235B (zh) * 2014-08-26 2017-04-12 北京航空航天大学 一种用于解决软件潜通路的软件体系结构系统及设计方法
CN108885547A (zh) * 2016-04-28 2018-11-23 微软技术许可有限责任公司 基于有状态桌面应用的分布式应用
CN107102861A (zh) * 2017-04-25 2017-08-29 中南大学 一种获取开源代码库中函数的向量的方法和系统
CN107102861B (zh) * 2017-04-25 2019-09-03 中南大学 一种获取开源代码库中函数的向量的方法和系统
CN108415828A (zh) * 2018-01-23 2018-08-17 广州视源电子科技股份有限公司 程序测试方法、装置、可读存储介质和计算机设备

Also Published As

Publication number Publication date
CN101833455B (zh) 2012-10-10

Similar Documents

Publication Publication Date Title
US11550640B2 (en) Analysis of application programming interface usage for improving a computer system
Deitrick et al. Mutually enhancing community detection and sentiment analysis on twitter networks
CN107943691A (zh) 一种自动产生智能合约的功能测试页面的方法及装置
CN107967539A (zh) 基于机器学习和区块链技术的预测以太坊上交易的燃料限制的方法
CN101833455B (zh) 把传统软件转化为富客户端软件的代码拆分方法
CN102708453A (zh) 提供终端故障解决方案的方法及装置
CN103116500A (zh) 一种结构体定义和结构输出的方法及装置
CN116192621A (zh) 基于Opentracing链路追踪业务调用链的方法
Bogner et al. Collecting service-based maintainability metrics from RESTful API descriptions: static analysis and threshold derivation
Mabroukeh et al. Using domain ontology for semantic web usage mining and next page prediction
Amparore A new GreatSPN GUI for GSPN editing and CSL TA model checking
Mišić et al. Estimation of effort and complexity: An object-oriented case study
CN110489628A (zh) 数据处理方法、装置及电子设备
CN103514194B (zh) 确定语料与实体的相关性的方法和装置及分类器训练方法
Hussein Context-aware recommendations on rails
CN112214494B (zh) 检索方法及装置
Seo et al. Implementation of cloud computing environment for discrete event system simulation using service oriented architecture
Ahmed et al. A novel natural language processing approach to automatically visualize entity-relationship model from initial software requirements
Li et al. An ontology-based approach for gui testing
CN111176624A (zh) 一种流式计算指标的生成方法及装置
CN116562050B (zh) 一种分布式仿真平台的可视化建模方法及分布式仿真平台
KR20120058417A (ko) 문서 유사도 산출의 맞춤화 및 최적화에 기초한 기계 학습 방법 및 시스템
CN111831533B (zh) 一种基于导航图的Web应用测试用例生成方法
KR101077233B1 (ko) 온톨로지 추론을 제공하는 소셜 네트워크 온톨로지 시스템
Panda et al. Analysis of Global Published Literature on Library and Information Science: an Empirical Study through Big Data Approach (1920-2020)

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20121010