時間:2008-08-06 13:44:00來源:ronggang
圖3 存儲空間關系圖(a)和運行時存儲空間示意圖(b)[/align]
3.4 中間代碼操作數(shù)的定義
Child-C程序被編譯成中間代碼指令被解釋器執(zhí)行,如以下的Child-C語句執(zhí)行相加操作:
int a,b,c; a=b+c;
它被編譯為如下幾條中間代碼指令:
LOD R0 Ox00000010 4; ①—— 加載變量a到寄存器R0,Ox00000010是變量a在運行時堆存儲區(qū)內(nèi)的偏移地址,4表示加載的數(shù)據(jù)為4個字節(jié)
LOD R1 Ox00000014 4; ②—— 加載變量b到寄存器R1
ADD ③—— R1+R0->R2,三個寄存器的意義是固定的
STR R2 Ox00000018 ④— 將寄存器R2的值保存到變量c中
其中指令③的ADD指令是二元操作數(shù)指令,但是它的操作數(shù)固定為R0和R1寄存器,計算結果也固定放到R3中。
3.5 字符串的兼容和特殊處理
C語言中的字符串是通過字符數(shù)組進行處理的,Child-C繼承了這種字符串處理方法。字符數(shù)組是長度固定的字符串,而在使用Child-C與COM組件交互時經(jīng)常要處理COM標準的BSTR類型變長字符串,為了兼容該數(shù)據(jù)類型,在Child-C中增加了bstr類型的變長字符串數(shù)據(jù)類型。bstr由頭尾兩部分組成:頭部信息由head和len兩個32位無符號整形組成,頭部信息代表了字符串實體,它可以作為局部和全局變量存儲,head是一個指針,它指向字符數(shù)據(jù)在全局堆中的首地址,len記錄了字符串的長度。尾部信息保存在全局堆存儲區(qū)中,字符信息在該區(qū)中并不是連續(xù)的,這也適應了字符串長度變化的需要。bstr可以直接代替BSTR類型,中間代碼指令集中有專門的轉換指令COMTOC和CTOCOM進行數(shù)據(jù)轉換。當需要將bstr轉換成BSTR時,編譯器自動添加COMTOC指令,該指令根據(jù)bstr的頭信息讀取字符數(shù)據(jù)組裝成BSTR數(shù)據(jù)提交給COM組件,而CTOCOM是一個逆過程。這兩條指令使用特設的第二組虛擬寄存器進行轉換操作。
3.6 COM組件的訪問
COM對象的訪問需要進行特殊處理,它是在解析運行環(huán)境建立之前就已經(jīng)存在的。如圖3a所示,它存儲在組態(tài)軟件系統(tǒng)的存儲空間中,它不會隨著解釋運行環(huán)境的消亡而消亡。而除此之外的數(shù)據(jù)都存儲在解釋器的存儲空間中,它們會隨著解釋運行環(huán)境的消亡而消亡。為了便于編譯器和解釋器統(tǒng)一存儲空間的處理,需要將COM組件映像到解釋器存儲空間中,圖3b中的COM組件地址映射區(qū)就用來保存COM組件地址的映像。在編譯器和解釋器的運行過程中,所有對COM組件的訪問都被映射到該區(qū)域,從而避免了存儲空間的交叉訪問。
3.7 解釋器環(huán)境中對COM組件方法的調(diào)用
COM組件的各種函數(shù)已經(jīng)被編譯成可被計算機直接執(zhí)行的機器代碼,自動化COM對象允許使用IDispatch接口的統(tǒng)一調(diào)度函數(shù)Invoke()調(diào)用組件的函數(shù),被執(zhí)行的函數(shù)可以當作一個字符串參數(shù)被傳送。因此在構造的中間代碼指令集中有一條INVOKE指令,該指令格式為:INVOKE ComOffset FuncOffset ParaOffset;該指令有三個操作數(shù):ComOffset為要訪問的COM組件在COM組件地址映射區(qū)的偏移,F(xiàn)uncOffset為被調(diào)用函數(shù)的名稱bstr變量地址,ParaOffset是該函數(shù)參數(shù)的個數(shù)和參數(shù)的存儲單元地址,該存儲區(qū)之后是一個4字節(jié)的單元,它用來保存Invoke()函數(shù)執(zhí)行的返回值。就是說,對COM組件的所有操作,解釋器只需通過執(zhí)行Invoke()函數(shù)就能完成。
4 事件體系的構造
Child-C函數(shù)是通過事件觸發(fā)而被調(diào)用的。事件包含兩種類型,一種是組件運行系統(tǒng)定義的事件,該類型事件屬于整個系統(tǒng),它與具體組件無關,但可以被COM組件和系統(tǒng)觸發(fā)。另一種是COM組件自定義的事件,該類型事件屬于COM組件,它只能被組件自身觸發(fā)。事件發(fā)生時觸發(fā)解釋器解釋運行事件的相應函數(shù)。事件的處理工作全部交給事件槽來處理,事件槽實際上是一個可鏈接對象接收器[5],它可以接受系統(tǒng)和COM組件觸發(fā)的事件,同時它還維護了一張事件映射表,該表記錄了所有添加了響應函數(shù)的事件和該事件響應函數(shù)的入口地址以及有關參數(shù)信息。當有事件到達時,首先檢查事件映射表該事件是否有被注冊,如果有則根據(jù)響應函數(shù)的參數(shù)信息分配存儲空間并調(diào)用響應函數(shù)。
5 結束語
在實際的生產(chǎn)應用中可以證明,Child-C完全可以勝任絕大部分流程控制的需要,提高了工控組態(tài)軟件的靈活性。解釋器環(huán)境開發(fā)難度小但是程序執(zhí)行效率低,自動化COM組件的函數(shù)調(diào)度機制可以很好的解決這種矛盾,該機制還可以廣泛地應用于其它領域。
參考文獻:
[1] 李志剛.工控組態(tài)軟件及其在工業(yè)控制中的應用[J].微機算計信息,1998;14(3)
[2] 夏坤,張建國,蔣洪. COM+及其在組態(tài)軟件中的應用研究[J].計算機工程與應用,2002,20.117-119
[3] 王培進.面向對象的柔性設計與控制理論(I)[J].計算機工程與應用,2001;36(16):17-19
[4] 潘愛民.COM原理與應用[M].北京:清華大學出版社,1999.12
[5] KennethCLouden.編譯原理與實踐[M].北京:機械工業(yè)出版社,1998.
[6] 熊清平,張正勇,李作清.CNC系統(tǒng)巨量NC程序解釋實現(xiàn)的方法[J].中國機械工程,1999,10(6):673-675.
標簽:
傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為傳動網(wǎng)(surachana.com)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉載使用時須注明來源“傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。
本網(wǎng)轉載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產(chǎn)品新聞
更多>2025-10-31
2025-10-22
2025-10-17
2025-10-11
2025-10-09
2025-09-23