導航:首頁 > 源碼編譯 > 編譯原理可變參數

編譯原理可變參數

發布時間:2024-06-28 13:02:42

⑴ c/c++鏀鎸佸彲鍙樺弬鏁扮殑鍑芥暟

涓銆佷負浠涔堣佷嬌鐢ㄥ彲鍙樺弬鏁扮殑鍑芥暟錛
銆銆涓鑸鎴戜滑緙栫▼鐨勬椂鍊欙紝鍑芥暟涓褰㈠紡鍙傛暟鐨勬暟鐩閫氬父鏄紜瀹氱殑錛屽湪璋冪敤鏃惰佷緷嬈$粰鍑轟笌褰㈠紡鍙傛暟瀵瑰簲鐨勬墍鏈夊疄闄呭弬鏁般備絾鍦ㄦ煇浜涙儏鍐典笅甯屾湜鍑芥暟鐨勫弬鏁頒釜鏁板彲浠ユ牴鎹闇瑕佺『瀹氾紝鍥犳c璇璦寮曞叆鍙鍙樺弬鏁板嚱鏁般傝繖涔熸槸c鍔熻兘寮哄ぇ鐨勪竴涓鏂歸潰錛屽叾瀹冩煇浜涜璦錛屾瘮濡俧ortran灝辨病鏈夎繖涓鍔熻兘銆
銆銆鍏稿瀷鐨勫彲鍙樺弬鏁板嚱鏁扮殑渚嬪瓙鏈夊ぇ瀹剁啛鎮夌殑printf錛堬級銆乻canf錛堬級絳夈
銆銆浜屻乧/c++濡備綍瀹炵幇鍙鍙樺弬鏁扮殑鍑芥暟錛
銆銆涓轟簡鏀鎸佸彲鍙樺弬鏁板嚱鏁幫紝C璇璦寮曞叆鏂扮殑璋冪敤鍗忚錛 鍗矯璇璦璋冪敤綰﹀畾 __cdecl . 閲囩敤C/C++璇璦緙栫▼鐨勬椂鍊欙紝榛樿や嬌鐢ㄨ繖涓璋冪敤綰﹀畾銆傚傛灉瑕侀噰鐢ㄥ叾瀹冭皟鐢ㄧ害瀹氾紝蹇呴』娣誨姞鍏跺畠鍏抽敭瀛楀0鏄庯紝渚嬪俉IN32 API浣跨敤PASCAL璋冪敤綰﹀畾錛屽嚱鏁板悕瀛椾箣鍓嶅繀欏誨姞__stdcall鍏抽敭瀛椼
銆銆閲囩敤C璋冪敤綰﹀畾鏃訛紝鍑芥暟鐨勫弬鏁版槸浠庡彸鍒板乏鍏ユ爤錛屼釜鏁板彲鍙樸傜敱浜庡嚱鏁頒綋涓嶈兘棰勫厛鐭ラ亾浼犺繘鏉ョ殑鍙傛暟涓鏁幫紝鍥犳ら噰鐢ㄦ湰綰﹀畾鏃跺繀欏葷敱鍑芥暟璋冪敤鑰呰礋璐e爢鏍堟竻鐞嗐備婦涓渚嬪瓙錛
銆銆//C璋冪敤綰﹀畾鍑芥暟
銆銆int __cdecl Add(int a, int b)
銆銆{
銆銆return (a + b);
銆銆}
銆銆鍑芥暟璋冪敤錛
銆銆Add(1, 2);
銆銆//奼囩紪浠g爜鏄錛
銆銆push銆銆銆銆銆2銆銆銆銆銆銆銆;鍙傛暟b鍏ユ爤
銆銆push銆銆銆銆銆1銆銆銆銆銆銆銆;鍙傛暟a鍏ユ爤
銆銆call銆銆銆銆銆@Add銆銆銆銆;璋冪敤鍑芥暟銆傚叾瀹炶繕鏈夌紪璇戝櫒鐢ㄤ簬瀹氫綅鍑芥暟鐨勮〃杈懼紡榪欓噷鎶婂畠鐪佺暐浜
銆銆add銆銆銆銆esp,8銆銆銆銆銆;璋冪敤鑰呰礋璐f竻鏍
銆銆濡傛灉璋冪敤鍑芥暟鐨勬椂鍊欎嬌鐢ㄧ殑璋冪敤鍗忚鍜屽嚱鏁板師鍨嬩腑澹版槑鐨勪笉涓鑷達紝灝變細瀵艱嚧鏍堥敊璇錛岃繖鏄鍙﹀栦竴涓璇濋橈紝榪欓噷涓嶅啀緇嗚淬
銆銆鍙﹀朿/c++緙栬瘧鍣ㄩ噰鐢ㄥ畯鐨勫艦寮忔敮鎸佸彲鍙樺弬鏁板嚱鏁般傝繖浜涘畯鍖呮嫭va_start銆乿a_arg鍜寁a_end絳夈備箣鎵浠ヨ繖涔堝仛錛屾槸涓轟簡澧炲姞紼嬪簭鐨勫彲縐繪嶆с傚睆钄戒笉鍚岀殑紜浠跺鉤鍙伴犳垚鐨勫樊寮傘
銆銆鏀鎸佸彲鍙樺弬鏁板嚱鏁扮殑鎵鏈夊畯閮藉畾涔夊湪stdarg.h 鍜 varargs.h涓銆備緥濡傛爣鍑咥NSI褰㈠紡涓嬶紝榪欎簺瀹忕殑瀹氫箟鏄錛
銆銆typedef char * va_list; //瀛楃︿覆鎸囬拡
銆銆#define _INTSIZEOF(n)銆銆( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
銆銆#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
銆銆#define va_arg(ap,t)銆銆銆( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
銆銆#define va_end(ap)銆銆銆( ap = (va_list)0 )
銆銆浣跨敤瀹廮INTSIZEOF鏄涓轟簡鎸夌収鏁存暟瀛楄妭瀵歸綈鎸囬拡錛屽洜涓篶璋冪敤鍗忚涓嬮潰錛屽弬鏁板叆鏍堥兘鏄鏁存暟瀛楄妭錛堟寚閽堟垨鑰呭礆級銆
銆銆涓夈佸備綍瀹氫箟榪欑被鐨勫嚱鏁般
銆銆鍙鍙樺弬鏁板嚱鏁板湪涓嶅悓鐨勭郴緇熶笅錛岄噰鐢ㄤ笉鍚岀殑褰㈠紡瀹氫箟銆
銆銆1銆佺敤ANSI鏍囧噯褰㈠紡鏃訛紝鍙傛暟涓鏁板彲鍙樼殑鍑芥暟鐨勫師鍨嬪0鏄庢槸錛
銆銆type funcname錛坱ype para1錛 type para2錛 鈥︹︼級錛
銆銆鍏充簬榪欎釜瀹氫箟錛屾湁涓夌偣闇瑕佽存槑錛
銆銆涓鑸鏉ヨ達紝榪欑嶅艦寮忚嚦灝戦渶瑕佷竴涓鏅閫氱殑褰㈠紡鍙傛暟錛屽彲鍙樺弬鏁板氨鏄閫氳繃涓変釜'.'鏉ュ畾涔夌殑銆傛墍浠"鈥︹"涓嶈〃紺虹渷鐣ワ紝鑰屾槸鍑芥暟鍘熷瀷鐨勪竴閮ㄥ垎銆倀ype鏄鍑芥暟榪斿洖鍊煎拰褰㈠紡鍙傛暟鐨勭被鍨嬨
銆銆渚嬪傦細
銆銆int MyPrintf錛坈har const* fmt錛 鈥︹︼級錛
銆銆浣嗘槸錛屾垜浠涔熷彲浠ヨ繖鏍峰畾涔夊嚱鏁幫細
銆銆void MyFunc錛堚︹︼級錛
銆銆浣嗘槸錛岃繖鏍風殑璇濓紝鎴戜滑灝辨棤娉曚嬌鐢ㄥ嚱鏁扮殑鍙傛暟浜嗭紝鍥犱負鏃犳硶閫氳繃涓婇潰鎵璁茬殑瀹忔潵鎻愬彇姣忎釜鍙傛暟銆傛墍浠ラ櫎闈炰綘鐨勫嚱鏁頒唬鐮佷腑鐨勭『娌℃湁鐢ㄥ埌鍙傛暟琛ㄤ腑鐨勪換浣曞弬鏁幫紝鍚﹀垯蹇呴』鍦ㄥ弬鏁拌〃涓浣跨敤鑷沖皯涓涓鏅閫氬弬鏁般
銆銆娉ㄦ剰錛屽彲鍙樺弬鏁板彧鑳戒綅浜庡嚱鏁板弬鏁拌〃鐨勬渶鍚庛備笉鑳借繖鏍鳳細
銆銆void MyFunc錛堚︹︼紝 int i錛夛紱
銆銆2銆侀噰鐢ㄤ笌UNIX 鍏煎圭郴緇熶笅鐨勫0鏄庢柟寮忔椂錛屽弬鏁頒釜鏁板彲鍙樼殑鍑芥暟鍘熷瀷鏄錛
銆銆type funcname錛坴a_alist錛夛紱
銆銆浣嗘槸瑕佹眰鍑芥暟瀹炵幇鐨勬椂鍊欙紝鍑芥暟鍚嶅瓧鍚庨潰蹇呴』鍔犱笂va_dcl.渚嬪傦細
銆銆錛僫 nclude
銆銆int average( va_list );
銆銆void main( void )
銆銆{
銆銆銆傘傘//浠g爜
銆銆}
銆銆/* UNIX鍏煎瑰艦寮*/
銆銆int average( va_alist )
銆銆va_dcl
銆銆{
銆銆銆傘傘//浠g爜
銆銆}
銆銆榪欑嶅艦寮忎笉闇瑕佹彁渚涗換浣曟櫘閫氱殑褰㈠紡鍙傛暟銆倀ype鏄鍑芥暟榪斿洖鍊肩殑綾誨瀷銆倂a_dcl鏄瀵瑰嚱鏁板師鍨嬪0鏄庝腑鍙傛暟va_alist鐨勮︾粏澹版槑錛屽疄闄呮槸涓涓瀹忓畾涔夈傛牴鎹騫沖彴鐨勪笉鍚岋紝va_dcl鐨勫畾涔夌◢鏈変笉鍚屻
銆銆鍦╲arargs.h涓錛寁a_dcl鐨勫畾涔夊悗闈㈠凡緇忓寘鎷浜嗕竴涓鍒嗗彿銆傚洜姝ゅ嚱鏁板疄鐜扮殑鏃跺欙紝va_dcl鍚庝笉鍐嶉渶瑕佸姞涓婂垎鍙蜂簡銆
銆銆3銆侀噰鐢ㄥご鏂囦歡stdarg.h緙栧啓鐨勭▼搴忔槸絎﹀悎ANSI鏍囧噯鐨勶紝鍙浠ュ湪鍚勭嶆搷浣滅郴緇熷拰紜浠朵笂榪愯岋紱鑰岄噰鐢ㄥご鏂囦歡varargs.h鐨勬柟寮忎粎浠呮槸涓轟簡涓庝互鍓嶇殑紼嬪簭鍏煎癸紝涓ょ嶆柟寮忕殑鍩烘湰鍘熺悊鏄涓鑷寸殑錛屽彧鏄鍦ㄨ娉曞艦寮忎笂鏈変竴浜涚粏寰鐨勫尯鍒銆 鎵浠ヤ竴鑸緙栫▼鐨勬椂鍊欎嬌鐢╯tdarg.h.涓嬮潰鐨勬墍鏈変緥瀛愪唬鐮侀兘閲囩敤ANSI鏍囧噯鏍煎紡銆
銆銆鍥涖佸彲鍙樺弬鏁板嚱鏁扮殑鍩烘湰浣跨敤鏂規硶
銆銆涓嬮潰閫氳繃鑻ュ共渚嬪瓙錛岃存槑濡備綍瀹炵幇鍙鍙樺弬鏁板嚱鏁扮殑瀹氫箟鍜岃皟鐢ㄣ
銆銆//================================ 渚嬪瓙紼嬪簭1 ===============
銆銆錛僫 nclude stdio.h >
銆銆錛僫 nclude string.h >
銆銆錛僫 nclude stdarg.h >
銆銆/* 鍑芥暟鍘熷瀷澹版槑錛岃嚦灝戦渶瑕佷竴涓紜瀹氱殑鍙傛暟錛屾敞鎰忔嫭鍙峰唴鐨勭渷鐣ュ彿 */
銆銆int demo( char *, ... );
銆銆void main( void )
銆銆{
銆銆demo( "DEMO", "This", "is", "a", "demo!", "\0");
銆銆}
銆銆int demo( char *msg, ... )
銆銆{
銆銆va_list argp; /* 瀹氫箟淇濆瓨鍑芥暟鍙傛暟鐨勭粨鏋 */
銆銆int argno = 0; /* 綰褰曞弬鏁頒釜鏁 */
銆銆char *para; /* 瀛樻斁鍙栧嚭鐨勫瓧絎︿覆鍙傛暟 */
銆銆// 浣跨敤瀹弙a_start, 浣縜rgp鎸囧悜浼犲叆鐨勭涓涓鍙閫夊弬鏁幫紝
銆銆// 娉ㄦ剰 msg鏄鍙傛暟琛ㄤ腑鏈鍚庝竴涓紜瀹氱殑鍙傛暟錛屽苟闈炲弬鏁拌〃涓絎涓涓鍙傛暟
銆銆va_start( argp, msg );
銆銆while (1)
銆銆{
銆銆//鍙栧嚭褰撳墠鐨勫弬鏁幫紝綾誨瀷涓篶har *
銆銆//濡傛灉涓嶇粰鍑烘g『鐨勭被鍨嬶紝灝嗗緱鍒伴敊璇鐨勫弬鏁
銆銆para = va_arg( argp, char *);
銆銆if ( strcmp( para, "\0") == 0 ) /* 閲囩敤絀轟覆鎸囩ず鍙傛暟杈撳叆緇撴潫 */
銆銆break;
銆銆printf( "鍙傛暟 #%d 鏄: %s\n", argno, para);
銆銆argno++;
銆銆}
銆銆va_end( argp ); /* 灝哸rgp緗涓篘ULL */
銆銆return 0;
銆銆}

編譯原理全部的名詞解釋

書上有別那麼懶!.
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序.解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句.
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序).
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的.):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的.
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法.
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息.如,類型、值、存儲地址等.
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法.
V:屬性的有窮集.每個屬性與文法的一個終結符或非終結符相連.屬性與變數一樣,可以進行計算和傳遞.
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集.斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性.
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性.
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性.
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供.
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞.
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作.
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算.
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式.
2、一般,快速編譯程序直接生成目標代碼.
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現.
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成.
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言.
(2)便於移植,便於修改,便於進行與機器無關的優化.
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄.
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄.主欄的內容稱為關鍵字(key word).
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性.(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式.
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址.
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組.
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定. 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術.
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧.
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間.
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象.如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據).
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄.
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少.
優化原則:等價原則:經過優化後不應改變程序運行的結果.
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小.
合算原則:以盡可能低的代價取得較好的優化效果.
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊.
給我分數啊.

⑶ c語言函數調用規則

_stdcall是Pascal程序的預設調用方式,通常用於Win32 Api中,函數採用從右到左的壓棧方式,自己陸睜在退出時清空堆棧。VC將函數編譯後會在函數名前面加上下劃線前綴,在函數名後加上"@"和參數的位元組數。

_cdecl 按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於傳送參數的內存棧是由調用者來維護的(正因為如此,實現可變參數的函數只能使用該調用約定)是C和C++程序的默認調用約定。__cdecl調用約定僅在輸出函數名前加上一個下劃線棗納前綴,格式為_functionname。

_fastcall方式的函數採用寄存器傳遞參數,VC將函數編譯後會在函數名前面加上"@"前綴,在函數名後加上"@"和參數的位元組數。實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧。__fastcall調用約定在輸出函數名前加上一凳悉沒個「@」符號,後面也是一個「@」符號和其參數的位元組數,格式為@functionname@number。

⑷ int a = 1; printf(a); 鍑虹幇孌甸敊璇錛屼負浠涔堬紵

孌甸敊璇璇寸畝鍗曠偣灝辨槸浣犺塊棶浜嗕笉璇ヨ塊棶鐨勫唴瀛樻
姣斿傛煇涓鍦板潃鏄淇濈暀緇檕s鐨勶紝浣犳槸璁塊棶涓嶄簡鐨
榪欎釜闂棰樺湪浜巔rintf(a)鍦╟涓鐢變簬闅愬紡綾誨瀷杞鎹int->const char*
printf鎶婃暟鍊1褰撲綔浜嗘湰璇ユ槸涓涓瀛楃︿覆鍦板潃鐨勫礆紝32浣嶇郴緇熶笅榪欎釜鍦板潃鏄0x00000001錛屾eソ澶勫湪os淇濈暀鐨勫唴瀛樺尯鍩
浣犵敤c++鏄涓嶄細鍑虹幇榪欐牱鐨勯棶棰樼殑錛宑++鐨勭被鍨嬫鏌ュ湪緙栬瘧鏈熼棿灝變細甯浣犲彂鐜拌繖涓閿欒

⑸ 漢語程序設計語言的編譯原理


漢編系統是一個互動式的程序設計環境,最初是為程序員在小型和微型計算機上開發應用程序而設計的。主要應用於科學計算和工業控制,比如儀器、機器人、過程式控制制、圖形和圖像處理、人工智慧和商業應用。漢編語言的主要優點是軟體開發快速、互動式、計算機硬體的高效使用等。
漢編語言與傳統語言最大的不同是它的可擴展性。漢編語言的編程過程就是定義新的詞,詞實際上就是語言的新命令。詞可以用一系列以前定義的詞來定義,這個過程與教育孩子的過程相似:我們總是用孩子們以前理解的概念來教給孩子們新的概念,而這些詞被稱為「高級定義」。同樣,新的詞也可以用匯編代碼定義。
可擴展性的結果是我們在開發一個應用的同時,也間接地開發了一個特殊的、針對這一類應用的「面向應用的模塊,它可以用於或者經過修改之後被用於相似的應用。
漢編語言的可擴展性並不僅僅是為語言自身增加新的命令,所以不要把定義詞與傳統高級語言定義函數、過程等同。漢編系統還能對定義詞(建詞)進行擴展,創建一個可以定義其它詞的詞,這種詞被稱為「定義詞」。在創建這樣一個定義詞的時候,程序員能夠指定它所創建的詞在編譯時間、運行時間或者這兩種狀態下的特殊行為。這個能力允許我們定義特殊的數據類型,並對其行為和結構實施完全的控制。又由於這種詞的運行時行為可以用高級語言或者匯編語言來定義,所以由定義詞創建的詞將具有與其它漢編詞一樣的性能。系統也允許我們增加一個新的「編譯指示符」以實現特殊類型的循環或者其它的控制結構。比如,漢語言定義一個程序變數的詞:給,其代碼大概如下:
編給(32位數-<變數名>-)編譯時
(---32位數)運行時
建詞可用地址4位元組空出寫
動作讀

定義變數時
5給變數一
則5被自動寫入變數一的實體域中
運行「變數一」時
變數一
則變數一實體域中的數字5被自動讀取,放到數摞上 漢編詞可以使用以前定義的詞或者匯編代碼來定義,它們與其它語言的子程序相似,也與其它語言的命令等效。漢編系統允許我們在鍵盤上打入一條指令的詞名,這個詞將被立即執行。然而,如果我們把功能的詞名放到定義中,將編譯成對於這個詞的引用。
高級詞是由其它詞的集合來定義的,我們可以把這個過程想像成是其它語言的宏。新的詞被加入到它們可以使用的存儲器中,其定義被加入到詞典中。在一個漢編詞的命名規則中,只有很少的幾個字元不能作為詞名使用。
當遇到一個詞的時候,漢編系統就通過詞典搜索希望找到這個詞的定義,如果找到這個詞定義的功能,或者被立即執行,或者作為引用而被編譯到新的定義中。然而,如果在詞典中沒有找到這個詞,系統就試著把它轉換成一個數。如果轉換成功,就把它放在數摞上。如果不能轉換成數字,就顯示這個未定義的詞名並列印出一個錯誤的信息來報告這個詞是系統所不知道的。
漢編詞的執行流程大概可以用一個詞來模擬如下:

編查詞測試
{詞名串--}
255個位元組空給詞名串
詞名串255填0
詞名串字串傳送
詞名串(查詞)
0=

計位元組
串>數


否則
字串未定義詞名串字串+傳送
詞名串計位元組
回車印字串
全復位
然後
否則
執行
然後
。★
字串看數摞查詞測試數摞已空!★
字串123456查詞測試★.
看數摞[1]123456★.
顯123456★
字串看方法查詞測試
看方法未定義
漢編系統編譯流程如右圖(流程圖來源:漢編新浪博客)所示。
漢編語言堅持「結構化程序設計」原理:
·詞必須在引用之前被定義;
·邏輯流限制只有順序、條件和循環,有專門的詞用於實現常用的程序控制結構;
·程序員使用許多小的、獨立的模塊(詞)來實現最大的可測試性和可靠性;
這種方法有兩個明顯的優點
·新的詞總是用以前定義和測試過的詞來構造,所以調試更容易。模塊可以單獨執行以測試它的功能;
·固有的模塊性使漢編語言成為一個「設計性語言」,允許自頂向下的設計同時保持自底向上的測試。一個詞可以在不同的程序中使用,但是它的功能只需要定義一次;
這些都保證了漢編軟體能夠快速和有效地被開發,同時,如果管理得當,也可以作為自身文檔的基礎。
漢編語言的5個主要元素決定了它的特點:
·一個詞典;
·兩個數摞,一個是參數摞,另一個是用於嵌套的返回摞;
·鍵盤(輸入流)解釋器;
·一個編譯器;
·虛擬存儲; 詞典是漢編定義詞的數據和代碼存儲空間,也為編譯建立了詞的索引。詞典中的詞包括漢編程序代碼詞、常數定義詞、變數定義詞、不定量定義詞,面向對象部分還有模板、對象、對象事件、消息。
漢編代碼存儲在詞典中。詞典占據了系統存儲器的很大部分,它由一個串線鏈接的可變長度的項目組成,每個項目定義了一個詞。每個定義的內容根據詞的類型(數據項、常數、操作序列等)而有所不同,詞典是可擴展的。
詞是由「定義詞」加入詞典的,最常用的定義詞是「編。」當「編」執行的時候,馬上就把後面的詞名掃描,建立一個詞典項,然後進入「編譯」模式。有許多不同的編譯方法,最常用的是「串線編碼」,這種方法把定義編譯成一系列以前定義詞的地址引用。詞的定義由「。」(句號)結束。下面就是一個詞的定義:
編平方(--)♂*顯。

當一個詞名項被編譯到詞典中的時候(稱為定義的首部),它包含一個指向詞典中前一個首部的指針。新詞的詞名加入詞典(這里就是平方),接著一個指向詞名為「(編)」子程序調用的指針編譯到詞典中作為定義的第一部分,這個指針指向一段在解釋定義體時需要執行的代碼。當然,這里所說的不是唯一的編譯技術,但它的應用最為普遍,這種技術稱為間接串線編碼,因為定義中的第一個項目是一段代碼的引用,這段代碼知道如何解釋定義的其它部分。
定義的其它部分稱為這個定義的體。在編譯模式下,系統將依次尋找每個詞的首部。每個首部地址依次放到定義體中,這樣就產生了一個地址列表。最後在到達「。」時,詞名為「。」的子程序地址被編譯進詞典。「。」子程序用來將控制返回到調用詞,就像一個子程序返回一樣。

閱讀全文

與編譯原理可變參數相關的資料

熱點內容
電腦一鍵解壓縮的軟體 瀏覽:169
怎麼關閉手機通訊錄對外app 瀏覽:370
我的世界如何強行進入一個滿人的伺服器 瀏覽:653
什麼app可以查詢會考成績 瀏覽:389
程序員能創造的價值 瀏覽:259
伺服器上的redis是什麼意思 瀏覽:379
軟體產品經理與程序員 瀏覽:922
高中生程序員 瀏覽:892
ps處理pdf 瀏覽:723
伺服器c1什麼意思 瀏覽:222
哈爾濱手機什麼app拍違章有獎勵 瀏覽:477
盜賊用什麼app最好 瀏覽:902
51單片機如何測量電導率 瀏覽:500
移動花卡怎麼使用app流量 瀏覽:555
個稅演算法2021表格公式解讀 瀏覽:174
怎麼進入電腦板2b2t伺服器 瀏覽:284
idea編譯進度條 瀏覽:134
文件夾工具箱軟體 瀏覽:688
最近為什麼手機連不上索尼伺服器 瀏覽:877
海康錄像機怎麼關視頻加密 瀏覽:788