混合编程时应注意的几个问题

混合编程时应注意的几个问题
混合编程时应注意的几个问题

收稿日期:2004202229;修返日期:2004204224基金项目:国家林业局“948”基金资助项目(2001213)

混合编程时应注意的几个问题

3

李海奎,郎璞玫

(中国林业科学研究院资源信息所,北京100091)

摘 要:混合编程可以充分利用各种程序设计语言的优势。结合数值分析与统计软件FORST AT 设计和开发中的实践,针对混合编程时必须解决而又容易被忽略的几个问题:软件产品的形式、避免内存泄漏和协调异常处理机制,分析它们产生的原因,并给出了相应的解决方法,对于混合编程有一定的借鉴作用和指导意义。关键词:混合编程;内存泄露;异常处理

中图法分类号:TP311152 文献标识码:A 文章编号:100123695(2005)0120167202

Several Problems in the Mixed 2Language Programming

LI Hai 2kui ,LANG Pu 2mei

(Research Institute o f Forest Resource &Information Techniques ,C AF ,Beijing 100091,China )

Abstract :M ixed 2language programming could take use of advantage of various kind of programming language.Based on ex periences of design and development in the process of F ORST AT:the numeric analysis and statistics s oftware ,several problems ,which must be to s olved and neglected easily in the mixed 2language programming ,including form of s oftware ,av oiding mem ory leak and reconciling ex 2ception handling ,have been put forward.The paper analyses the context of their occurrence and gives s olution alternatively ,which has instructional significance to mixed 2language programming.K ey w ords :M ixed 2Language Programming ;Mem ory Leak ;Exception Handling

混合编程是指使用两种或两种以上的程序设计语言来开发应用程序的过程。目前,计算机上流行的程序设计语言有多种,它们有各自的优势和不足,如:VB 简单易学,界面开发能力强但执行速度较慢;C ++可以操纵系统底层,运行速度快但编程麻烦;FORTRAN 擅长数值计算能力但编程可视化程度不强;

M AT LAB 矩阵计算能力强,但解释执行的特性使其不能脱离编

程环境独立执行。程序设计语言的特性决定了在大型系统的开发中,一种语言往往不能满足项目的要求,混合编程不仅可以发挥多种语言的优势,实现代码共享,缩短开发周期,而且有利于多人协作,共同完成同一项目。混合编程时应遵循的规则在相关的文献中[1~3]多有讨论,包括函数的调用约定、参数的传递机制、过程和函数的命名约定等,在这里不作介绍。结合我们在数值分析和统计软件FORST AT 设计和开发中的实践,着重讨论混合编程时必须解决而又往往容易被忽略的几个问题。

1 软件产品的形式

混合编程最终形成的应用程序是否以软件产品的形式存在、软件产品是否发布、是独立发布还是必须外挂相应的编程语言,是混合编程时应该首先考虑的问题。如果混合编程的目的只是解决工作中的某一具体问题,最终不形成软件产品,则可以充分利用各种编程语言的集成开发环境,而不必考虑相关组件安装,因为这些组件已存在于各自的开发环境中。如果是

以软件产品的形式存在,则必须考虑产品的发布形式:独立发布时,产品必须能够脱离混合编程时各种程序语言的开发环境而运行;外挂相应的编程语言时,除非要求用户必须安装相应程序语言,否则必须解决相应的版权问题,这是一个非常重要的问题。

在什么水平上的混合编程也是必须考虑的问题。如果在汇编层次上进行混合编程,即通过不同的编译器生成各自的目

标文件(.obj 文件),然后链接生成可执行文件,则必须解决不同编译器内部的函数名约定问题或函数的修饰名问题;如果使用组件和动态链接库等编程,则必须注意动态链接库的安装路径和组件的注册问题;如果不同的程序设计语言生成的可执行文件之间互相调用时,要解决好进程间的同步或异步问题[4,5]以及数据的动态交换问题[6]。

2 避免内存泄漏

2.1 产生内存泄漏的原因

动态链接库是实现混合编程的主要方法之一。在这里,我们称生成动态链接库的设计语言为服务语言,调用动态链接库的程序设计语言为宿主语言。混合编程时,除了要求这两种语言的函数调用约定、参数数据类型和传递方式完全兼容外,内存管理机制的协调一致是一个必须解决的问题,否则极易造成内存泄漏

图1 D LL 混合编程应用程序的执行方式

在图1中,当输入参数为数组时,实际传递到D LL 的是指

?

761?第1期 李海奎等:混合编程时应注意的几个问题 

针,输入数组内存的分配和释放在宿主语言中完成;当输出参数为数组时,如果数组的内存分配是在服务语言中动态完成的,而传回到宿主语言时的是指向数组第一个元素的指针,则存在内存泄漏的可能,因为若释放数组元素所占的内存,则宿主语言使用指针得不到正确的结果,而不释放内存,则下次调用此函数时,上次在服务语言中分配的内存不能被应用,这就造成了内存泄漏[7]。如VB,VC混合编程时,用VC编写矩阵相乘的函数,生成动态链接库,在VB中调用。

VC代码的矩阵相乘函数为:

long-declspec(dllexport)-stdcall VCdllFunctionA(double3lpM atrix1,long R ow1,long C ol1,double3lpM atrix2,long R ow2,long C ol2,long3lpOutM atrix) { long i,j,k;

if(C ol1!=R ow2)

return Error-C ode;

double3tt,ss;

tt=new double[R ow13C ol2]; //动态分配所需的内存

for(i=1;i<=R ow1;i++)

 for(j=1;j<=C ol2;j++)

 {ss=0;

for(k=1;k<=R ow2;k++)

 ss+=lpM atrix1[(k-1)3R ow1+i-1]3lpM atrix2

[(j-1)3R ow2+k-1];

 tt[(j-1)3R ow1+i-1]=ss;

}

3lpOutM atrix=(long)&tt[0]; 

//获得数组首个元素的地址

return Success-C ode;

 }

VB调用时首先要进行声明:

Option Base1

Private Declare Function VCdllFunctionA Lib”vcdll.dll”(IntputArray1As D ouble,ByVal row1As Long,ByVal col1As Long,InputArray2As D ouble, ByVal row2As Long,ByVal col2As Long,OutputArray As Long)As Long Private Declare Sub C opyM em ory Lib”kernel32”Alias”RtlM oveM e~m ory”(Destination As Any,S ource As Any,ByVal Length As Long)相应的调用过程为:

Success=VCdllFunctionA(M atrix1(1,1),R ow ofM atrix1,C olofM atrix1, M atrix2(1,1),R ow ofM atrix2,C olofM atrix2,lpOutM atrix)

I f Success=Success-code Then

C opyM em ory ByVal VarPtr(OutM atrix(1,1)),ByVal lpOutM atrix, R ow ofM atrix13C olofM atrix238

End I f

调用时,假设相应的输入变量已经赋值,输出变量已经定义。

2.2 解决方法

一般来讲,可以用三种方法来解决内存泄漏问题:一是在宿主语言中操纵服务语言,释放在服务语言中分配的内存;二是在宿主语言中分配服务语言所需要的内存,这种方法要求宿主语言能够动态地分配内存;三是宿主语言和服务语言遵循共同的规范,如C OM。在上面的例子中,只需把VC函数参数的最后一个改为指向D ouble型的指针,而实际的计算语句改为lpOutMatrix[(j-1)3R ow1+i-1]+=lpMatrix1[(k-1)3R ow1+ i-1]3lpMatrix2[(j-1)3R ow2+k-1];动态分配内存的语句tt =New D ouble[R ow13C ol2]和指针赋值3lpOutMa2trix=(long)&tt [0]均不需要;调用只需最后的一个参数改为需要返回数组的第一个元素即可(API函数C opyMem ory已不需要)。

在VB和M AT LAB混合编程时,也可使用同样的方法解决内存泄漏问题。

3 协调异常处理机制

运行时出现异常是任何程序都不可避免的。在使用动态链接库的方法进行混合编程时,由于宿主语言和服务语言异常处理机制不同,必须协调一致,才能及时地根据异常类型进行相应的处理,保持程序的健壮性。一般来讲,有两种不同的异常处理机制:一是通过函数的返回值来确定异常情况,如Win32API函数;二是通过填充全局的异常结构来确定异常的类型、来源和描述,如VB中的Err结构。

3.1 数值计算时运行异常

数值计算时的运行异常主要包括函数超出定义域、被零除、计算结果溢出(上溢和下溢)。

表1 不同程序设计语言的运行时异常返回信息异常类型V B(错误号,描述)V C++M AT LA B

函数超出定义域

5Invalid Procedure

Call or Argument

-1.#I ND

由于在复数范围进

行计算不会出现

a/b(a=b=0)6Overflow-1.#I ND NaN

a/0(a≠0)11Division by zero 1.#I NF(a>0)

-1.#I NF(a<0)

In f(a>0)

-In f(a<0)溢出6Overflow 1.#I NF,-1.#I NF In f,-In f

在表1中,由于M AT LAB计算的数域是复数,所以在实数域中可能出现的函数超出定义域的运行异常,在M AT LAB中不会出现,但由于其计算结果是由实数部和虚数部两部分组成,我们仍可以通过判断虚数部是否存在来确定计算在实数域中是否超出定义域。对于其他运行异常,M AT LAB的计算结果遵循IEEE的数值计算标准。函数超出定义域和a/b(a=b=0)其实都属于函数参数取值的错误,在VC++中,它们是一致的,但在VB中分属不同的异常类型;上溢和被0除的结果都是数值超出计算机中所能表示的最大数(指绝对值),VB和VC++的处理也不相同。实际上,数值计算发生运行异常时,VC++和M AT LAB均通过返回值来体现异常类型,计算还会继续;而VB 则立即停止,并没有返回值。

3.2 协调异常处理

所谓协调异常处理,就是混合编程时,在宿主语言中兼容服务语言的异常处理机制,把在服务语言中出现的运行异常,正确地传递给宿主语言,按宿主语言的异常处理机制确定相应的处理方法。设宿主语言是VB,服务语言是VC++,下面是一个实际的例子:

On Error G oT o hanErr″激活处理处理机制

ReturnVal=vcDllFunction(par1,par2)″调用VC函数

I f InS tr(CS tr(ReturnVal),”.#IND”)>0then

ErrDescription=”函数超出定义域”

ErrNumber=5

 G oT o hanErr

End I f

I f InS tr(CS tr(ReturnVal),”.#INF”)>0then

ErrDescription=”计算结果溢出”

ErrNumber=6(下转第181页)

?

8

6

1

?计算机应用研究2005年

3.1 冗余存储路径容错

冗余存储路径容错功能在共享磁盘访问函数库中实现,该库内的记录读写函数调用本地文件系统的原始I/O 接口函数访问共享磁盘。例如,在Windows 2000Server 上,读/写原始磁

盘(Raw Disk )的方法是ReadFile (PD ,…)或WriteFile (PD ,…)。由于PDT 表中包括了一个共享磁盘的所有存储路径信息,当访问一条存储路径失败时,查询对应的PDT 表项,找到一条冗余的可用路径,可以继续对同一共享磁盘进行访问,从而实现对上层应用程序的透明容错。

3.2 访问负载均衡

在S DT 表中,增加一个域V ol-use ,记录每一个共享磁盘上正在被访问的文件数。那么,每一个M DC 上所打开的文件数,记为H ost-use ,可表示为

host-use =∑n

i =1v ol-use[i ]

其中v ol-use[i ]是一个M DC 所管理的第i 个共享磁盘上正在被访问的文件数。

H ost-use 表示了一个M DC 的负载状况,客户端模块在发送

文件打开请求时,可以根据M DC 的集群信息(S DT 表中的M DC 列表),选择一个H ost-use 数最小的M DC 来服务该请求,从而实现M DC 访问负载均衡。

4 结论

基于S AN 的多平台数据共享具有很大的理论价值和广阔实用前景,在国外已成为研究热点[5,6],国内在这方面的研究成果还不多见。

以一个国际合作项目为背景,本文实现了一个S AN 环境

下的开放系统与大型机数据共享系统。该系统利用S AN 的直接网络存储访问特征,采用第三方数据传送方法,克服了传统客户/服务器数据共享模型的缺点,提高了系统的数据传送性能。通过动态建立共享磁盘映射关系,实现了第三方数据传送,也使系统具有良好的可扩展性。通过对共享磁盘映射关系作进一步扩展,实现了系统的冗余存储路径容错和访问负载平衡等功能。参考文献:

[1]T Clark.Designing S torage Area Netw orks [M].Boston :Addis on 2W es 2

ley ,1999.329.

[2]H Hulen ,O G raf ,K Fitzgerald ,et al .S torage Area Netw ork and the High

Performance S torage System[C].10th NAS A G oddard C on fe ~rence on M ass S torage Systems ,2002.

[3]Richard A Demmers.Distributed File for S AA [J ].I BM Systems Journal ,

1988,27(3):3482361.

[4]Jay Shah.VAX/VMS:C oncepts and Facilities [M].New Y ork :M cG raw

Hill ,1991.12220.

[5]I BM C orporation.I BM T otalS torage S AN File System Draft Protocol S peci 2

fication [E B/O L ].http ://w w w https://www.360docs.net/doc/419993536.html,/storage/europe/uk/s oft 2ware/virtualization/s fs/protocol.pd f ,2003204230.

[6]M Bancroft.Functionality and Performance Evaluation of File Systems for

S torage Area Netw orks (S AN )[C].Proceedings 17th IEEE Sym posium on M ass S torage Systems/8NAS A G oddard C on ference on M ass S torage Systems and T echnologies ,IEEE C om puter S ociety Press ,April 1999.1252126.

作者简介:

贾瑞勇(19762),男,博士生,主要研究方向为存储区域网络、分布式系统和软件工程;张延园(19542),教授,主要研究方向为存储区域网络、软件工程。

(上接第168页) G oT o hanErr

End I f

hanErr :

I f ErrDescription <>””Then

 Err.Description =ErrDescription Err.S ource =”vcDllFunction ” Err.Number =ErrNumber

End I f

Err.Raise Err.Number ,Err.S ource ,Err.Description

在这段代码中,有可能出现两类运行时异常,一类是由VB 程序本身所产生的,另一类是由V C ++编写的函数所产生的,通过判断ErrDescription 是否为空,我们可以确定运行异常的来源,然后把运行异常的信息向上传递,交给统一的异常处理函数,这样就可以统一不同程序设计语言的异常处理机制。

在VB 和M AT LAB 混合编程时,可能出现在实数之间的计算结果有复数的现象,如求实数矩阵的特征根和特征向量,这时可以通过判断虚数部分是否存在来确定运行时异常,通过扩展VB 的错误代码表来描述运行异常。

4 结束语

针对混合编程时容易被忽略的几个问题,本文分析了它们

产生的原因,并给出了相应的解决方法,在FORST AT 的设计和开发中得到了实际的应用,对于混合编程有一定的借鉴作用和指导意义。参考文献:

[1]周振红,颜国红,吴虹娟.F ortran 与Visual C ++混合编程研究[J ].

武汉大学学报(工学版),2001,34(2):84286.

[2]胡春生,秦石乔,王省书.C ++Builder 和F ortran P owerS tation 的一

种混合编程方法[J ].计算机应用研究,2001,18(7):1492150.

[3]朱国强,刘勇,洪嘉振.32位操作系统下的混合编程[J ].计算机

应用研究,2000,17(5):58261.

[4]张学胜.用VB 和F ortran 混合编程开发科学计算软件[J ].计算机

应用,2003,23(S1):12213.

[5]常斌,李宁,黑新宏.工程计算软件开发中F ortran 混合编程的关

键问题分析[J ].计算机应用,2003,23(S1):56258.

[6]夏舒杰,谭建荣,陈洪亮,等.基于文件操作的VC ++和F ortran 模

块交互通信方法[J ].计算机工程,2003,29(9):63265.

[7]付红勋.与VC ++混合编程时的几点VB 编程经验[J ].计算机应

用研究,2001,18(6):1402141.

作者简介:

李海奎(19652),男,副研究员,博士后,主要研究方向为数值计算、组件技术;郎璞玫(19702),女,副研究员,博士,主要研究方向为信息技术在森林经理中的应用。

?

181?第1期 贾瑞勇等:一个基于第三方数据传送的S AN 数据共享系统 

相关主题
相关文档
最新文档