您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > forth系统入门指导手册0-11(告一段落)
forth系统入门指导手册0-11(告一段落).txt24生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如山,宽容为径,循径登山,方知山之高大;生活如歌,宽容是曲,和曲而歌,方知歌之动听。第0章前言这是一本游戏手册,是的,你没听错,因为forth不能给你带来显而易见的实际利益,几乎没什么公司会招聘一个forth程序员,因为forth太冷门了,所以你只能把它当成一个游戏来玩。在推销一件东西的时候,吹嘘它的优点是必须的,虽然对forth吹得天花乱坠的溢美词很多,但是冷门还是冷门,所以我也懒得吹了。简单说说它的优缺点吧优点:可以迅速适应不同的CPU(可移植性好),结构小巧紧凑,模块化优秀,可以自制语法,足够自由。缺点:与主流语言差异很大,太过自由,过于个性化,只有一个基本的统一标准,对程序员自身思维水平的要求比较高,没有足够的函数库,需要重新发明轮子,使用者稀少,趋近消亡。本文的目标是让那些有一定编程经验、对forth感兴趣、但是对forth和汇编毫无概念的业余爱好者也能看得懂。这里是forth所有版本的编译器,本文主要是以eforth为例,理由是够简陋。我会把我反复咀嚼过的东西再吐出来喂给你们吃的,哇哈哈哈哈哈!第1章简单的语法还记得以前我们是怎样学英文的吗?现在来回顾一下吧heisaboldmanhe:他is:是a:一个bold:man:人我不认得bold这个单词,怎么办?聪明好学的同学提供了一个方法,查字典。OK,那就查吧。bold:大胆的好了,现在我知道怎么翻译了,他就是一个胆儿肥的人。以后再遇到不懂的单词,我就知道该去查字典了。英文是这样,中文也是这样,碰到不懂的字,我们就会去查字典,弄清这个句子里所有的字是什么意思的时候,我们也就完全明白这个句子是什么意思了。让我们继续翻译heisasdfmansdf:胆大的;是bold的同义词“sdf???你瞎编的吧?”没错,就是瞎编的,而且我还成功忽悠了刚刚学英语的小朋友,这让我很有成就感!但是大朋友们就不那么好忽悠了,他们会用怀疑的目光看着我,然后转过头去翻字典,这让我很没成就感!为了将忽悠进行到底,我决定贿赂该字典的出版社,让他们把我瞎编的词收录到他们的字典里,然后自掏腰包出版新字典。这样一来,当大朋友们在字典上查不到sdf时,我会告诉他们说,他们用的是过了期的字典,然后递给他们一本我自费出版的新字典,再然后。。。他们全信了!这让我的虚荣心得到了极大的满足,哈哈哈哈哈!现在,我可以在跟别人沟通交流时毫无障碍的使用sdf这个流行词了。以上所说的就是forth里最基本的内容:字,字典,造字。forth里有几十个最基本的字,它们被人称作code字、核心字、原语、一级字等等等等。下一个阶层的字则是由这些最基本的字或本阶层的字组合而成,被称作colon字、扩展字、冒号字、二级字等等等等。拿上面的英文句子举个例子:输入::he.他;:is.是;:a.一个;:bold.胆大的;:sdfbold;:man.人;heisasdfman屏幕显示:他是一个胆大的人需要说明的一点就是:bold必须在:sdf之前,否则forth会告诉你没有sdf这个字。forth的语法就是按顺序执行每一个字,碰到字典里没有的字的时候,就给出提示,并终止运行,这语法够简单吧?:(冒号)是一个用来定义一个新字的字,;(分号)是一个表示语句结束的字,.是一个用于输出字符串的字,与输出内容用空格隔开。在forth里面,“有且只有”字,这保证了forth整体上的统一性。如果还要再算上一个,那就是空格,它是使用频率最高的符号,用于区分字与字。有人要问了,为什么要把冒号放在顶头,这不是完全违反了人类的语法习惯?我的回答是,forth这种反人类反社会的语法不是专门给人看的,是给机器看的,但是人也能看懂。就像听老外说中国话,虽然他时不时的反一下人类,但你也能听懂他说的是什么意思。另一个反人类的语法1+2=?如果你这样询问forth,它会告诉你没有“1+2=?”这个字。那么应该怎么问呢?是这样的,问它“12+.”(“.”是输出十进制数值),然后它会告诉你“3”,再然后你又该骂它反人类反社会了,╮(╯_╰)╭我想我不需要再重复的解释理由了吧?第2章forth机的基本结构大家都知道堆栈吧?先进先出的堆和先进后出的栈。什么?你不知道?嗯,内事问百度。什么,你连百度都不想问?你太懒了,我很不喜欢除了自己以外的懒人。主流编程语言习惯由编译器自动分配释放栈区(stack),存放函数的参数值,局部变量的值等。而堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。而forth机的本质就是先进后出的堆栈机(stackcomputer),很少用到堆,它有两个栈,一个是嵌套调用函数(也就是字)的返回栈(returnstack),另一个是存放局部变量的数据栈(datastack)区别是什么?主流语言需要定义变量,给变量起名,还要考虑这名字好不好懂,会不会跟其他变量名重复。forth不是这样,它需要起名的只有函数(字),而局部变量都是只标明是什么类型的无名变量。某人要问了,没名字的变量怎么调用?嗯,这就是堆栈所要发挥的作用了,我只需要把这些参数按调用的先后顺序扔到堆栈上,然后逐一调用即可。某人继续问,万一函数里的无名参数太多呢,怎么记得住?嗯,多了是记不住,但是为什么要把那么多参数放在一个函数里,你就不会拆分成几个函数,让每个函数只处理1到3个参数吗?让每个函数做好自己的事,各行其职,整个程序不就跟着美好了吗?话题扯远了,继续说stack,上一章的1+2=3在堆栈上的表现是这样的:12+.1(放入1)┏━━━┃①┗━━━2(放入2)┏━━━┃①②┗━━━+(先取出2,再取出1,计算得3,存入3)┏━━━┃①②┗━━━┏━━━┃①②┗━━━┏━━━┃③┗━━━┏━━━┃③┗━━━.(取出并显示3)┏━━━┃┗━━━stack的先入后出就是这样第3章算术练习题1为了加深你对stack的理解,来几道小学生程度的算术题,以forth的方式,答案在下章结尾。第1题1+2+3+4第2题1+2-3+4第3题1+2*3+4第4题(1+2)*(3+4)第4章算术练习题2----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------我是骗字数的分割线--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------不知道你有没有发觉,上一章你输入数据的顺序和你用笔在纸上计算的顺序是一样,这不是巧合,这只是你思路的顺序,而forth只是遵照你的思路在执行。这是forth一个很重要的思想——人机一体,你本人能解决的问题,forth就一定能解决,只要你能清晰的剖析自己的思路;但如果连你自己都解决不了,也就别指望forth能帮你解决了。上一章的答案第1题12+3+4+.第2题12+3-4+.第3题23*1+4+.第4题12+34+*.接下来就是中学水平的计算题了示例1:Y=X+5输入某个数X,求Y解:X5+示例2:Y=a+b*(c+5)输入某个数X,求Y解:c5+b*a+练习题Y=12+((93*a/2+432*b)/129+c)*2答案在下章第5章算术练习题3----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------我是骗字数的分割线--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------第1种答案:93a*2/432b*+129/c+2*12+第2种答案:还记得之前瞎编的那个同义词吗?:func_a93*2/;:func_b432*;:func_ab+129/;:func_c+2*12+;afunc_abfunc_bfunc_abcfunc_c你是不是觉得第二种方法比第一种更麻烦?既然这样,我这里有3组数据a=2,b=4,c=6a=3,b=4,c=5a=1,b=3,c=6我用第二种方法算,你用第一种方法算,咱们看看谁算得快。我只需要输入一遍:func_a93*2/;:func_b432*;:func_ab+129/;:func_c+2*12+;afunc_abfunc_bfunc_abcfunc_c再输入三遍afunc_abfunc_bcfunc
本文标题:forth系统入门指导手册0-11(告一段落)
链接地址:https://www.777doc.com/doc-3454768 .html