导航:首页 > 源码编译 > 编译原理可变参数

编译原理可变参数

发布时间: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个主要元素决定了它的特点:
·一个词典;
·两个数摞,一个是参数摞,另一个是用于嵌套的返回摞;
·键盘(输入流)解释器;
·一个编译器;
·虚拟存储; 词典是汉编定义词的数据和代码存储空间,也为编译建立了词的索引。词典中的词包括汉编程序代码词、常数定义词、变量定义词、不定量定义词,面向对象部分还有模板、对象、对象事件、消息。
汉编代码存储在词典中。词典占据了系统存储器的很大部分,它由一个串线链接的可变长度的项目组成,每个项目定义了一个词。每个定义的内容根据词的类型(数据项、常数、操作序列等)而有所不同,词典是可扩展的。
词是由“定义词”加入词典的,最常用的定义词是“编。”当“编”执行的时候,马上就把后面的词名扫描,建立一个词典项,然后进入“编译”模式。有许多不同的编译方法,最常用的是“串线编码”,这种方法把定义编译成一系列以前定义词的地址引用。词的定义由“。”(句号)结束。下面就是一个词的定义:
编平方(--)♂*显。

当一个词名项被编译到词典中的时候(称为定义的首部),它包含一个指向词典中前一个首部的指针。新词的词名加入词典(这里就是平方),接着一个指向词名为“(编)”子程序调用的指针编译到词典中作为定义的第一部分,这个指针指向一段在解释定义体时需要执行的代码。当然,这里所说的不是唯一的编译技术,但它的应用最为普遍,这种技术称为间接串线编码,因为定义中的第一个项目是一段代码的引用,这段代码知道如何解释定义的其它部分。
定义的其它部分称为这个定义的体。在编译模式下,系统将依次寻找每个词的首部。每个首部地址依次放到定义体中,这样就产生了一个地址列表。最后在到达“。”时,词名为“。”的子程序地址被编译进词典。“。”子程序用来将控制返回到调用词,就像一个子程序返回一样。

阅读全文

与编译原理可变参数相关的资料

热点内容
phpredis事务 浏览:935
阴阳师pad怎么登录安卓账号 浏览:734
bitlocker加密后读取不了 浏览:176
算法设计是指流程图吗 浏览:168
javaboot如何防止反编译 浏览:118
python复合数据结构视频 浏览:146
培训学校需要用什么云服务器 浏览:721
卫星锅加密卡那里收购 浏览:58
小米工具文件夹选项在哪里 浏览:55
md5磁盘加密 浏览:642
单片机x地址 浏览:208
回车键失灵运行命令如何使用 浏览:984
电脑一键解压缩的软件 浏览:171
怎么关闭手机通讯录对外app 浏览:370
我的世界如何强行进入一个满人的服务器 浏览:653
什么app可以查询会考成绩 浏览:389
程序员能创造的价值 浏览:260
服务器上的redis是什么意思 浏览:381
软件产品经理与程序员 浏览:923
高中生程序员 浏览:893