本發(fā)明涉及計算機軟件編程技術領域,尤其涉及一種代碼調試方法及裝置。
背景技術:
IronPython是Python語言的.NET實現(xiàn)。有了IronPython,.NET開發(fā)人員可以在自己的軟件產(chǎn)品中通過集成IronPython向用戶提供Python代碼的運行功能,對于某些業(yè)務功能需要用戶自己通過Python代碼定制的場景,IronPython的出現(xiàn)可謂是給.NET開發(fā)人員提供了強有力的技術支撐。
但是,.NET開發(fā)人員在自己的軟件產(chǎn)品中通過集成IronPython向用戶提供Python代碼的運行功能會遇到一個問題:用戶編寫完處理具體業(yè)務的Python代碼提交到軟件中運行的時候可能會因編寫的Python代碼錯誤導致用戶預期的業(yè)務功能無法實現(xiàn),此時用戶需要查找自己編寫的Python代碼中的錯誤并修正它。用戶通過檢查Python代碼發(fā)現(xiàn)代碼中幾個關鍵位置存在的疑點,希望Python代碼的幾個存在疑點的關鍵位置能夠在執(zhí)行的時候暫停以方便用戶分析錯誤,從而解決代碼存在的問題。在傳統(tǒng)方案中,如果用戶編寫的Python代碼存在錯誤,一般是用戶自己通過在代碼關鍵位置插入彈框代碼來實現(xiàn)代碼運行到關鍵位置時的暫停效果,然后用戶再分析代碼及代碼的運行效果來判斷代碼錯誤的位置及原因。
然而,使用向Python代碼關鍵位置插入彈框代碼的方式雖然也可以讓Python代碼在關鍵位置執(zhí)行的時候暫停下來,但是這種做法仍然存在一個問題:當用戶向Python代碼關鍵位置插入了彈框代碼,Python代碼運行到插入了彈框代碼的關鍵位置處暫停下來之后,如果用戶通過分析代碼行為認為代碼關鍵位置后面的某個位置也存在疑點,想在執(zhí)行到后面的某個位置也能暫停下來的時候,使用傳統(tǒng)的向代碼插入彈框代碼來實現(xiàn)代碼運行暫停效果方案只能讓已運行的Python代碼先停止運行,然后用戶手動修改 代碼向新發(fā)現(xiàn)的可疑位置插入彈框代碼然后再重新運行修改后的Python代碼等待代碼運行到可疑位置處暫停。這種做法對于用戶操作極其不便,需要用戶頻繁的修改Python代碼、停止代碼運行、重新讓代碼運行、等待代碼運行暫停。
技術實現(xiàn)要素:
有鑒于此,本發(fā)明提供一種代碼調試方法及裝置,主要目的在于簡化Python代碼的調試過程,通過在調試過程中實時調整代碼中的斷點位置來快速確定問題代碼的位置,從而提升Python代碼的調試效率。
為達到上述目的,本發(fā)明主要提供如下技術方案:
一方面,本發(fā)明提供了一種代碼調試方法,該方法包括:
獲取用戶在代碼中設置的斷點行號,得到斷點集合;
根據(jù)所述代碼執(zhí)行的當前行號,判斷所述當前行號是否在所述斷點集合中;
若存在,則執(zhí)行中斷事件函數(shù),以中斷所述代碼的執(zhí)行。
另一方面,本發(fā)明還提供了一種代碼調試裝置,該裝置包括:
獲取單元,用于獲取用戶在代碼中設置的斷點行號,得到斷點集合;
判斷單元,用于根據(jù)所述代碼執(zhí)行的當前行號,判斷所述當前行號是否在所述獲取單元得到的斷點集合中;
執(zhí)行單元,用于當所述判斷單元判斷所述當前行號為所述斷點行號時,執(zhí)行中斷事件函數(shù),以中斷所述代碼的執(zhí)行。
依據(jù)上述本發(fā)明所提出的代碼調試方法及裝置,只需要用戶確定需要暫停調試的代碼行位置,代碼程序在執(zhí)行時就能夠自動的識別出用戶所選擇的暫停位置,并將代碼程序停止在該位置上,等待用戶的下一步指示,在接收到用戶取消暫停的指令后,恢復代碼程序的執(zhí)行,直至運行至下一個調試斷點代碼行。由于本發(fā)明所采用的方法是實時地更新斷點集合中的斷點行號,因此,能夠在代碼程序的執(zhí)行過程中隨時的添加或刪除用戶所需的斷點,為代碼程序的調試提供了更加靈活的調試方式。相對于現(xiàn)有的代碼程序調試方式,本發(fā)明不需要用戶進行頻繁的修改代碼,設置插入彈 框來暫停代碼程序的執(zhí)行,而是由用戶在代碼的調試過程中動態(tài)的選擇需要暫停的位置,并在用戶的控制下恢復代碼的運行狀態(tài)。因此,本發(fā)明所采用的代碼調試方法及裝置能夠更快速的確定問題代碼的位置,從而提升Python代碼的調試效率。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了本發(fā)明實施例提出的一種代碼調試方法的流程圖;
圖2示出了本發(fā)明實施例提出的另一種代碼調試方法的流程圖;
圖3示出了本發(fā)明實施例提出的一種代碼調試裝置的組成框圖;
圖4示出了本發(fā)明實施例提出的另一種代碼調試裝置的組成框圖。
具體實施方式
下面將參照附圖更詳細地描述本發(fā)明的示例性實施例。雖然附圖中顯示了本發(fā)明的示例性實施例,然而應當理解,可以以各種形式實現(xiàn)本發(fā)明而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本發(fā)明,并且能夠將本發(fā)明的范圍完整的傳達給本領域的技術人員。
本發(fā)明實施例提供了一種代碼調試的方法,如圖1所示,該方法應用于中斷停代碼執(zhí)行的代碼調試過程,具體步驟包括:
101、獲取用戶在代碼中設置的斷點行號,得到斷點集合。
針對現(xiàn)有的調試方式的不足,本發(fā)明實施例通過獲取用戶設置的斷點位置來確定代碼在執(zhí)行時需要暫停的代碼行,并將這些代碼行號組成斷點集合。對于用戶設置的斷點位置,是由用戶通過鼠標或者是通過觸屏在代碼編輯器中選擇代碼中需要暫停的位置,該位置可以是一個,也可以為多個。并且,用戶在選擇斷點位置時,對于代碼的當前狀態(tài)沒有限定,可以 是在執(zhí)行前,提前確定所有斷點的位置,也可以是在代碼的執(zhí)行過程中,實時地確定斷點的位置。需要說明的是,在代碼執(zhí)行過程中,用戶只能設置在當前執(zhí)行行號之后的代碼行行號為斷點位置。
不僅如此,用戶在設置斷點位置的過程中,還包括對代碼中增加斷點和刪除已有斷點兩種設置,增加斷點如上所述,可以在代碼中的任意位置設置斷點,而刪除斷點則是在當前標有斷點的代碼中再次選擇標有斷點的代碼行來取消在該代碼行的中斷標記。
斷點集合中記錄了針對該代碼的所有用戶標記中斷的代碼行號,并且該集合中的斷點行號是實時更新的。根據(jù)用戶的選擇,集合會對其中的斷點行號時刻更新,增加新的斷點或刪除已有的斷點。
102、根據(jù)代碼執(zhí)行的當前行號,判斷該行號是否在斷點集合中。
在創(chuàng)建了斷點集合后,在進行代碼調試時,該代碼在每執(zhí)行一行代碼時,都會將該代碼行的行號與斷點集合中的斷點行號進行比對,以判斷該行代碼在執(zhí)行后是否需要暫停。對于代碼在執(zhí)行過程中獲取代碼執(zhí)行的當前行號的方式本實施例不做具體限定,較簡單的方式是在每一行原代碼后增加一句調用中斷事件函數(shù)代碼,通過在該調用函數(shù)中內置計數(shù)器來統(tǒng)計代碼執(zhí)行的行數(shù),將計數(shù)器的初始值設置為1,每調用一次該函數(shù)就在該計數(shù)器中加1,通過讀取計算器的值就可確定代碼執(zhí)行的當前行號。
在確定了代碼執(zhí)行的當前行號后,將該當前行號帶入到斷點集合中遍歷進行匹配,如果該行號存在與該集合中,就執(zhí)行該中斷事件函數(shù),將代碼的執(zhí)行狀態(tài)暫停在當前行;而如果該行號不存在與該集合中,就跳過該中斷事件函數(shù)繼續(xù)執(zhí)行代碼的下一行。
103、若當前行號為斷點行號,則執(zhí)行中斷事件函數(shù)。
當確定代碼的當前行號為斷點行號后,代碼程序將執(zhí)行所調用的中斷事件函數(shù),將代碼的執(zhí)行狀態(tài)暫停在當前行。該中斷事件函數(shù)的具體實現(xiàn)方式可以是一個有條件的循環(huán)函數(shù),也可以是一個腳本函數(shù),通過編輯腳本來實現(xiàn)暫停狀態(tài),本實施例對于該函數(shù)的表現(xiàn)方式不做具體限定。
需要說明的是,代碼在執(zhí)行過程中暫停運行的目的在于可以讓調試人員能夠對已執(zhí)行的程序所得到的結果進行判斷,查看執(zhí)行的代碼中是否按 照預計的結果在執(zhí)行,如果有問題,則可以退出執(zhí)行進行代碼的修改,在修改后繼續(xù)調試;而如果沒有問題,則應該可以恢復代碼程序的執(zhí)行,繼續(xù)調試后面的代碼。而要恢復代碼的執(zhí)行狀態(tài)就需要跳出正在運行中的中斷事件函數(shù),根據(jù)上述的中斷事件函數(shù)實現(xiàn)方式,可以由用戶在中斷事件函數(shù)中給出停止運行的指令,來跳出循環(huán)函數(shù)的循環(huán)執(zhí)行過程或跳出腳本函數(shù)的暫停狀態(tài)。從而恢復代碼的執(zhí)行狀態(tài)。
結合上述的實現(xiàn)方式可以看出,本發(fā)明實施例所采用的代碼調試方法,只需要用戶確定需要暫停調試的代碼行位置,代碼程序在執(zhí)行時就能夠自動的識別出用戶所選擇的暫停位置,并將代碼程序停止在該位置上,等待用戶的下一步指示,在接收到用戶取消暫停的指令后,恢復代碼程序的執(zhí)行,直至運行至下一個調試斷點代碼行。由于本發(fā)明實施例所采用的方法是實時地更新斷點集合中的斷點行號,因此,能夠在代碼程序的執(zhí)行過程中隨時的添加或刪除用戶所需的斷點,為代碼程序的調試提供了更加靈活的調試方式。相對于現(xiàn)有的代碼程序調試方式,本發(fā)明實施例不需要用戶進行頻繁的修改代碼,設置插入彈框來暫停代碼程序的執(zhí)行,而是由用戶在代碼的調試過程中動態(tài)的選擇需要暫停的位置,并在用戶的控制下恢復代碼的運行狀態(tài)。因此,本發(fā)明實施例所采用的代碼調試方法能夠更快速的確定問題代碼的位置,從而提升Python代碼的調試效率。
為了更加詳細地說明本發(fā)明提出的一種代碼調試方法,本發(fā)明實施例以使用Python語言編輯代碼程序,利用C#語言創(chuàng)建斷點集合以及上述的中斷事件函數(shù)為例進行具體說明,如圖2所示,該方法在對代碼調試時所包括步驟為:
201、獲取用戶在Python代碼中設置的斷點行號,得到斷點集合。
斷點行號的設置方式有兩種:一種是在調試Python代碼前選擇好需要中斷位置的行號,另一種是在調試過程中,在代碼執(zhí)行當前行的后面選擇需要中斷位置的行號。在具體操作上,可以是用戶通過鼠標左鍵在Python代碼中的行號位置進行點擊來設置斷點,該斷點的選擇可以是一個或多個,例如,一個100行的Python代碼,用戶可以在代碼編輯器中使用鼠標左鍵點擊第30、60、90行代碼,則該代碼中的第30、60、90行的行號就被確 定為斷點行,代碼在執(zhí)行到該行時會暫定執(zhí)行。
此外,這些斷點行號還會被添加到由C#語言創(chuàng)建的斷點集合中。該集合是一個整型數(shù)據(jù)的集合,記錄有代碼的行號。將用戶選擇的代碼行號添加到斷點集合中還存在兩種情況:一種是斷點集合中沒有該行號,則可以將該行號直接加入集合中,這種定義為斷點行號的添加操作;另一種是斷點集合中已經(jīng)存在該行號,則將該行號從斷點集合中清除掉,這種定義為斷點行號的刪除操作。
202、根據(jù)Python代碼執(zhí)行的當前行號,判斷該行號是否在斷點集合中。
要判斷代碼的執(zhí)行行號是否為斷點行號,還需要進行一系列的前期設置。其中,除了上述的獲取斷點集合外,還需要在調試之前再創(chuàng)建一個C#腳本調試類的實例scriptDebug,并且給該實例的腳本運行中斷事件添加事件處理函數(shù)ScriptBreak,其中,C#腳本調試類scriptDebug的代碼如下:
之后創(chuàng)建該類的實例scriptDebug,并定義一個C#函數(shù)ScriptBreak,將實例scriptDebug的腳本運行中斷事件處理函數(shù)設置為ScriptBreak,其代碼如下:
scriptDebug.ExecuteBreak=ScriptBreak
如此,當實例scriptDebug被調用時,就會調用C#函數(shù)ScriptBreak。
之后,在原Python代碼的每一行代碼后添加代碼“scriptDebug.Break()”,從而在Python代碼在每運行一行時都會執(zhí)行所添加的“scriptDebug.Break()”代碼,進而調用上述的C#函數(shù)ScriptBreak,以實現(xiàn)Python代碼的中斷機制。
此外,除了上述的設置還需要在C#函數(shù)ScriptBreak內部定義一個靜態(tài) 局部變量currentLine=1,代表正在運行的Python代碼行號,初始值為1。由于該Python代碼的每行代碼后面都被添加了代碼“scirptDebug.Break()”,所以Python代碼每執(zhí)行一行,C#函數(shù)ScriptBreak都會被調用一次,每次ScriptBreak被調用時記錄Python代碼執(zhí)行行號的變量currentLine值都會增加1。因此,Python代碼執(zhí)行的當前行號就是變量currentLine的值,要判斷當前行號是否在斷點集合中,只需要遍歷斷點集合中的是否有變量currentLine的值。
203、利用IronPython作用域接口將中斷事件函數(shù)添加到Python代碼的作用域中。
由于scriptDebug是C#實例,如果要在IronPython中調用該scriptDebug的方法Break,則需要將C#實例scriptDebug通過IronPython作用域接口SetVariable(name,value)添加到Python代碼運行的作用域中。
204、若當前行號為斷點行號,則執(zhí)行中斷事件函數(shù)。
當正在運行的Python代碼行號存在于由C#創(chuàng)建的斷點集合中時,就說明Python代碼運行到了斷點位置,需要暫停Python代碼的運行,即行中斷事件函數(shù)ScriptBreak。因為Python代碼是在IronPython對象中執(zhí)行的,而IronPython對象在C#程序的當前線程中運行,所以只需編寫阻塞C#當前線程運行的代碼讓其運行即可,相關代碼如下:
while(!continue)
{
}
上述代碼中變量continue初始值為false,所以循環(huán)while會一直執(zhí)行下去,這樣C#當前線程便被阻塞了,相應的運行在當前C#線程中的IronPython對象中的Python代碼的運行也將被暫停。
205、根據(jù)用戶的指令終止中斷事件函數(shù)的運行,恢復Python代碼的執(zhí)行。
當需要繼續(xù)執(zhí)行暫停中的Python代碼時,只需要將C#函數(shù)內的變量continue值設置為true,則while(!continue){}循環(huán)條件便不再成立,循環(huán)會退出,這樣C#當前線程將解除阻塞,運行在C#當前線程中的IronPython 對象中的Python代碼便可以繼續(xù)運行。
進一步的,作為對上述方法的實現(xiàn),本發(fā)明實施例提供了一種代碼調試裝置,該裝置實施例與前述方法實施例對應,為便于閱讀,本裝置實施例不再對前述方法實施例中的細節(jié)內容進行逐一贅述,但應當明確,本實施例中的裝置能夠對應實現(xiàn)前述方法實施例中的全部內容。該裝置可設置在帶有調試功能的代碼編輯器中,如圖3所示,該裝置包括:
獲取單元31,用于獲取用戶在代碼中設置的斷點行號,得到斷點集合;
判斷單元32,用于根據(jù)所述代碼執(zhí)行的當前行號,判斷所述當前行號是否在所述獲取單元31得到的斷點集合中;
執(zhí)行單元33,用于當所述判斷單元32判斷所述當前行號為所述斷點行號時,執(zhí)行中斷事件函數(shù),以中斷所述代碼的執(zhí)行。
進一步的,如圖4所示,所述獲取單元31包括:
創(chuàng)建模塊311,用于創(chuàng)建斷點集合,所述斷點集合中記錄有用戶在代碼中設置的斷點行號;
獲取模塊312,用于獲取用戶選擇設置斷點位置所在的代碼行號;
添加模塊313,用于將所述獲取模塊312獲取的代碼行號添加到所述創(chuàng)建模塊311創(chuàng)建的斷點集合中;
刪除模塊314,用于當所述獲取模塊312所獲取的代碼行號已存在于所述斷點集合中時,在所述創(chuàng)建模塊311創(chuàng)建的斷點集合中刪除所述代碼行號。
進一步的,如圖4所示,所述判斷單元32包括:
調用模塊321,用于根據(jù)在所述代碼每一行之后添加的中斷代碼調用所述中斷代碼中的中斷事件函數(shù);
判斷模塊322,用于在執(zhí)行所述調用模塊321調用的中斷事件函數(shù)時,判斷所述代碼執(zhí)行的當前行號是否在所述斷點集合中。
進一步的,所述判斷模塊322還包括:
設置子模塊,用于設置行號計數(shù)器,設置初始值為1;
計算子所述,用于在所述代碼執(zhí)行時,每調用一次所述中斷事件函數(shù),則為所述設置子模塊設置的計數(shù)器的值加1,得到所述代碼執(zhí)行的當前行 號;
判斷子模塊,用于遍歷所述斷點集合中的斷點行號,判斷所述計算模塊得到的當前行號是否為斷點行號。
進一步的,如圖4所示,所述執(zhí)行單元33包括:
第一執(zhí)行模塊331,用于當所述代碼調用所述創(chuàng)建模塊331設置的中斷事件函數(shù),且所述代碼執(zhí)行的當前行號為斷點行號時,執(zhí)行所述中斷事件函數(shù);
第二執(zhí)行模塊332,用于根據(jù)所述第一執(zhí)行模塊331執(zhí)行的中斷事件函數(shù)所調用的調試中斷腳本,執(zhí)行所述調試中斷腳本,以中斷所述代碼的繼續(xù)執(zhí)行。
進一步的,如圖4所示,所述裝置還包括:
終止單元34,用于根據(jù)用戶的指令終止所述執(zhí)行單元33所執(zhí)行的中斷事件函數(shù)的運行,恢復所述代碼的執(zhí)行。
進一步的,如圖4所示,所述終止單元34包括:
獲取模塊341,用于獲取用戶的終止指令;
停止模塊342,用于根據(jù)所述獲取模塊獲取的終止指令停止所述中斷事件函數(shù)的運行,以便所述代碼繼續(xù)執(zhí)行。
進一步的,所述裝置使用Python代碼編輯所述代碼,使用C#函數(shù)編輯所述中斷事件函數(shù)。
進一步的,如圖4所示,所述裝置還包括:
添加單元35,用于在執(zhí)行中斷事件函數(shù)之前,利用IronPython作用域接口將所述中斷事件函數(shù)添加到所述代碼的作用域中,所述作用域用于確定函數(shù)名在所述代碼中的作用范圍。
綜上所述,本發(fā)明實施例所采用的代碼調試方法及裝置,只需要用戶確定需要暫停調試的代碼行位置,代碼程序在執(zhí)行時就能夠自動的識別出用戶所選擇的暫停位置,并將代碼程序停止在該位置上,等待用戶的下一步指示,在接收到用戶取消暫停的指令后,恢復代碼程序的執(zhí)行,直至運行至下一個調試斷點代碼行。由于本發(fā)明實施例所采用的方法是實時地更新斷點集合中的斷點行號,因此,能夠在代碼程序的執(zhí)行過程中隨時的添 加或刪除用戶所需的斷點,為代碼程序的調試提供了更加靈活的調試方式。相對于現(xiàn)有的代碼程序調試方式,本發(fā)明實施例不需要用戶進行頻繁的修改代碼,設置插入彈框來暫停代碼程序的執(zhí)行,而是由用戶在代碼的調試過程中動態(tài)的選擇需要暫停的位置,并在用戶的控制下恢復代碼的運行狀態(tài)。因此,本發(fā)明實施例所采用的代碼調試方法及裝置能夠更快速的確定問題代碼的位置,從而提升Python代碼的調試效率。
所述代碼調試裝置包括處理器和存儲器,上述獲取單元、判斷單元、執(zhí)行單元和終止單元等均作為程序單元存儲在存儲器中,由處理器執(zhí)行存儲在存儲器中的上述程序單元來實現(xiàn)相應的功能。
處理器中包含內核,由內核去存儲器中調取相應的程序單元。內核可以設置一個或以上,通過調整內核參數(shù)來簡化Python代碼的調試過程,通過在調試過程中實時調整代碼中的斷點位置來快速確定問題代碼的位置,從而提升Python代碼的調試效率。
存儲器可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM),存儲器包括至少一個存儲芯片。
本申請還提供了一種計算機程序產(chǎn)品,當在數(shù)據(jù)處理設備上執(zhí)行時,適于執(zhí)行初始化有如下方法步驟的程序代碼:獲取用戶在代碼中設置的斷點行號,得到斷點集合;根據(jù)所述代碼執(zhí)行的當前行號,判斷所述當前行號是否在所述斷點集合中;若存在,則執(zhí)行中斷事件函數(shù),以中斷所述代碼的執(zhí)行;根據(jù)用戶的指令終止所述中斷事件函數(shù)的運行,恢復所述代碼的執(zhí)行。
本領域內的技術人員應明白,本申請的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例、或結合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。
本申請是參照根據(jù)本申請實施例的方法、設備(系統(tǒng))、和計算機程序 產(chǎn)品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合。可提供這些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡接口和內存。
存儲器可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。存儲器是計算機可讀介質的示例。
計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結構、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質的例子包括,但不限于相變內存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內存技術、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質, 可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括暫存電腦可讀媒體(transitory media),如調制的數(shù)據(jù)信號和載波。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括要素的過程、方法、商品或者設備中還存在另外的相同要素。
本領域技術人員應明白,本申請的實施例可提供為方法、系統(tǒng)或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。
以上僅為本申請的實施例而已,并不用于限制本申請。對于本領域技術人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內所作的任何修改、等同替換、改進等,均應包含在本申請的權利要求范圍之內。