文/王芳
在計(jì)算機(jī)軟件開(kāi)發(fā)的過(guò)程中,我們經(jīng)常會(huì)使用到各類編程語(yǔ)言來(lái)進(jìn)行相關(guān)計(jì)算,來(lái)處理軟件開(kāi)發(fā)中遇到的各類問(wèn)題,同時(shí)也能夠構(gòu)建完整全面的軟件開(kāi)發(fā)環(huán)境。大部分計(jì)算機(jī)軟件開(kāi)發(fā)的過(guò)程都非常復(fù)雜,而為了降低編程的困難與繁瑣,在實(shí)際開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)選擇幾種語(yǔ)言混合編程的方式,突出各個(gè)編程語(yǔ)言的優(yōu)勢(shì),實(shí)現(xiàn)優(yōu)劣互補(bǔ),將一些復(fù)雜的編程問(wèn)題簡(jiǎn)單化。下面也針對(duì)Java和Matlab這兩種編程語(yǔ)言進(jìn)行分析,探討兩者的混合編程。
在混合編程過(guò)程中,最基本的思想就是如何實(shí)現(xiàn)不同程序設(shè)計(jì)語(yǔ)言的參數(shù)傳遞,能夠在不同系統(tǒng)設(shè)計(jì)語(yǔ)言之間進(jìn)行數(shù)據(jù)互通。混合編程的適用條件主要分為三個(gè)方面。
(1)不同程序設(shè)計(jì)語(yǔ)言之間應(yīng)該能夠較為便利的進(jìn)行數(shù)據(jù)互通。這個(gè)條件也是兩個(gè)語(yǔ)言進(jìn)行混合編程的重要條件,如果數(shù)據(jù)不能實(shí)現(xiàn)互通,那么就無(wú)法進(jìn)行混合編程。
(2)不同程序設(shè)計(jì)語(yǔ)言進(jìn)行相同計(jì)算的效率相差較大。這個(gè)條件是兩個(gè)語(yǔ)言進(jìn)行混合編程的價(jià)值體現(xiàn)。如果兩種程序設(shè)計(jì)語(yǔ)言在進(jìn)行相同計(jì)算的時(shí)候效率基本一致,那么說(shuō)明兩者之間非常相似,就很難實(shí)現(xiàn)優(yōu)勢(shì)互補(bǔ)。
(3)不同程序設(shè)計(jì)語(yǔ)言除去能夠?qū)崿F(xiàn)數(shù)據(jù)互通之外,其他部分都相對(duì)獨(dú)立。這個(gè)條件是整個(gè)混合編程得以完成的重要保證,能夠?qū)崿F(xiàn)兩種程序設(shè)計(jì)語(yǔ)言在混合編程的過(guò)程不會(huì)出現(xiàn)相互干擾。
Java是面向?qū)ο蟮囊环N編程語(yǔ)言,不但很好的繼承了C++語(yǔ)言的各類優(yōu)點(diǎn),同時(shí)還改善了C++語(yǔ)言中多繼承等很難被理解的內(nèi)容。從這個(gè)角度來(lái)看,Java編程語(yǔ)言就擁有功能全面和簡(jiǎn)單易用兩個(gè)方面的優(yōu)勢(shì),能夠以一種相對(duì)簡(jiǎn)單的方式來(lái)解決很多復(fù)雜的編程問(wèn)題。Java編程的工作原理主要分為四個(gè)部分。
這個(gè)環(huán)節(jié)主要是使用記事本、寫字板等文字編輯軟件,或者使用Eclipse等集成開(kāi)發(fā)環(huán)境來(lái)定義不同的類。
通過(guò)調(diào)用之前定義好的不同類,來(lái)訪問(wèn)資源系統(tǒng),并將源文件編譯成二進(jìn)制中間碼,最終形成class文件。
將之前編譯好的class文件在相應(yīng)的Java虛擬機(jī)中運(yùn)行,并產(chǎn)生各類字節(jié)碼。
在所有工作都進(jìn)行完成以后,形成最終的Java文件。
Matlab是美國(guó)MathWorks公司開(kāi)發(fā)的商業(yè)數(shù)字軟件,能夠進(jìn)行算法開(kāi)發(fā)、數(shù)值計(jì)算等各類工作,主要包括Matlab和Simulink兩個(gè)方面。Matlab是matrix和laboratory兩個(gè)詞語(yǔ)的組合,意喻矩陣實(shí)驗(yàn)室,Matlab編程語(yǔ)言具有多方面的優(yōu)勢(shì)。
(1)Matlab編程環(huán)境的多種工具都使用了圖形用戶界面,具有較強(qiáng)的人機(jī)交互性,并且操作也相對(duì)簡(jiǎn)單。
(2)Matlab編程雖然是一種比較高級(jí)的矩陣語(yǔ)言,但是在具體操作的時(shí)候非常簡(jiǎn)單。用戶只需要掌握C++語(yǔ)言的相關(guān)知識(shí),就能夠很快適應(yīng)Matlab編程系統(tǒng)。
(3)Matlab編程包含了非常多的計(jì)算算法,具有六百多個(gè)各類工程中都需要使用到的數(shù)字運(yùn)算函數(shù),能夠滿足用戶的不同需求。在計(jì)算要求相同的條件下,利用Matlab會(huì)有效降低工作量。
(4)Matlab編程體系具有可視化的圖形處理功能,同時(shí)也改善了編程過(guò)程中的GUI。不僅如此,Matlab還具有兼容性更強(qiáng)的程序接口,拓展了Matlab的應(yīng)用范疇和應(yīng)用價(jià)值。
Java是當(dāng)前我國(guó)非常熱門的一種面對(duì)對(duì)象的編程語(yǔ)言,因此Java編程也被廣泛用于各類程序軟件設(shè)計(jì)過(guò)程中。這種發(fā)展背景也使得Java編程在具體使用中遇到了較多復(fù)雜的編程問(wèn)題,比如多線程和網(wǎng)絡(luò)編程等。Java編程語(yǔ)言在數(shù)據(jù)分析與處理上的優(yōu)勢(shì)并不是非常顯著,特別是在數(shù)組矩陣等類型的數(shù)據(jù)處理中,Java編程語(yǔ)言的劣勢(shì)就會(huì)變得非常明顯,降低了整個(gè)編程的效率和最終效果。而Matlab在這方面跟Java有較大的差異,即擁有非常突出的數(shù)據(jù)處理優(yōu)勢(shì),能夠調(diào)動(dòng)數(shù)學(xué)、統(tǒng)計(jì)等多個(gè)領(lǐng)域的函數(shù),總函數(shù)數(shù)量已經(jīng)超過(guò)了六百條。在Java編程過(guò)程中比較復(fù)雜的編程問(wèn)題,如果能夠使用Matlab來(lái)操作,可能僅僅需要一條語(yǔ)句就可以很好的完成相應(yīng)的編程工作。但Matlab編程對(duì)于多線程和跨平臺(tái)實(shí)現(xiàn)方面有所不足,跟Java有較大的差距。從這些角度來(lái)看,Java和Matlab混合編程是非常有意義的。
如果技術(shù)人員能夠使用兩者進(jìn)行混合編程,那么就能夠很好的發(fā)揮兩者的優(yōu)勢(shì),彌補(bǔ)Java和Matlab在各自編程上的不足。將Java和Matlab進(jìn)行混合編程,能夠顯著提高數(shù)據(jù)計(jì)算的效率。這也是Java和Matlab混合編程的重要價(jià)值所在。
在Java和Matlab混合編程過(guò)程中,程序員需要解決的主要問(wèn)題就是如何實(shí)現(xiàn)數(shù)據(jù)在不同編程軟件和編程語(yǔ)言中的傳遞。Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,并且編程過(guò)程中使用的任何一個(gè)對(duì)象都是類模型實(shí)例化產(chǎn)生的。因此,在使用Java編程的時(shí)候,程序員必須要建立一個(gè)類,并能夠?qū)⑵滢D(zhuǎn)換為編程中所要使用的對(duì)象,接著將所有對(duì)象都儲(chǔ)存在一個(gè)文本文檔中。這個(gè)時(shí)候,程序員需要在Matlab編程體系中預(yù)先布設(shè)一個(gè)Java接口,將之前儲(chǔ)存好的對(duì)象引入到Matlab編程環(huán)境中,在Matlab編程環(huán)境中實(shí)現(xiàn)對(duì)數(shù)據(jù)的計(jì)算與更改,還要在所有計(jì)算工作完成以后重新將文件保存下來(lái),通過(guò)之前的Java接口來(lái)接收Matlab計(jì)算好的數(shù)據(jù)。

圖1:一個(gè)包含native函數(shù)的Java類例子
Java和Matlab混合編程的方向主要有兩種,即在Java中調(diào)用Matlab程序和在Matlab中調(diào)用Java程序。兩種方法都能夠?qū)崿F(xiàn)混合編程,但完成的主要工作有所不同。在Java中調(diào)用Matlab程序主要是使用了Matlab在數(shù)據(jù)處理上的強(qiáng)大能力,彌補(bǔ)Java編程在數(shù)據(jù)計(jì)算上的不足。而在Matlab中調(diào)用Java程序,則是利用Java在多線程和跨平臺(tái)實(shí)現(xiàn)等方面的優(yōu)勢(shì),提高最終的編程效果。
在Java中調(diào)用Matlab程序主要有兩個(gè)方法:第一就是將Matlab程序編譯M文件為Java包,最終在Java編程中實(shí)現(xiàn)后續(xù)編程工作。第二就是將Matlab程序編譯成C/C++動(dòng)態(tài)庫(kù),并通過(guò)JNI工具實(shí)現(xiàn)在Java程序中調(diào)用。
(1)將Matlab程序編譯M文件為Java包。這個(gè)混合編程的整體流程相對(duì)來(lái)說(shuō)比較容易,需要程序員先在Matlab中調(diào)出Deployment Project框,并將Java Package作為編譯類型。接著,程序員需要在接下來(lái)的頁(yè)面中添加相關(guān)的M文件,選擇運(yùn)行Build選項(xiàng)進(jìn)行后續(xù)的編譯工作。在所有編譯工作都完成以后,可以將Java包放置在distrib目錄下,并將類代碼文件等中間產(chǎn)物放置在src目錄下。在混合編程工作中,一般都僅會(huì)使用distrib中的文件,不會(huì)調(diào)用src中儲(chǔ)存的文件。
(2)將Matlab程序編譯成C/C++動(dòng)態(tài)庫(kù)。這個(gè)過(guò)程的具體步驟分為三個(gè)部分。第一,程序員在混合編程之前應(yīng)該先根據(jù)具體情況來(lái)選擇合適的C/C++編譯器,保證其能夠很好的用于Windows操作環(huán)境。第二,在選擇和安裝好編譯器以后,就可以將M文件編譯成C/C++動(dòng)態(tài)庫(kù)了。第三,在做完上述編譯工作以后,就可以在JNI中進(jìn)行后續(xù)的程序開(kāi)發(fā)工作。這里需要先在Java程序中調(diào)用多種native方法,并基于這種方式來(lái)實(shí)現(xiàn)對(duì)C/C++動(dòng)態(tài)庫(kù)的調(diào)用。圖1就是一個(gè)包含native函數(shù)的Java類例子。這個(gè)例子通過(guò)native函數(shù)來(lái)調(diào)動(dòng)了C/C++動(dòng)態(tài)庫(kù),給后續(xù)混合編程工作提供了基礎(chǔ)。
事實(shí)上,在Matlab5.3版本以后,Matlab的開(kāi)發(fā)商和設(shè)計(jì)者就在安裝程序中內(nèi)置了Java虛擬機(jī),相當(dāng)于在Matlab安裝過(guò)程中就附帶安裝了Java接頭,使得用戶可以使用Matlab中的相應(yīng)命令來(lái)調(diào)用Java程序,更好的實(shí)現(xiàn)兩者的混合編程。這也使得Matlab程序員能夠直接訪問(wèn)JavaAPI,很好的拓展了編程功能,有效減少了混合編程中可能出現(xiàn)的重復(fù)操作。不僅如此,這種內(nèi)置JVM的做法,能夠使得Matlab程序員更好的在編程過(guò)程中建立Java對(duì)象,實(shí)現(xiàn)兩種編程語(yǔ)言之間的數(shù)據(jù)互通。
就目前的應(yīng)用實(shí)例來(lái)看,Matlab程序員在編程中調(diào)用Java類的主要來(lái)源有三種。即Java類庫(kù)、第三方軟件提供的類、用戶基于自身需求建立的類。而Matlab在加載這些類的時(shí)候,一般都會(huì)先明確需要加載類的具體路徑,從而保證后續(xù)編程能夠順利進(jìn)行。在明確所要使用到的類的路徑以后,就可以通過(guò)import命令來(lái)將這些類引入到Matlab環(huán)境中,并在Matlab環(huán)境中進(jìn)行后續(xù)的計(jì)算。這些類在Matlab中的使用方法跟Java基本上非常類似,不存在不兼容等不良問(wèn)題。
程序員在使用Java和Matlab混合編程的時(shí)候,還需要注意多個(gè)方面的問(wèn)題,才能有效的促進(jìn)混合編程最終的效果。
(1)程序員應(yīng)該能夠很好的明確兩個(gè)程序設(shè)計(jì)語(yǔ)言的優(yōu)點(diǎn)和不足,并且在具體使用的時(shí)候能夠充分發(fā)揮兩者的優(yōu)點(diǎn),不能出現(xiàn)顯著的沖突。具體來(lái)說(shuō),就能夠能夠充分發(fā)揮Matlab編程在數(shù)值計(jì)算等方面的高效性,并結(jié)合Java編程的多線程等優(yōu)勢(shì),有效的提高編程效率。如果發(fā)現(xiàn)兩者出現(xiàn)沖突,一定要分析沖突的來(lái)源,并及時(shí)的解決。
(2)程序員應(yīng)該能夠靈活的利用混合編程的方法,并且能夠通過(guò)多個(gè)途徑來(lái)實(shí)現(xiàn)混合編程。這主要是因?yàn)榛贘ava和Matlab的混合編程在各行各業(yè)中都有非常顯著的應(yīng)用,因此在選擇混合編程方法的時(shí)候,應(yīng)該考慮到其后續(xù)應(yīng)用的領(lǐng)域來(lái)進(jìn)行合理選擇。就目前的具體情況來(lái)看,通過(guò)COM、Matlabcontrol、DLL、Linux、Hadoop等多種途徑都能夠?qū)崿F(xiàn)Java和Matlab的混合編程。這也說(shuō)明了這種混合編程的應(yīng)用領(lǐng)域非常廣泛,需要程序員能夠結(jié)合自身的經(jīng)驗(yàn)和相關(guān)標(biāo)準(zhǔn)要求來(lái)更好的進(jìn)行編程工作。
混合編程是當(dāng)前計(jì)算機(jī)領(lǐng)域中應(yīng)用比較普遍的技術(shù),在未來(lái)的發(fā)展中具有較為廣闊的潛力。在當(dāng)前的背景下,我們應(yīng)該重視Java和Matlab的混合編程方法,并探討兩者混合編程在多種平臺(tái)和環(huán)境中的實(shí)現(xiàn),提高混合編程在具體軟件設(shè)計(jì)中的應(yīng)用價(jià)值與效果。
參考文獻(xiàn)
[1]陳宏希,鄒益民.用Matlabcontrol實(shí)現(xiàn)Java與Matlab的混合編程[J].工業(yè)儀表與自動(dòng)化裝置,2012(03):27-30+97.
[2]王 薇,楊 麗 萍.Java和Matlab混合編程及其應(yīng)用[J].長(zhǎng)春大學(xué)學(xué)報(bào),2012(10):1186-1189.