本申請屬于計算機技術領域,具體地說,涉及對象傳遞方法和裝置。
背景技術:
在宿主程序與腳本程序交互,宿主程序傳遞對象給腳本程序,觸發(fā)腳本程序執(zhí)行的應用環(huán)境中,若宿主語言與腳本語言不同,對象如何表示成為宿主程序與腳本程序交互面臨的主要問題。
對象是指在面向對象的程序設計中,用來表示具體的事物、抽象的規(guī)則、計劃或時間等的編程內容。
現有技術的一種對象傳遞方法中,由宿主程序根據需要擴展一種或多種腳本語言類型,并用這些類型實例化出腳本語言的對象,傳遞給腳本程序。
但是,若宿主程序和腳本程序在不同線程中運行,按照現有技術的這種方式也即是對象的創(chuàng)建在宿主程序的宿主線程中進行,而對象的訪問是在腳本程序的腳本線程進行,但是由于某些腳本語言不支持多線程行為,要求針對同一上下文的操作都是在同一線程上進行,比如腳本語言Lua語言。因此采用現有的這種方式通用性較差,不能被所有的腳本語言所支持。
技術實現要素:
有鑒于此,本申請所要解決的技術問題是提供了一種對象傳遞方法和裝置,提高了對象傳遞方式的通用性。
為了解決上述技術問題,本申請公開了一種對象傳遞方法,包括:
宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述宿主程序獲取所述對象的構造函數以及原始數據;
將所述對象的構造函數以及所述原始數據傳遞至所述腳本程序,由所述腳本程序在所述腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
優(yōu)選地,所述將所述對象的構造函數以及原始數據傳遞至所述腳本程序包括:
根據所述腳本程序的腳本語言類型,將所述構造函數轉換為所述腳本語言類型的構造函數;
將轉換之后的構造函數以及所述原始數據傳遞至所述腳本程序。
優(yōu)選地,所述將所述對象的構造函數以及原始數據傳遞至所述腳本程序包括:
將所述對象的構造函數以及原始數據打包成閉包,傳遞至所述腳本程序。
優(yōu)選地,將所述對象的構造函數以及原始數據傳遞至所述腳本程序之前,所述方法還包括:
建立宿主程序與腳本程序之間的傳遞隊列;
所述將所述對象的構造函數以及原始數據傳遞至所述腳本程序包括:
將所述對象的構造函數以及原始數據通過所述傳遞隊列傳遞至所述腳本程序。
一種對象傳遞方法,包括:
在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述腳本程序獲取所述宿主程序傳遞的構造函數以及原始數據;
在腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
一種對象傳遞裝置,包括:
獲取模塊,用于在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,獲取所述對象的構造函數以及原始數據;其中,所述宿主線程與所述腳 本線程不同;
傳遞模塊,用于將所述對象的構造函數以及原始數據傳遞至所述腳本程序,由所述腳本程序在所述腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
優(yōu)選地,所述傳遞模塊包括:
轉換單元,用于根據所述腳本程序的腳本語言類型,將所述構造函數轉換為所述腳本語言類型的構造函數;
傳遞單元,用于將轉換之后的構造函數以及所述原始數據傳遞至所述腳本程序。
優(yōu)選地,所述傳遞模塊具體用于將所述對象的構造函數以及原始數據打包成閉包,傳遞至所述腳本程序。
優(yōu)選地,還包括:
建立模塊,用于建立宿主程序與腳本程序之間的傳遞隊列;
所述傳遞模塊具體用于將所述對象的構造函數以及原始數據通過所述傳遞隊列傳遞至所述腳本程序。
一種對象傳遞裝置,包括:
接收模塊,用于在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述腳本程序獲取所述宿主程序傳遞的構造函數以及原始數據;
創(chuàng)建模塊,用于在腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
與現有技術相比,本申請可以獲得包括以下技術效果:
宿主程序將對象的構造函數以及原始數據傳遞至腳本程序,由腳本程序在腳本線程中創(chuàng)建對象,使得對象的創(chuàng)建和訪問均在同一個線程,可以適用于不同的腳本語言,保證了對象傳遞方式的通用性。
當然,實施本申請的任一產品必不一定需要同時達到以上所述的所有技術效果。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:
圖1是本申請實施例的一種對象傳遞方法一個實施例的流程圖;
圖2是本申請實施例的一種對象傳遞方法另一個實施例的流程圖;
圖3是本申請實施例的一種對象傳遞方法又一個實施例的流程圖;
圖4是本申請實施例的一種對象傳遞裝置一個實施例的結構示意圖;
圖5是本申請實施例的一種對象傳遞裝置另一個實施例的結構示意圖;
圖6是本申請實施例的一種對象傳遞裝置又一個實施例的結構示意圖;
圖7是本申請實施例的一種對象傳遞裝置又一個實施例的結構示意圖。
具體實施方式
以下將配合附圖及實施例來詳細說明本申請的實施方式,藉此對本申請如何應用技術手段來解決技術問題并達成技術功效的實現過程能充分理解并據以實施。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出接口、網絡接口和內存。
內存可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內存是計算機可讀介質的示例。
計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現信息存儲。信息可以是計算機可讀指令、數據結構、程序的模塊或其他數據。計算機的存儲介質的例子包括,但不限于相變內存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內存技術、只讀光盤只讀存儲 器(CD-ROM)、數字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質,可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括非暫存電腦可讀媒體(transitory media),如調制的數據信號和載波。
圖1為本申請實施例提供的一種對象傳遞方法一個實施例的流程圖,該方法可以包括以下幾個步驟:
101:宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述宿主程序獲取所述對象的構造函數以及原始數據。
102:將所述對象的構造函數以及原始數據傳遞至所述腳本程序,由所述腳本程序在所述腳本線程上調用所述構造函數,根據所述原始數據生成所述對象。
腳本程序簡稱腳本(Script),是一種程序代碼,它是由某個系統(如操作系統)或服務器(如Web Server)或應用程序(如AutoCAD,MSOffice等)環(huán)境,即宿主程序提供的能自動化操作該環(huán)境的功能的指令執(zhí)行序列。
而為了合法地編寫出腳本程序所制定的形式語法和語義的規(guī)范,原則,定義等等,形成了腳本語言(Scripting Language)。
腳本程序賴以生存的軟件環(huán)境被稱作是宿主程序(host),宿主程序可以是操作系統,服務器程序,應用程序,而開發(fā)這些宿主程序的程序語言(如開發(fā)操作系統一般使用c語言,開發(fā)Web Server一般使用c語言或Java語言,開發(fā)應用程序一般使用C++/Java/c#語言)被稱作宿主語言(Host Language)。
由于宿主語言比較復雜,為了能夠滿足不同用戶的需求,推出了比較簡潔、方便的腳本語言供用戶使用。
而在嵌入執(zhí)行腳本語言的宿主語言的產品中,通常就會涉及到宿主程序和腳本程序的交互,在交互過程中,宿主程序要單向傳遞對象給腳本程序,觸發(fā)腳本程序執(zhí)行。
本申請實施例中,宿主程序與腳本程序交互時,宿主程序將獲取的對象的構造函數以及原始數據傳遞至腳本程序,由腳本程序調用構造函數,根據原始數據創(chuàng)建所述對象,從而實現了對象的傳遞。使得對象的創(chuàng)建和訪問均由腳本程序執(zhí)行,即便宿主程序與腳本程序在不同線程中,也保證了對象的創(chuàng)建和訪問在同一個線程,因此可以適用于不同的腳本語言,能夠被不同的腳本語言支持,保證了對象傳遞方式的通用性。
其中,本申請實施例中,原始數據是指構造對象的數據,構造函數用于被調用時,根據所述原始數據創(chuàng)建腳本語言的對象。
原始數據和構造函數均為用戶提供的。
而由于腳本語言存在多種類型,比如javascript、Lua、VBscript等,為了能夠創(chuàng)造出所述腳本程序的腳本語言類型的對象,一種可能的實現方式,需要由用戶提供創(chuàng)建對應腳本程序的腳本語言類型的構造函數。
為了降低復雜度,作為又一個實施例,用戶提供的構造函數可以是某一種特定腳本語言類型的構造函數,或者是采用預設的抽象描述方式描述的構造函數。
宿主程序獲取得到用戶提供的所述對象的原始數據以及構造函數之后,根據其交互的腳本程序的腳本語言類型,將構造函數進行轉換,使得所述腳本程序可以調用。
如圖2所述,為本申請實施例提供的對象傳遞方法另一個實施例的流程圖,該方法可以包括以下幾個步驟:
201:宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述宿主程序獲取所述對象的構造函數以及原始數據。
202:根據所述腳本程序的腳本語言類型,將所述構造函數轉換為所述腳本語言類型的構造函數。
203:將轉換之后的構造函數以及所述原始數據傳遞至所述腳本程序,由所述腳本程序在所述腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
其中,所述宿主線程與所述腳本線程可以相同,也可以不同。
在用戶提供的構造函數由預設的抽象描述方式描述的時,將所述構造函數轉換為所述腳本語言類型的構造函數,可以根據預設的抽象描述方式與不同腳本語言類型的腳本語言描述方式的對應關系,將構造函數進行轉換,轉換為所述腳本程序的腳本語言類型的構造函數。
下面舉例說明一種可能的預設的抽象描述方式:
NewObject()創(chuàng)建一個空的對象并返回
SetIntegerField(o,name,i)設置指定對象o的name域為整數i
SetFloatField(o,name,f)設置指定對象o的name域為浮點數f
SetStringField(o,name,s)設置對象o的name域為字符串s
SetObjectField(o,name,o1)設置對象o的name域為對象o1
Finish()完成對象的創(chuàng)建。
由于腳本語言的有多種類型,實現上述抽象描述方式中不同功能的腳本語言在此不再贅述。
在用戶提供的構造函數即為采用一種特定腳本語言描述的時,若構造函數對應腳本語言類型與所述腳本程序的腳本語言類型不同,可以根據預先設置的不同類型的腳本語言的對應關系,將構造函數進行轉換。
本申請實施例,通過將構造函數進行轉換,使得無需用戶提供不同腳本語言類型的構造函數,只需提供采用通過的預設描述方式,即可以自動轉換為不同腳本語言類型的構造函數,減少了復雜度。
其中,宿主程序與腳本程序之間可以創(chuàng)建生產者-消費者隊列,即傳遞隊列,從而宿主程序可以通過傳遞隊列將構造函數以及原始數據傳遞至腳本程序。傳遞隊列采用先進先出方式。
其中,為了將對象的構造過程在腳本線程中執(zhí)行,構造函數和原始數據可以打包成一個閉包,具體是將閉包傳遞至腳本程序,可以通過傳遞隊列將 閉包傳遞至腳本程序。
圖3為本申請實施例提供的一種對象傳遞方法又一個實施例的流程圖,該方法可以包括以下幾個步驟:
301:在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述腳本程序獲取所述宿主程序傳遞的構造函數以及原始數據;
302:在腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
其中,所述宿主線程和所述腳本線程可以不同,也可以相同。
宿主程序傳遞的構造函數以及原始數據,具體是用戶提供的。
其中,構造函數與原始數據可以打包為一個閉包,以閉包形式傳遞。
宿主程序和腳本程序之間可以創(chuàng)建一傳遞隊列,通過傳遞隊列獲取宿主程序傳遞的構造函數以及原始數據。
通過調用構造函數創(chuàng)建對象之后,調用該構造函數的作業(yè)還可以用于將創(chuàng)建的對象返回至腳本程序的上層,由腳本程序的上層執(zhí)行。
本申請實施例中,宿主程序與腳本程序交互時,宿主程序將獲取的對象的構造函數以及原始數據傳遞至腳本程序,由腳本程序調用構造函數,根據原始數據生成所述對象。也即對象的創(chuàng)建和訪問均由腳本程序執(zhí)行,即便宿主程序與腳本程序在不同線程中,也保證了對象的創(chuàng)建和訪問在同一個線程,因此可以適用于不同的腳本語言,保證了對象傳遞方式的通用性。
本申請實施例還提供了一種對象傳遞裝置,如圖4所示,為本申請實施例提供的對象傳遞裝置一個實施例的結構示意圖該裝置可以包括:
獲取模塊401,用于在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,獲取所述對象的構造函數以及原始數據。
傳遞模塊402,用于將所述對象的構造函數以及原始數據傳遞至所述腳本程序,由所述腳本程序在所述腳本線程上調用所述構造函數,根據所述原 始數據創(chuàng)建所述對象。
其中,所述宿主線程與所述腳本線程可以相同,也可以不同。
本實施例中,宿主程序與腳本程序交互時,獲取的對象的構造函數以及原始數據傳遞至腳本程序,由腳本程序調用構造函數,根據原始數據創(chuàng)建所述對象,從而實現了對象的傳遞。也即對象的創(chuàng)建和訪問均由腳本程序執(zhí)行,即便宿主程序與腳本程序在不同線程中,也保證了對象的創(chuàng)建和訪問在同一個線程,因此可以適用于不同的腳本語言,保證了對象傳遞方式的通用性。
本實施例中對象傳遞裝置具體應用于宿主程序中。
作為另一個實施例,如圖5所述,該傳遞模塊402可以包括:
轉換單元501,用于根據所述腳本程序的腳本語言,將所述構造函數轉換為所述腳本語言類型的構造函數;
傳遞單元502,用于將轉換之后的構造函數以及所述原始數據傳遞至所述腳本程序。
通過將構造函數進行轉換,使得無需用戶提供不同腳本語言類型的構造函數,只需提供采用通過的預設描述方式,即可以自動轉換為不同腳本語言類型的構造函數,減少了復雜度。
其中,宿主程序與腳本程序之間可以創(chuàng)建生產者-消費者隊列,即傳遞隊列,從而宿主程序可以通過傳遞隊列將構造函數以及原始數據傳遞至腳本程序。傳遞隊列采用先進先出方式。
因此,如圖6所述,該裝置還可以包括:
建立模塊403,用于建立宿主程序與腳本程序之間的傳遞隊列;
所述傳遞模塊402具體用于將所述對象的構造函數以及原始數據通過所述傳遞隊列傳遞至所述腳本程序。
在傳遞模塊由于轉換單元和傳遞單元組成時,傳遞單元具體用于將所述對象的構造函數以及原始數據通過所述傳遞隊列傳遞至所述腳本程序。
作為又一個實施例,構造函數和原始數據可以打包成一個閉包,因此,該傳遞模塊具體是用于將所述對象的構造函數以及原始數據打包成閉包,傳遞至所述腳本程序,可以是通過傳遞隊列將閉包傳遞至腳本程序。
圖7為本申請實施例提供的一種對象傳遞裝置又一個實施例的結構示意,本實施例的裝置具體應用于腳本程序中,該裝置可以包括:
接收模塊701,用于在宿主線程中的宿主程序與腳本線程中的腳本程序交互時,所述腳本程序獲取所述宿主程序傳遞的構造函數以及原始數據;
創(chuàng)建模塊702,用于在腳本線程上調用所述構造函數,根據所述原始數據創(chuàng)建所述對象。
其中,所述宿主線程和所述腳本線程可以不同,也可以相同。
宿主程序傳遞的構造函數以及原始數據,具體是用戶提供的。
其中,構造函數與原始數據可以打包為一個閉包,以閉包形式傳遞。
宿主程序和腳本程序之間可以創(chuàng)建一傳遞隊列,通過傳遞隊列獲取宿主程序傳遞的構造函數以及原始數據。
通過調用構造函數創(chuàng)建對象之后,調用該構造函數的作業(yè)還可以用于將創(chuàng)建的對象返回至腳本程序的上層,由腳本程序的上層執(zhí)行。
本實施例中,宿主程序與腳本程序交互時,宿主程序將獲取的對象的構造函數以及原始數據傳遞至腳本程序,由腳本程序調用構造函數,根據原始數據創(chuàng)建所述對象。也即對象的創(chuàng)建和訪問均由腳本程序執(zhí)行,即便宿主程序與腳本程序在不同線程中,也保證了對象的創(chuàng)建和訪問在同一個線程,因此可以適用于不同的腳本語言,保證了對象傳遞方式的通用性。
下面將結合一個實際應用場景,來對本發(fā)明的技術方案進行描述:
假設宿主語言為C++,腳本語言為Lua,待傳遞的對象為Student(學生),其中包含學號(id,整型數據)和姓名(name,字符串數據)兩種屬 性。宿主語言和腳本語言各自所運行的線程已經創(chuàng)建好,并且用于傳遞對象的隊列也已經準備就緒。
首先,準備構造函數,它接受學號,姓名作為原始數據,同時接受一個用于構建Lua對象的構建器(builder)。構建器包含于宿主程序提供的函數庫。
采用預設的抽象描述方式的構造函數的C++代碼如下:
void StudentConstructor(Builder b,int id,string name)
{
Object o=b.NewObject(); //創(chuàng)建一個空對象
o.SetIntegerField(“id”,id); //設置其id字段
o.SetStringField(“name”,name); //設置其name字段
b.Finish(o); //完成構建過程
}
然后,將該構造函數和對象的原始數據打成一個閉包,接著將閉包push到傳遞對象的隊列里。在宿主語言里,閉包的作用是將構造函數和對象的原始數據“綁定”(bind)在一起;閉包同時是腳本語言的一種擴展,在腳本語言里,它能被調用一次,用于執(zhí)行構造的過程,并返回創(chuàng)建的對象。
宿主程序傳遞構造函數以及原始數據,腳本程序創(chuàng)建對象的執(zhí)行可以按照如下代碼實現:
C++ code:
int id=31; //原始數據:學號31
string name=“mark”; //原始數據:姓名mark
Closure c=bind(StudentConstructor,id,name) //構建閉包
queue.Push(c); //將閉包放到隊列中
Lua code:
local c=queue:Pop() --從隊列里取出下一個閉包
o=c.do_construct() --實際的創(chuàng)建過程
assert(o.id==31)
assert(o.name==“mark”)
如在說明書及權利要求當中使用了某些詞匯來指稱特定組件。本領域技術人員應可理解,硬件制造商可能會用不同名詞來稱呼同一個組件。本說明書及權利要求并不以名稱的差異來作為區(qū)分組件的方式,而是以組件在功能上的差異來作為區(qū)分的準則。如在通篇說明書及權利要求當中所提及的“包含”為一開放式用語,故應解釋成“包含但不限定于”?!按笾隆笔侵冈诳山邮盏恼`差范圍內,本領域技術人員能夠在一定誤差范圍內解決所述技術問題,基本達到所述技術效果。此外,“耦接”一詞在此包含任何直接及間接的電性耦接手段。因此,若文中描述一第一裝置耦接于一第二裝置,則代表所述第一裝置可直接電性耦接于所述第二裝置,或通過其他裝置或耦接手段間接地電性耦接至所述第二裝置。說明書后續(xù)描述為實施本申請的較佳實施方式,然所述描述乃以說明本申請的一般原則為目的,并非用以限定本申請的范圍。本申請的保護范圍當視所附權利要求所界定者為準。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的商品或者系統不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種商品或者系統所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的商品或者系統中還存在另外的相同要素。
上述說明示出并描述了本申請的若干優(yōu)選實施例,但如前所述,應當理解本申請并非局限于本文所披露的形式,不應看作是對其他實施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述申請構想范圍內,通過上述教導或相關領域的技術或知識進行改動。而本領域人員所進行的改動和變化不脫離本申請的精神和范圍,則都應在本申請所附權利要求的保護范圍內。