用于函數(shù)調(diào)用的方法和裝置制造方法【專利摘要】本發(fā)明公開了一種用于函數(shù)調(diào)用的方法和裝置,所述方法包括:響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;依照所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼模塊中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。所述裝置與方法對(duì)應(yīng)。利用本發(fā)明的方法和裝置,可以確保函數(shù)的調(diào)用方和被調(diào)用方之間調(diào)用約定上的匹配,避免由于調(diào)用約定不一致引起的問(wèn)題。【專利說(shuō)明】用于函數(shù)調(diào)用的方法和裝置【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及程序中的函數(shù)調(diào)用,更具體而言,涉及一種用于函數(shù)調(diào)用的方法和裝置?!?br>背景技術(shù):
】[0002]多數(shù)高級(jí)程序語(yǔ)言都提供有函數(shù)調(diào)用的功能。在函數(shù)調(diào)用過(guò)程中,調(diào)用方和被調(diào)用方需要遵從預(yù)定的調(diào)用約定(CallingConvention)。具體地,調(diào)用約定是指在程序設(shè)計(jì)語(yǔ)言中為了實(shí)現(xiàn)函數(shù)調(diào)用而建立的一種協(xié)議。這種協(xié)議規(guī)定了在調(diào)用過(guò)程中的多種操作方式,包括,參數(shù)如何傳送、參數(shù)是否可變、由誰(shuí)來(lái)清理堆棧等。不同的語(yǔ)言、不同的編譯器定義了不同的調(diào)用約定。例如,VC++6.0定義了下面幾種調(diào)用約定。[0003]_cdecl是C/C++和MFC程序默認(rèn)使用的調(diào)用約定,也可以在函數(shù)聲明時(shí)加上—cdecl關(guān)鍵字來(lái)手工指定。采用—cdecl約定時(shí),函數(shù)參數(shù)按照從右到左的順序入棧,并且由函數(shù)調(diào)用方(caller)把參數(shù)彈出棧以清理堆棧。因此,實(shí)現(xiàn)可變參數(shù)的函數(shù)只能使用該調(diào)用約定。[0004]—tdcall調(diào)用約定用于調(diào)用Win32API函數(shù)。采用—stdcal約定時(shí),函數(shù)參數(shù)按照從右到左的順序入棧,函數(shù)的被調(diào)用方(callee)在返回前清理傳送參數(shù)的棧。在該調(diào)用約定下,函數(shù)參數(shù)個(gè)數(shù)固定。[0005]—fastcall約定用于對(duì)性能要求非常高的場(chǎng)合。—fastcall約定將函數(shù)的從左邊開始的兩個(gè)大小不大于4個(gè)字節(jié)(DWORD)的參數(shù)分別放在ECX和EDX寄存器,其余的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的堆棧。[0006]在其他程序語(yǔ)言中,相應(yīng)地定義有不同的調(diào)用約定。例如,PASCAL是Pascal語(yǔ)言的函數(shù)調(diào)用方式,也可以在C/C++中使用。在該調(diào)用約定下,參數(shù)壓棧順序?yàn)閺淖蟮接?,與—cdecl和—stdcall相反。返回時(shí)的清棧方式與_stdcall相同。[0007]不同的調(diào)用約定應(yīng)用于不同的語(yǔ)言和不同的需要。一般來(lái)說(shuō),通過(guò)寄存器傳遞參數(shù)有利于提高程序運(yùn)行時(shí)的性能。但是,如果將過(guò)多的參數(shù)通過(guò)寄存器進(jìn)行傳遞也會(huì)影響執(zhí)行性能,因?yàn)榫幾g器無(wú)法在單個(gè)函數(shù)中完全利用所有的硬件寄存器。因此,在應(yīng)用中,通常為不同函數(shù)選擇不同的調(diào)用約定來(lái)優(yōu)化性能。例如,不同的函數(shù)庫(kù)可能采用不同的調(diào)用約定。此外,不同的編譯器對(duì)于不同的調(diào)用約定也有其選擇偏好。例如,一些編譯器傾向于通過(guò)通用寄存器來(lái)傳遞復(fù)數(shù)參數(shù),而另一些編譯器傾向于通過(guò)浮點(diǎn)寄存器傳遞復(fù)數(shù)。[0008]多種不同的調(diào)用約定為用戶的使用帶來(lái)一定的困惱。如果在進(jìn)行函數(shù)調(diào)用時(shí),調(diào)用方和被調(diào)用方采用了不同的調(diào)用約定,將會(huì)導(dǎo)致嚴(yán)重的運(yùn)行時(shí)錯(cuò)誤。為了避免這樣的錯(cuò)誤,一種可能的解決方案是由用戶處理每個(gè)要調(diào)用的函數(shù)。這就需要用戶獲得相應(yīng)的頭文件、源代碼等。這樣的方案使得用戶的工作變得非常繁重,并且在許多情況下甚至是無(wú)法實(shí)現(xiàn)的。另一種可能的方案是要求所有的函數(shù)庫(kù)提供者使用相同的“標(biāo)準(zhǔn)”調(diào)用約定。然而,這無(wú)疑會(huì)影響函數(shù)調(diào)用的執(zhí)行性能,并且也并不實(shí)際。因此,希望針對(duì)調(diào)用約定提出更好的方案,來(lái)解決上述問(wèn)題,從而避免因?yàn)檎{(diào)用約定不匹配而導(dǎo)致的錯(cuò)誤?!?br/>發(fā)明內(nèi)容】[0009]考慮到現(xiàn)有技術(shù)中存在的問(wèn)題,提出本發(fā)明,旨在減少或者避免由調(diào)用約定不匹配引發(fā)的錯(cuò)誤。[0010]根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于函數(shù)調(diào)用的方法,包括:響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;依據(jù)所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼部分中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。[0011]根據(jù)本發(fā)明的另一個(gè)方面,提供了一種用于函數(shù)調(diào)用的裝置,包括:代碼模塊獲取單元,配置為,響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;調(diào)用約定獲取單元,配置為獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;代碼模塊選擇單元,配置為,依據(jù)所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼部分中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。[0012]利用本發(fā)明實(shí)施例的方法和裝置,可以在相對(duì)于用戶透明的情況下確保函數(shù)的調(diào)用方和被調(diào)用方之間調(diào)用約定上的匹配,避免由于調(diào)用約定不一致引起的問(wèn)題?!緦@綀D】【附圖說(shuō)明】[0013]通過(guò)結(jié)合附圖對(duì)本公開示例性實(shí)施方式進(jìn)行更詳細(xì)的描述,本公開的上述以及其它目的、特征和優(yōu)勢(shì)將變得更加明顯,其中,在本公開示例性實(shí)施方式中,相同的參考標(biāo)號(hào)通常代表相同部件。[0014]圖1示出了適于用來(lái)實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算機(jī)系統(tǒng)/服務(wù)器12的框圖;[0015]圖2示出根據(jù)本發(fā)明一個(gè)實(shí)施例的用于函數(shù)調(diào)用的方法的流程圖;[0016]圖3示出根據(jù)一個(gè)實(shí)施例的確定特定調(diào)用約定的子步驟;[0017]圖4示出根據(jù)一個(gè)實(shí)施例的代碼示例;以及[0018]圖5示出根據(jù)本發(fā)明實(shí)施例的裝置的框圖?!揪唧w實(shí)施方式】[0019]下面將參照附圖更詳細(xì)地描述本公開的優(yōu)選實(shí)施方式。雖然附圖中顯示了本公開的優(yōu)選實(shí)施方式,然而應(yīng)該理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。[0020]所屬【
技術(shù)領(lǐng)域:
】的技術(shù)人員知道,本發(fā)明可以實(shí)現(xiàn)為系統(tǒng)、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本公開可以具體實(shí)現(xiàn)為以下形式,即:可以是完全的硬件、也可以是完全的軟件(包括固件、駐留軟件、微代碼等),還可以是硬件和軟件結(jié)合的形式,本文一般稱為“電路”、“模塊”或“系統(tǒng)”。此外,在一些實(shí)施例中,本發(fā)明還可以實(shí)現(xiàn)為在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)中的計(jì)算機(jī)程序產(chǎn)品的形式,該計(jì)算機(jī)可讀介質(zhì)中包含計(jì)算機(jī)可讀的程序代碼。[0021]可以采用一個(gè)或多個(gè)計(jì)算機(jī)可讀的介質(zhì)的任意組合。計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)例如可以是一但不限于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、可擦式可編程只讀存儲(chǔ)器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(CD-ROM)、光存儲(chǔ)器件、磁存儲(chǔ)器件、或者上述的任意合適的組合。在本文件中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。[0022]計(jì)算機(jī)可讀的信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào),其中承載了計(jì)算機(jī)可讀的程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括——但不限于——電磁信號(hào)、光信號(hào)或上述的任意合適的組合。計(jì)算機(jī)可讀的信號(hào)介質(zhì)還可以是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)以外的任何計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。[0023]計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括一但不限于一無(wú)線、電線、光纜、RF等等,或者上述的任意合適的組合。[0024]可以以一種或多種程序設(shè)計(jì)語(yǔ)言或其組合來(lái)編寫用于執(zhí)行本發(fā)明操作的計(jì)算機(jī)程序代碼,所述程序設(shè)計(jì)語(yǔ)言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言一諸如Java、Smalltalk、C++,還包括常規(guī)的過(guò)程式程序設(shè)計(jì)語(yǔ)言一諸如”C”語(yǔ)言或類似的程序設(shè)計(jì)語(yǔ)言。程序代碼可以完全地在用戶計(jì)算機(jī)上執(zhí)行、部分地在用戶計(jì)算機(jī)上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶計(jì)算機(jī)上部分在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計(jì)算機(jī)的情形中,遠(yuǎn)程計(jì)算機(jī)可以通過(guò)任意種類的網(wǎng)絡(luò)一包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)—連接到用戶計(jì)算機(jī),或者,可以連接到外部計(jì)算機(jī)(例如利用因特網(wǎng)服務(wù)提供商來(lái)通過(guò)因特網(wǎng)連接)。[0025]下面將參照本發(fā)明實(shí)施例的方法、裝置(系統(tǒng))和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或框圖描述本發(fā)明。應(yīng)當(dāng)理解,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各方框的組合,都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,這些計(jì)算機(jī)程序指令通過(guò)計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。[0026]也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能使得計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令就產(chǎn)生出一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instructionmeans)的制造品(manufacture)。[0027]也可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過(guò)程,從而使得在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令能夠提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過(guò)程。[0028]圖1示出了適于用來(lái)實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算機(jī)系統(tǒng)/服務(wù)器12的框圖。圖1顯示的計(jì)算機(jī)系統(tǒng)/服務(wù)器12僅僅是一個(gè)示例,不應(yīng)對(duì)本發(fā)明實(shí)施例的功能和使用范圍帶來(lái)任何限制。[0029]如圖1所示,計(jì)算機(jī)系統(tǒng)/服務(wù)器12以通用計(jì)算設(shè)備的形式表現(xiàn)。計(jì)算機(jī)系統(tǒng)/服務(wù)器12的組件可以包括但不限于:一個(gè)或者多個(gè)處理器或者處理單元16,系統(tǒng)存儲(chǔ)器28,連接不同系統(tǒng)組件(包括系統(tǒng)存儲(chǔ)器28和處理單元16)的總線18。[0030]總線18表示幾類總線結(jié)構(gòu)中的一種或多種,包括存儲(chǔ)器總線或者存儲(chǔ)器控制器,外圍總線,圖形加速端口,處理器或者使用多種總線結(jié)構(gòu)中的任意總線結(jié)構(gòu)的局域總線。舉例來(lái)說(shuō),這些體系結(jié)構(gòu)包括但不限于工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線,微通道體系結(jié)構(gòu)(MAC)總線,增強(qiáng)型ISA總線、視頻電子標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局域總線以及外圍組件互連(PCI)總線。[0031]計(jì)算機(jī)系統(tǒng)/服務(wù)器12典型地包括多種計(jì)算機(jī)系統(tǒng)可讀介質(zhì)。這些介質(zhì)可以是任何能夠被計(jì)算機(jī)系統(tǒng)/服務(wù)器12訪問(wèn)的可用介質(zhì),包括易失性和非易失性介質(zhì),可移動(dòng)的和不可移動(dòng)的介質(zhì)。[0032]系統(tǒng)存儲(chǔ)器28可以包括易失性存儲(chǔ)器形式的計(jì)算機(jī)系統(tǒng)可讀介質(zhì),例如隨機(jī)存取存儲(chǔ)器(RAM)30和/或高速緩存存儲(chǔ)器32。計(jì)算機(jī)系統(tǒng)/服務(wù)器12可以進(jìn)一步包括其它可移動(dòng)/不可移動(dòng)的、易失性/非易失性計(jì)算機(jī)系統(tǒng)存儲(chǔ)介質(zhì)。僅作為舉例,存儲(chǔ)系統(tǒng)34可以用于讀寫不可移動(dòng)的、非易失性磁介質(zhì)(圖3未顯示,通常稱為“硬盤驅(qū)動(dòng)器”)。盡管圖1中未示出,可以提供用于對(duì)可移動(dòng)非易失性磁盤(例如“軟盤”)讀寫的磁盤驅(qū)動(dòng)器,以及對(duì)可移動(dòng)非易失性光盤(例如⑶-ROM,DVD-ROM或者其它光介質(zhì))讀寫的光盤驅(qū)動(dòng)器。在這些情況下,每個(gè)驅(qū)動(dòng)器可以通過(guò)一個(gè)或者多個(gè)數(shù)據(jù)介質(zhì)接口與總線18相連。存儲(chǔ)器28可以包括至少一個(gè)程序產(chǎn)品,該程序產(chǎn)品具有一組(例如至少一個(gè))程序模塊,這些程序模塊被配置以執(zhí)行本發(fā)明各實(shí)施例的功能。[0033]具有一組(至少一個(gè))程序模塊42的程序/實(shí)用工具40,可以存儲(chǔ)在例如存儲(chǔ)器28中,這樣的程序模塊42包括——但不限于——操作系統(tǒng)、一個(gè)或者多個(gè)應(yīng)用程序、其它程序模塊以及程序數(shù)據(jù),這些示例中的每一個(gè)或某種組合中可能包括網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)。程序模塊42通常執(zhí)行本發(fā)明所描述的實(shí)施例中的功能和/或方法。[0034]計(jì)算機(jī)系統(tǒng)/服務(wù)器12也可以與一個(gè)或多個(gè)外部設(shè)備14(例如鍵盤、指向設(shè)備、顯示器24等)通信,還可與一個(gè)或者多個(gè)使得用戶能與該計(jì)算機(jī)系統(tǒng)/服務(wù)器12交互的設(shè)備通信,和/或與使得該計(jì)算機(jī)系統(tǒng)/服務(wù)器12能與一個(gè)或多個(gè)其它計(jì)算設(shè)備進(jìn)行通信的任何設(shè)備(例如網(wǎng)卡,調(diào)制解調(diào)器等等)通信。這種通信可以通過(guò)輸入/輸出(I/O)接口22進(jìn)行。并且,計(jì)算機(jī)系統(tǒng)/服務(wù)器12還可以通過(guò)網(wǎng)絡(luò)適配器20與一個(gè)或者多個(gè)網(wǎng)絡(luò)(例如局域網(wǎng)(LAN),廣域網(wǎng)(WAN)和/或公共網(wǎng)絡(luò),例如因特網(wǎng))通信。如圖所示,網(wǎng)絡(luò)適配器20通過(guò)總線18與計(jì)算機(jī)系統(tǒng)/服務(wù)器12的其它模塊通信。應(yīng)當(dāng)明白,盡管圖中未示出,可以結(jié)合計(jì)算機(jī)系統(tǒng)/服務(wù)器12使用其它硬件和/或軟件模塊,包括但不限于:微代碼、設(shè)備驅(qū)動(dòng)器、冗余處理單元、外部磁盤驅(qū)動(dòng)陣列、RAID系統(tǒng)、磁帶驅(qū)動(dòng)器以及數(shù)據(jù)備份存儲(chǔ)系統(tǒng)等。[0035]以下結(jié)合附圖和具體例子描述本發(fā)明的實(shí)施方式。根據(jù)本發(fā)明的實(shí)施例,在程序編譯階段,為程序中的函數(shù)調(diào)用提供分別遵從多個(gè)不同調(diào)用約定的多個(gè)備選代碼模塊。此夕卜,根據(jù)編譯時(shí)提供的附加代碼,程序在運(yùn)行時(shí)能夠確定被調(diào)用函數(shù)所采用的特定調(diào)用約定,并據(jù)此從所提供的多個(gè)備選代碼模塊中選擇其中的一個(gè)來(lái)執(zhí)行所述函數(shù)調(diào)用。由此,確保了調(diào)用方和被調(diào)用方之間調(diào)用約定上的匹配,避免了由于調(diào)用約定不一致引起的問(wèn)題。[0036]現(xiàn)在參看圖2,其示出根據(jù)本發(fā)明一個(gè)實(shí)施例的用于函數(shù)調(diào)用的方法的流程圖。如圖2所示,所述方法包括:步驟21,響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;步驟22,獲取被調(diào)用函數(shù)采用的特定調(diào)用約定;步驟23,依據(jù)所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼模塊中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。下面結(jié)合具體例子描述以上各個(gè)步驟的執(zhí)行方式。[0037]在一個(gè)實(shí)施例中,首先在步驟21,響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取分別符合多個(gè)調(diào)用約定的多個(gè)備選代碼模塊,用以執(zhí)行該函數(shù)調(diào)用。可以理解,在現(xiàn)有技術(shù)中,已經(jīng)存在多種方式來(lái)檢測(cè)程序中的函數(shù)調(diào)用,例如,檢測(cè)函數(shù)調(diào)用采用的關(guān)鍵詞,檢測(cè)函數(shù)調(diào)用采用的格式等等。不同的程序語(yǔ)言可能采用不同的關(guān)鍵詞或格式來(lái)引導(dǎo)或指示函數(shù)的調(diào)用。針對(duì)不同的程序語(yǔ)言,本領(lǐng)域技術(shù)人員能夠相應(yīng)地采用不同方式和標(biāo)準(zhǔn)來(lái)檢測(cè)函數(shù)調(diào)用。[0038]響應(yīng)于檢測(cè)到函數(shù)調(diào)用,在步驟21中針對(duì)該函數(shù)調(diào)用獲取多個(gè)備選代碼模塊,這多個(gè)備選代碼模塊分別符合多個(gè)不同調(diào)用約定,并且均用于執(zhí)行上述函數(shù)調(diào)用??梢岳斫猓谡{(diào)用同一程序語(yǔ)言提供的內(nèi)部函數(shù)庫(kù)中的函數(shù)時(shí),一般不會(huì)存在調(diào)用約定不匹配的問(wèn)題。因此,在一個(gè)實(shí)施例中,在檢測(cè)到程序中的函數(shù)調(diào)用的情況下,進(jìn)一步判斷該函數(shù)是否來(lái)自內(nèi)部函數(shù)庫(kù)。僅在被調(diào)用的函數(shù)為外部函數(shù)庫(kù)中的函數(shù)的情況下,獲取上述的多個(gè)備選代碼模塊。[0039]在一個(gè)實(shí)施例中,獲取多個(gè)備選代碼模塊包括,在程序編譯過(guò)程中準(zhǔn)備多個(gè)備選代碼模塊,并將其插入在已編譯程序中。也就是說(shuō),程序設(shè)計(jì)者或者用戶僅需要在源程序中指明要調(diào)用的函數(shù)和其所屬的函數(shù)庫(kù),而不必知曉其調(diào)用約定,也不必關(guān)注其調(diào)用執(zhí)行過(guò)程。根據(jù)本發(fā)明實(shí)施例的方法,在程序編譯階段,不僅對(duì)源程序進(jìn)行編譯,而且將多個(gè)版本的調(diào)用執(zhí)行代碼,也就是多個(gè)備選代碼模塊,插入到編譯的程序中,該多個(gè)備選代碼模塊分別用于根據(jù)不同調(diào)用約定來(lái)執(zhí)行調(diào)用過(guò)程。上述備選代碼模塊的功能和形式類似于現(xiàn)有技術(shù)中插入在程序中用以執(zhí)行特定功能的“樁代碼”。[0040]例如,在一個(gè)具體例子中,在C程序中調(diào)用了函數(shù)FncA。為此,在編譯該C程序時(shí),可以準(zhǔn)備3個(gè)備選代碼模塊,分別用于根據(jù)C程序中可能的調(diào)用約定—cdecl,—stdcall和—fastcall來(lái)執(zhí)行調(diào)用過(guò)程。[0041]在一個(gè)實(shí)施例中,多個(gè)備選代碼模塊中的至少一個(gè)包含前序部分(prologue)、主體部分和結(jié)尾部分(epilogue)。前序部分用于完成函數(shù)調(diào)用之前的準(zhǔn)備工作,例如,準(zhǔn)備參數(shù)、將參數(shù)放入棧或者寄存器等。主體部分用于執(zhí)行函數(shù)調(diào)用。結(jié)尾部分用于進(jìn)行函數(shù)調(diào)用之后的清理工作。根據(jù)所采用的調(diào)用約定的不同,各個(gè)備選代碼模塊所包含的前序部分、結(jié)尾部分也不相同。下面仍然以前述的C程序?yàn)槔枋霾煌{(diào)用約定下各個(gè)部分的執(zhí)行方式。[0042]如前所述,在C程序的情況下,獲取3個(gè)備選代碼模塊分別用于—cdecl,—stdcall和—fastcall。用于—cdecl的備選代碼模塊中的前序部分,或稱為用于—cdecl的前序部分,根據(jù)—cdecl的調(diào)用約定將準(zhǔn)備的參數(shù)按照從右到左的順序推入棧中,并且,用于—cdecl的結(jié)尾部分在函數(shù)調(diào)用執(zhí)行完畢之后把參數(shù)彈出棧以清理堆棧。用于—stdcal的前序部分類似地將函數(shù)參數(shù)推入棧中,但是不同的是,在該調(diào)用約定下,由函數(shù)的被調(diào)用方來(lái)清理傳送參數(shù)的棧。因此,用于—stdcal的結(jié)尾部分并不執(zhí)行棧的清理。另外,根據(jù)—fastcall的調(diào)用約定,用于—fastcall的前序部分將部分參數(shù)放在ECX和EDX寄存器中,并將其余參數(shù)自右向左推入棧中,并且由被調(diào)用的函數(shù)進(jìn)行堆棧清理。[0043]可以理解,取決于不同的程序語(yǔ)言、不同的被調(diào)用函數(shù)庫(kù),有可能需要不同數(shù)目的備選代碼模塊,以遵從不同的調(diào)用約定。并且,取決于不同的調(diào)用約定,備選代碼模塊的各個(gè)組成部分的執(zhí)行方式也有所不同。本領(lǐng)域技術(shù)人員在閱讀本說(shuō)明書的情況下,能夠根據(jù)不同需要獲取相應(yīng)的備選代碼模塊。[0044]由于如上所述在編譯過(guò)程中預(yù)先獲取了多個(gè)版本的代碼模塊以適應(yīng)于多種不同調(diào)用約定,在程序運(yùn)行過(guò)程中就有可能根據(jù)被調(diào)用函數(shù)實(shí)際使用的調(diào)用約定來(lái)選擇適當(dāng)?shù)拇a模塊來(lái)執(zhí)行調(diào)用過(guò)程。為此,在步驟22,獲取上述程序中的被調(diào)用函數(shù)采用的特定調(diào)用約定。[0045]在一個(gè)實(shí)施例中,獲取上述特定調(diào)用約定包括,通過(guò)查詢運(yùn)行時(shí)對(duì)被調(diào)用函數(shù)的加載信息來(lái)確定特定調(diào)用約定。更具體而言,根據(jù)一個(gè)實(shí)施例,可以通過(guò)分析加載信息中被調(diào)用函數(shù)的修飾名來(lái)確定上述特定調(diào)用約定??梢岳斫猓诔绦蜻\(yùn)行時(shí),系統(tǒng)加載器不僅要加載程序的已編譯代碼,還會(huì)加載程序中所調(diào)用的函數(shù)庫(kù),例如DLL(動(dòng)態(tài)鏈接庫(kù))。另一方面,不同的編譯器在對(duì)程序進(jìn)行編譯時(shí),會(huì)根據(jù)一些規(guī)則來(lái)改寫符號(hào)名,這又稱為名稱改編(NameMangling)或者名稱修飾(NameDecoration)。許多編譯器對(duì)函數(shù)進(jìn)行名稱改編時(shí)依據(jù)的規(guī)則與該函數(shù)的調(diào)用約定有關(guān)。例如,許多C程序編譯器會(huì)遵從以下規(guī)則:對(duì)于_^(1(^11調(diào)用約定,在輸出函數(shù)名前加上一個(gè)下劃線前綴,在函數(shù)名后面加上一個(gè)〃@〃符號(hào)和其參數(shù)的字節(jié)數(shù),格式為_functionname@number。例如,在—stdcall調(diào)用約定下,function(inta,intb)的修飾名為:_function@8。對(duì)于—cdecl調(diào)用約定,僅在輸出函數(shù)名前加上一個(gè)下劃線前綴,格式為—functionname。而對(duì)于—fastcall調(diào)用約定,在輸出函數(shù)名前加上一個(gè)符號(hào),在函數(shù)名后面也加一個(gè)符號(hào)和其參數(shù)的字節(jié)數(shù),格式為@functionname@number。由此,如果被調(diào)用的函數(shù)庫(kù)是由C程序編寫的,那么在加載該函數(shù)庫(kù)時(shí),就可以獲得按照以上改編規(guī)則進(jìn)行了名稱改編的導(dǎo)出函數(shù)。這樣的導(dǎo)出函數(shù)具有與調(diào)用約定相對(duì)應(yīng)的修飾名。因此,有可能通過(guò)分析該修飾名來(lái)獲得被調(diào)用函數(shù)的調(diào)用約定。[0046]具體地,圖3示出根據(jù)一個(gè)實(shí)施例的確定特定調(diào)用約定的子步驟,即步驟22的子步驟。如圖3所示,首先,在步驟221,向運(yùn)行時(shí)發(fā)出查詢請(qǐng)求。根據(jù)一個(gè)實(shí)施例,該步驟由編譯器插入在已編譯程序中的查詢語(yǔ)句或查詢代碼來(lái)實(shí)現(xiàn)。具體地,在程序編譯階段,編譯器可以在已編譯的程序體的適當(dāng)位置插入查詢語(yǔ)句,用于向運(yùn)行時(shí)發(fā)出查詢請(qǐng)求。查詢請(qǐng)求中可以包含有待查詢的被調(diào)用函數(shù)的標(biāo)識(shí)信息,例如函數(shù)名稱以及其他標(biāo)識(shí)。接著在步驟222,響應(yīng)于查詢請(qǐng)求,獲取被調(diào)用函數(shù)的修飾名。該步驟可以通過(guò)運(yùn)行時(shí)環(huán)境中的系統(tǒng)加載器來(lái)實(shí)現(xiàn)。具體地,在程序運(yùn)行時(shí),加載器與現(xiàn)有技術(shù)類似地加載已編譯的程序和調(diào)用的函數(shù)庫(kù)。當(dāng)執(zhí)行到編譯器插入的查詢請(qǐng)求時(shí),加載器響應(yīng)于該查詢請(qǐng)求識(shí)別出被調(diào)用函數(shù),并從加載的函數(shù)庫(kù)信息中獲取導(dǎo)出的被調(diào)用函數(shù)的修飾名。接著在步驟223,根據(jù)所述修飾名,確定與被調(diào)用函數(shù)對(duì)應(yīng)的特定調(diào)用約定。如前所述,修飾名與調(diào)用約定之間存在預(yù)定的對(duì)應(yīng)關(guān)系。因此,在獲取了從函數(shù)庫(kù)中導(dǎo)出的被調(diào)用函數(shù)的修飾名的基礎(chǔ)上,結(jié)合預(yù)定的對(duì)應(yīng)關(guān)系,就可以確定與被調(diào)用函數(shù)對(duì)應(yīng)的特定調(diào)用約定。[0047]根據(jù)一個(gè)實(shí)施例,在如上所述確定特定調(diào)用約定的過(guò)程中,還需要進(jìn)一步注意不同編譯器對(duì)函數(shù)進(jìn)行名稱改編可能導(dǎo)致的名稱不一致問(wèn)題。例如,假定LI語(yǔ)言編寫的程序調(diào)用了用L2語(yǔ)言編寫的函數(shù)庫(kù)中的函數(shù)FncA。LI程序編譯器在對(duì)程序進(jìn)行編譯時(shí)根據(jù)LI語(yǔ)言的約定將FncA改編為名稱Al,并基于Al發(fā)出查詢請(qǐng)求;而系統(tǒng)加載器通過(guò)加載函數(shù)庫(kù)信息獲得的導(dǎo)出函數(shù)FncA的修飾名為A2。在這樣的情況下,在執(zhí)行以上的步驟222時(shí),就難以通過(guò)Al定位到A2,也就是難以獲得被調(diào)用函數(shù)FncA的修飾名。為此,在一個(gè)實(shí)施例中,通過(guò)以下方式執(zhí)行以上的步驟222,即,首先對(duì)與查詢請(qǐng)求對(duì)應(yīng)的函數(shù)標(biāo)識(shí)信息(例如已修飾的函數(shù)名)進(jìn)行名稱解改編(demangle),從而獲得原始函數(shù)名。例如,通過(guò)對(duì)Al解改編可以獲得原始函數(shù)名FncA。接著,基于原始函數(shù)名獲取被調(diào)用函數(shù)在函數(shù)庫(kù)中的修飾名。在一個(gè)例子中,可以基于原始函數(shù)名進(jìn)行部分匹配,從而獲得上述修飾名。例如,由于A2是通過(guò)某種規(guī)則對(duì)原始函數(shù)名FncA進(jìn)行的修飾,一般地,A2會(huì)包含F(xiàn)ncA的符號(hào)名,或者說(shuō),A2與FncA在字符上部分匹配。通過(guò)進(jìn)行這樣的部分匹配,就可以從FncA找到A2?;蛘撸谝粋€(gè)例子中,可以基于原始函數(shù)名進(jìn)行多種備選修飾,直到獲得匹配的修飾名。也就是說(shuō),嘗試根據(jù)各種修飾規(guī)則對(duì)原始函數(shù)名進(jìn)行修飾,直到修飾后的函數(shù)名與加載的函數(shù)庫(kù)中的函數(shù)名一致。這不僅獲得了被調(diào)用函數(shù)的修飾名,同時(shí)也獲得了相應(yīng)的修飾規(guī)則。基于以上獲取的被調(diào)用函數(shù)的修飾名,就可以確定被調(diào)用函數(shù)遵從的調(diào)用約定。[0048]在一個(gè)實(shí)施例中,通過(guò)分析加載信息中被調(diào)用函數(shù)的其他特性來(lái)確定被調(diào)用函數(shù)采用的特定調(diào)用約定。例如,可以獲取被調(diào)用函數(shù)的部分指令,從中分析出棧的分配、返回地址寄存器的設(shè)定等與調(diào)用約定相關(guān)的信息。通過(guò)這樣的信息,也可以確定被調(diào)用函數(shù)采用的調(diào)用約定。[0049]在步驟22獲取到被調(diào)用函數(shù)采用的特定調(diào)用約定的基礎(chǔ)上,在步驟23,就可以基于上述特定調(diào)用約定,從步驟21所提供的多個(gè)備選代碼部分中選擇出符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行函數(shù)調(diào)用。在一個(gè)實(shí)施例中,利用索引標(biāo)識(shí)不同的調(diào)用約定,并相應(yīng)地使得步驟21所提供的多個(gè)代碼模塊通過(guò)其對(duì)應(yīng)的調(diào)用約定的索引來(lái)標(biāo)識(shí)。這樣,利用上述索引就可以快速地基于特定調(diào)用約定選擇出對(duì)應(yīng)的代碼模塊。由此,程序中的函數(shù)調(diào)用能夠適合于各種不同的調(diào)用約定,而不會(huì)出現(xiàn)調(diào)用約定不匹配的問(wèn)題。[0050]在一個(gè)實(shí)施例中,為了進(jìn)一步提高執(zhí)行性能,在前述的步驟22的基礎(chǔ)上進(jìn)行擴(kuò)展,使得在通過(guò)查詢加載信息而確定了被調(diào)用函數(shù)的特定調(diào)用約定之后,記錄該特定調(diào)用約定,以便再次調(diào)用該被調(diào)用函數(shù)時(shí)直接獲取上述特定調(diào)用約定。這樣,僅在一個(gè)函數(shù)被初次調(diào)用時(shí),需要向加載器查詢特定調(diào)用約定;在該函數(shù)被再次調(diào)用時(shí),可以直接讀取記錄的調(diào)用約定來(lái)選擇適當(dāng)?shù)拇a模塊,從而更加快速地執(zhí)行調(diào)用過(guò)程。[0051]為了實(shí)現(xiàn)上述過(guò)程,在一個(gè)實(shí)施例中,通過(guò)設(shè)置狀態(tài)參數(shù)實(shí)現(xiàn)上述特定調(diào)用約定的記錄。具體地,可以在已編譯的程序體中設(shè)置一狀態(tài)參數(shù),該狀態(tài)參數(shù)具有O和I兩個(gè)可能值,O表示初次調(diào)用,I表示之后的調(diào)用。將該狀態(tài)參數(shù)的初始值設(shè)置為O。每次進(jìn)行函數(shù)調(diào)用時(shí),首先判斷狀態(tài)參數(shù)的值。如果狀態(tài)參數(shù)為0,則執(zhí)行前述的調(diào)用約定的查詢。在通過(guò)查詢確定了特定調(diào)用約定之后,存儲(chǔ)該調(diào)用約定,并將狀態(tài)參數(shù)的值修改為I。此后調(diào)用同樣的函數(shù)時(shí),響應(yīng)于狀態(tài)參數(shù)的值1,直接讀取之前存儲(chǔ)的特定調(diào)用約定,從而簡(jiǎn)單地獲取被調(diào)用函數(shù)采用的特定調(diào)用約定。[0052]在一個(gè)實(shí)施例中,通過(guò)地址的重新定向?qū)崿F(xiàn)上述特定調(diào)用約定的記錄。具體地,如前所述,可以使得所提供的多個(gè)代碼模塊通過(guò)其對(duì)應(yīng)的調(diào)用約定的索引來(lái)標(biāo)識(shí)。此外,為了查詢加載信息以確定特定調(diào)用約定,可以理解,在已編譯程序中插入有查詢代碼,來(lái)執(zhí)行上述查詢。根據(jù)本實(shí)施例,為查詢代碼設(shè)置指向地址,例如稱為第一地址。在上述查詢代碼段執(zhí)行完畢因而確定了特定調(diào)用約定之后,記錄該特定調(diào)用約定對(duì)應(yīng)的索引,并且對(duì)地址進(jìn)行重新定向,也就是將原本指向上述查詢代碼的地址(第一地址)修改為第二地址,該第二地址指向與上述特定調(diào)用約定的索引對(duì)應(yīng)的備選代碼模塊。這樣,當(dāng)再次執(zhí)行函數(shù)調(diào)用時(shí),將通過(guò)重新定向的地址直接執(zhí)行與特定調(diào)用約定對(duì)應(yīng)的代碼模塊。下面結(jié)合一段代碼描述上述實(shí)施例的執(zhí)行。[0053]圖4示出根據(jù)一個(gè)實(shí)施例的代碼示例。如圖4A所示,根據(jù)該示例性代碼,首先在FncA_stubs_table中定義了多個(gè)地址,其中resolve_FncA_addr指向查詢代碼,F(xiàn)ncA_stubl_addr指向第一個(gè)備選代碼模塊,F(xiàn)ncA_stub2_addr指向第二個(gè)備選代碼模塊??梢岳斫?,盡管此處沒(méi)有示出,還有可能存在更多的代碼模塊和相應(yīng)的指向地址。多個(gè)代碼模塊對(duì)應(yīng)于多個(gè)調(diào)用約定,并且根據(jù)調(diào)用約定的索引來(lái)標(biāo)識(shí)。每次函數(shù)FncA的調(diào)用執(zhí)行都從goto語(yǔ)句開始,該語(yǔ)句指向了下劃線標(biāo)識(shí)的地址FncA_stub_addr=FncA_stubs_table[O]?在第一次執(zhí)行函數(shù)調(diào)用時(shí),FncA_stubs_table[O]指向FncA_stubs_table中的第一個(gè)地址,即reS0lve_FncA_addr,而該地址指向查詢代碼。因此,執(zhí)行過(guò)程進(jìn)行到查詢代碼。如圖所示,查詢代碼中包含了用于進(jìn)行調(diào)用約定查詢的語(yǔ)句(QueryConvention)。通過(guò)該查詢代碼的返回結(jié)果可以確定函數(shù)FncA采用的調(diào)用約定。之后的語(yǔ)句FncA_stubs_table[O]=FncA_stubs_base[stub_index]不僅記錄調(diào)用約定對(duì)應(yīng)的索引(stub_index),還將原來(lái)指向查詢代碼的地址(FncA_stubs_table[0]中的地址)修改為指向與上述特定調(diào)用約定對(duì)應(yīng)的代碼模塊。在一個(gè)例子中,假定確定的調(diào)用約定的索引為2,于是,F(xiàn)ncA_stubs_table[O]中的地址由resolve_FncA_addr改變?yōu)镕ncA_stub2_addr,如圖4B所不。于是,當(dāng)再次調(diào)用FncA時(shí),仍然從地址FncA_stub_addr=FncA_stubs_table[O]開始執(zhí)行。然而此時(shí),F(xiàn)ncA_stubs_table[O]中的地址變?yōu)镕ncA_stub2_addr,即指向了第二個(gè)備選代碼模塊。因此,執(zhí)行過(guò)程將直接跳轉(zhuǎn)到第二個(gè)備選代碼模塊來(lái)執(zhí)行函數(shù)調(diào)用。從而,通過(guò)將指向查詢代碼的地址重新定向,直接獲得了記錄的調(diào)用約定進(jìn)而可以獲得該調(diào)用約定所對(duì)應(yīng)的代碼模塊。[0054]可以理解,以上的代碼僅僅為了示例地址的重新定向過(guò)程。實(shí)際執(zhí)行的代碼可以采用不同語(yǔ)言,具有不同形式。[0055]此外,盡管以上描述了記錄所確定的特定調(diào)用約定用于函數(shù)的再次調(diào)用的具體執(zhí)行方式,但是記錄方式并不局限于以上的具體描述。本領(lǐng)域技術(shù)人員在本說(shuō)明書教導(dǎo)下有可能采用其他方式實(shí)現(xiàn)上述記錄,以使得所記錄的特定調(diào)用約定可以直接用于同一函數(shù)的再次調(diào)用。[0056]如前所述,根據(jù)本發(fā)明的實(shí)施例的方法,提供用于不同調(diào)用約定的多個(gè)版本的代碼模塊,并基于被調(diào)用函數(shù)實(shí)際使用的調(diào)用約定來(lái)執(zhí)行適當(dāng)版本的代碼模塊。由此,確保了調(diào)用方和被調(diào)用方之間調(diào)用約定上的匹配,避免了由于調(diào)用約定不一致引起的問(wèn)題。[0057]基于同一發(fā)明構(gòu)思,本發(fā)明的實(shí)施例還提供了一種用于函數(shù)調(diào)用的裝置。圖5示出根據(jù)本發(fā)明實(shí)施例的裝置的框圖,該裝置總體上標(biāo)注為50。如圖5所示,該用于函數(shù)調(diào)用的裝置50包括:代碼模塊獲取單元51,配置為,響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;調(diào)用約定獲取單元52,配置為獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;代碼模塊選擇單元53,配置為,依照所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼模塊中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。[0058]根據(jù)一個(gè)實(shí)施例,所述代碼模塊獲取單元配置為,響應(yīng)于被調(diào)用函數(shù)為外部函數(shù)庫(kù)中的函數(shù),獲取所述多個(gè)備選代碼模塊。[0059]根據(jù)一個(gè)實(shí)施例,所述多個(gè)備選代碼模塊中的至少一個(gè)包括:前序部分,用于完成函數(shù)調(diào)用之前的準(zhǔn)備工作;主體部分,用于執(zhí)行函數(shù)調(diào)用;結(jié)尾部分,用于進(jìn)行函數(shù)調(diào)用之后的清理工作。[0060]在一個(gè)實(shí)施例中,所述調(diào)用約定獲取單元包括調(diào)用約定確定子單元(未示出),該子單元配置為通過(guò)查詢所述程序運(yùn)行時(shí)中所述被調(diào)用函數(shù)的加載信息來(lái)確定特定調(diào)用約定。[0061]在一個(gè)實(shí)施例中,所述調(diào)用約定確定子單元配置為:向所述程序運(yùn)行時(shí)發(fā)出查詢請(qǐng)求,其中包含被調(diào)用函數(shù)的標(biāo)識(shí)信息;響應(yīng)于查詢請(qǐng)求,獲取被調(diào)用函數(shù)的修飾名;基于所述修飾名,確定與被調(diào)用函數(shù)對(duì)應(yīng)的特定調(diào)用約定。[0062]根據(jù)一個(gè)實(shí)施例,所述調(diào)用約定確定子單元進(jìn)一步配置為:基于所述被調(diào)用函數(shù)的標(biāo)識(shí)信息進(jìn)行名稱解改編,獲得原始函數(shù)名;基于所述原始函數(shù)名獲取被調(diào)用函數(shù)在函數(shù)庫(kù)中的修飾名。[0063]根據(jù)一個(gè)實(shí)施例,所述調(diào)用約定獲取單元還包括記錄子單元,該子單元配置為,記錄所確定的特定調(diào)用約定,以便再次調(diào)用該被調(diào)用函數(shù)時(shí)直接獲取上述特定調(diào)用約定。[0064]根據(jù)一個(gè)實(shí)施例,所述記錄子單元配置為,記錄所述特定調(diào)用約定對(duì)應(yīng)的索引,并將第一地址修改為第二地址,所述第一地址指向用于查詢所述加載信息的代碼,所述第二地址指向所述多個(gè)代碼模塊中與上述特定調(diào)用約定的索引對(duì)應(yīng)的代碼模塊裝置。[0065]以上用于函數(shù)調(diào)用的裝置50的具體執(zhí)行方式可以參照之前結(jié)合具體例子對(duì)圖2的方法的描述,在此不再贅述。在一個(gè)實(shí)施例中,上述裝置50中的代碼模塊獲取單元51和代碼模塊選擇單元53通過(guò)程序編譯器來(lái)實(shí)現(xiàn),調(diào)用約定獲取單元52由程序編譯器和系統(tǒng)加載器共同實(shí)現(xiàn)。在另一實(shí)施例中,上述裝置50可以實(shí)現(xiàn)為與已有的編譯器和/或加載器獨(dú)立的裝置或工具。[0066]利用本發(fā)明實(shí)施例的方法和裝置,可以在相對(duì)于用戶透明的情況下確保函數(shù)的調(diào)用方和被調(diào)用方之間調(diào)用約定上的匹配,避免由于調(diào)用約定不一致引起的問(wèn)題。[0067]附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個(gè)實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來(lái)實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來(lái)實(shí)現(xiàn)。[0068]以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說(shuō)明是示例性的,并非窮盡性的,并且也不限于所披露的各實(shí)施例。在不偏離所說(shuō)明的各實(shí)施例的范圍和精神的情況下,對(duì)于本【
技術(shù)領(lǐng)域:
】的普通技術(shù)人員來(lái)說(shuō)許多修改和變更都是顯而易見的。本文中所用術(shù)語(yǔ)的選擇,旨在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌?chǎng)中的技術(shù)的技術(shù)改進(jìn),或者使本【
技術(shù)領(lǐng)域:
】的其它普通技術(shù)人員能理解本文披露的各實(shí)施例。【權(quán)利要求】1.一種用于函數(shù)調(diào)用的方法,包括:響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;依據(jù)所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼模塊中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。2.根據(jù)權(quán)利要求1的方法,其中獲取多個(gè)備選代碼模塊包括,響應(yīng)于被調(diào)用函數(shù)為外部函數(shù)庫(kù)中的函數(shù),獲取所述多個(gè)備選代碼模塊。3.根據(jù)權(quán)利要求1的方法,其中所述多個(gè)備選代碼模塊中的至少一個(gè)包括:前序部分,用于完成函數(shù)調(diào)用之前的準(zhǔn)備工作;主體部分,用于執(zhí)行函數(shù)調(diào)用;結(jié)尾部分,用于進(jìn)行函數(shù)調(diào)用之后的清理工作。4.根據(jù)權(quán)利要求1的方法,其中獲取所述特定調(diào)用約定包括,查詢所述程序運(yùn)行時(shí)中所述被調(diào)用函數(shù)的加載信息以確定特定調(diào)用約定。5.根據(jù)權(quán)利要求4的方法,其中查詢所述程序運(yùn)行時(shí)中所述被調(diào)用函數(shù)的加載信息以確定特定調(diào)用約定包括:向所述程序運(yùn)行時(shí)發(fā)出查詢請(qǐng)求,其中包含被調(diào)用函數(shù)的標(biāo)識(shí)信息;響應(yīng)于查詢請(qǐng)求,獲取被調(diào)用函數(shù)的修飾名;基于所述修飾名,確定與被調(diào)用函數(shù)對(duì)應(yīng)的特定調(diào)用約定。·6.根據(jù)權(quán)利要求5的方法,其中獲取被調(diào)用函數(shù)的修飾名包括:基于所述被調(diào)用函數(shù)的標(biāo)識(shí)信息進(jìn)行名稱解改編,獲得原始函數(shù)名;基于所述原始函數(shù)名獲取被調(diào)用函數(shù)在函數(shù)庫(kù)中的修飾名。7.根據(jù)權(quán)利要求4的方法,其中獲取所述特定調(diào)用約定還包括,記錄所確定的特定調(diào)用約定,以便再次調(diào)用該被調(diào)用函數(shù)時(shí)直接獲取上述特定調(diào)用約定。8.根據(jù)權(quán)利要求7的方法,其中記錄所確定的特定調(diào)用約定包括,記錄所述特定調(diào)用約定對(duì)應(yīng)的索引,并將第一地址修改為第二地址,所述第一地址指向用于查詢所述加載信息的代碼,所述第二地址指向所述多個(gè)代碼模塊中與上述特定調(diào)用約定的索引對(duì)應(yīng)的代碼模塊。9.一種用于函數(shù)調(diào)用的裝置,包括:代碼模塊獲取單元,配置為,響應(yīng)于檢測(cè)到程序中的函數(shù)調(diào)用,獲取用于執(zhí)行所述函數(shù)調(diào)用的多個(gè)備選代碼模塊,所述多個(gè)備選代碼模塊分別符合多個(gè)調(diào)用約定;調(diào)用約定獲取單元,配置為獲取被調(diào)用函數(shù)所采用的特定調(diào)用約定;代碼模塊選擇單元,配置為,依據(jù)所獲取到的所述特定調(diào)用約定,從所述多個(gè)備選代碼模塊中選擇符合所述特定調(diào)用約定的代碼模塊來(lái)執(zhí)行所述函數(shù)調(diào)用。10.根據(jù)權(quán)利要求9的裝置,其中所述代碼模塊獲取單元配置為,響應(yīng)于被調(diào)用函數(shù)為外部函數(shù)庫(kù)中的函數(shù),獲取所述多個(gè)備選代碼模塊。11.根據(jù)權(quán)利要求9的裝置,其中所述多個(gè)備選代碼模塊中的至少一個(gè)包括:前序部分,用于完成函數(shù)調(diào)用之前的準(zhǔn)備工作;主體部分,用于執(zhí)行函數(shù)調(diào)用;結(jié)尾部分,用于進(jìn)行函數(shù)調(diào)用之后的清理工作。12.根據(jù)權(quán)利要求9的裝置,其中所述調(diào)用約定獲取單元包括調(diào)用約定確定子單元,配置為通過(guò)查詢所述程序運(yùn)行時(shí)中所述被調(diào)用函數(shù)的加載信息以確定特定調(diào)用約定。13.根據(jù)權(quán)利要求12的裝置,其中所述調(diào)用約定確定子單元配置為:向所述程序運(yùn)行時(shí)發(fā)出查詢請(qǐng)求,其中包含被調(diào)用函數(shù)的標(biāo)識(shí)信息;響應(yīng)于查詢請(qǐng)求,獲取被調(diào)用函數(shù)的修飾名;基于所述修飾名,確定與被調(diào)用函數(shù)對(duì)應(yīng)的特定調(diào)用約定。14.根據(jù)權(quán)利要求13的裝置,其中所述調(diào)用約定確定子單元配置為:基于所述被調(diào)用函數(shù)的標(biāo)識(shí)信息進(jìn)行名稱解改編,獲得原始函數(shù)名;基于所述原始函數(shù)名獲取被調(diào)用函數(shù)在函數(shù)庫(kù)中的修飾名。15.根據(jù)權(quán)利要求12的裝置,其中所述調(diào)用約定獲取單元還包括記錄子單元,配置為記錄所確定的特定調(diào)用約定,以便再次調(diào)用該被調(diào)用函數(shù)時(shí)直接獲取上述特定調(diào)用約定。16.根據(jù)權(quán)利要求15的裝置,其中所述記錄子單元配置為,記錄所述特定調(diào)用約定對(duì)應(yīng)的索引,并將第一地址修改為第二地址,所述第一地址指向用于查詢所述加載信息的代碼,所述第二地址指向所述多個(gè)代碼模塊中與上述特定調(diào)用約定的索引對(duì)應(yīng)的代碼模塊裝置?!疚臋n編號(hào)】G06F9/44GK103853532SQ201210500365【公開日】2014年6月11日申請(qǐng)日期:2012年11月29日優(yōu)先權(quán)日:2012年11月29日【發(fā)明者】官孝峰,郭久福,蔣健,朱鴻偉申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司