汉语计算机系统,汉语编程单片机的计算机系统
本发明涉及一种汉语编程单片机的计算机系统,即汉语编程单片机、工控机是一种基于汉语计算机语言的单片机和工业控制机计算机系统。它适用于工业、农业、医疗、教育、环境、交通以及家庭等等行业的实时操作的应用。
单片机应用是近几年来的在控制及仪表方面非常有前景的一门技术。但是它的应用难度非常大。其表现主要体现在应用过程中的软件及其硬件的开发。一般开发过程见图1。利用专用单片机为仿真器11,通用的个人计算机并配置交叉汇编软件12,及通信装置13完成目标代码的传送及跟踪调试构成开发系统。开发过程的流程图见图2。首先将所需的应用程序在开发系统上进行仿真试验21,然后再设计硬件电路22。在硬件样机23电路安装调试完成后还有软件加载的过程24才能完成一个产品25的设计。传统的单片机产品开发中设计者必须熟悉单片机的硬件结构以及单片机指令系统,最为重要的是设计者必须使用汇编语言开发应用程序,使得开发周期非常之长,难度之大简直到了让人难以忍受的地步。一般来讲,一个人要达到能够完成单片机开发的水平必须受到较为长期良好的训练才行。所以传统的设计方法严重地阻碍了单片机推广与应用。
为了克服上述问题,本发明的目的是开发一种标准软件和硬件的环境,这种环境的模式是用户只需从市场上买到现成的单片机计算机系统,并能直接依托此环境进行直接编程,程度调试完成后设计这不需对单片机计算机系统部分进行重复设计,而是将编程所用的计算机直接应用在实际的产品中。根据上述的要求,就必须利用软硬一体化的设计方法发明一种软件运行效率极其高,硬件开销又极其小的规范化的单片机计算机系统,在这个系统中用户只需进行少量的编程工作以及外围的硬件环境试验就可以完成一个产品的设计。
基于上述要求,我对现有的软件以及它们与硬件一体化设计的条件进行了大量的分析,认为利用传统的方法来解决此问题答案几乎为零,即使实现了较高软件硬一体化设计过程,但将来到推广应用中其编程难易程度仍然存是个问号。
汉语程序设计语言移植在单片机计算机系统上是一种极为优化的软硬一体化设计方法。使得单片机计算机系统高级语言化成为实用,同时在实际的运行系统中几乎不增加多于的硬件开销。
汉语编程语言完全不同于英文程序设计语言,并不是将一般的程序设计语言中的关键字翻译而得。使用汉语编写计算机程,只要略知计算机的运行机制就可根据自己的需要进行文字创作,而这一过程也就是程序设计的过程。这样既提高了编程效率,又给用户带来了极大的方便。
汉语计算机语言也能象汉语一样,可以从大量的单字中去选择一定的字来组词,这些词既能象传统计算机语言中的语句一样,完成各种各样的操作,又可以象基本单字一样去组成新的单词,以便完成更复杂的操作。如此不断地发展下去,其语句的语义越来越广泛,最终接近于自然语言。程序越往后编就越能体现文字创作的艺术,因此程序员的语言水平决定着他的汉语程序设计水平。
利用单片机汉语编程系统进行产品的开发过程见图3。软件的开发只需将汉语编程单片机的计算机系统31通过通信口34与终端33(一般用个人机仿真终端)连接,然后直接使用汉语编程语言进行程序设计。同时在汉语编程单片机系统的I/O局部总线35端接上外设电路32就可以进行实际产品的电路试验与测试。所以用汉语编程单片机开发产品的硬件设计过程如图4所示。第一步41对所开发产品的接口进行电路试验,第二步42对接口电路进行布线设计,第三步43将汉语编程单片及的计算机系统31与接口板32合二而一,第四步44形式产品。此过程不需对产品中的计算机系统部分进行设计。另外由于开发中使用的单片计算机系统与产品中无任何差别,同时高级语言解决了绝对保证软件加载过程中数据区与程序区的分离,所以不存在硬件完成后,产品调试时所进行的软件加载过程。
综上所述,实现本发明的目的所采取的技术措施是:
设计包括键盘、监视器、磁盘接口管理的一种汉语编程单片机的计算机系统,包含:
a.单片机汉语编程系统具有一个汉语词典单元,该汉语词典单元完成系统的解释、编译及运行;词典单元中含有操作系统应用的设备驱动、设备管理、文件管理、命令管理、解释、编译、编辑、跟踪调试等各个层次;
b.该汉语词典单元依据用户输入的文本合法输入流(输入流中应含有繁衍新词的字符串如“编”和“。”等),能繁衍出汉语新词的词典标识单元,该词典标识单元也可以在读写存储体中繁衍出包括此功能的新的复合词;
c.该系统采用软-硬一体化设计,将一只可读存储体和一可读写存储体的部分地址在硬件上连接重叠,两个存储体的数据的读出与否通过总线仲裁器决定,该总线仲裁器利用系统的“固词→”单元指针上的地址判定选择两个存储体中的一个;
d.应用系统中可将可读写存储体中的词典单元部分转移到只可读存储体中,同时总线仲裁器和“固词→”可根据新的方式选择读写两个存储体之一。
e.该系统利用3-8译码器连续译出8个或64个I/O地址,达到I/O局部总线的外部扩充。
结合附图对本发明的内容及其实施例详细说明如下:
汉语编程单片机系统原理如图5所示。
汉语单片机编程系统的硬件主要由一个带串行通讯口的单片机(CPU)51,两个存储体,只可读存储器51(ROM)和可读写存储器53(RAM),一个专用的总线通道仲裁器54,一个串行口34,一个与总线仲裁器控制的RAM地址平移装置56,一个与扩充总线有关并由译码与驱动电路组成的局部I/O通道35。这些硬件的结构连同软件有机地组合在一起,并能自动地根据系统的要求对同样地址的不同存储器进行访问。
在此单片机系统的使用中,两个存储体与CPU组成内部总线,总线通道总裁器54将根据软件和硬件的设计要求迫使CPU51动访问其中一个存储体并运行其程序。在只可读存储器52中固化有汉语编程计算机的基本词典单元57,在系统编程过程中是使用自身所带的串行口与终端连接(一般用PC机仿真,借用PC机的键盘监视器及磁盘等资源),开发中编写的程序被装入可读写存储器53中,形成与汉语编程系统固有词典单元兼容的添加词典单元部分58,此部分的程序可以进行重复的修改。对于可读写存储器的访问不仅要根据总线通道仲裁器的控制还要根据RAM地址平移装置56决定需要访问的具体地址。待程序设计完成并调试无误后可将词典单元添加部分58与系统固有词典单元57一起通过EPROM编程器一并写入另一片EPROM然后将原来的ROM芯片替换,就形成了应用系统。
如果在应用中或现场调试中需要接终端跟踪调试还可直接插上PC机进行现场调试,由于通讯的物理协议是设计在板外的这样通讯的距离可以根据实际需要进行选择。如具有RS-423协议的电缆直接通讯距离超过1000米。
发明内容:
适用于单片机汉语计算机语言设计规范(见附页);
数摞操作:
数摞操作是汉语编程特有的表达方法和数据运算方式,将汉字字符集中的图形符号引入数摞操作的表达,就产生对意识流和数据流自动分开的编程习惯,大大地增强了程序设计的意识效果。
在汉语单片机计算机系统的基本词典单元中首先必须固化有数摞操作词的标识以及它们执行的实体:
√ nn……nl n0 n---nn-1 ……nl n0 nn
第n个数摞值,不计入n本身。它首先被移走,然后再移到数摞顶层。
将其余值下移入空位置{0…数摞总项数减1}。
例如:2√等价于∴
0√是零操作
∽ nl n2---n1 n2 n1
复制数摞次项。
∴ n1 n2 n3---n2 n3 n1
旋转数摞顶层三项内容。即将三项中最深数摞内容移到数摞顶层。
♀ n---
从数摞顶层删去16位的数。
♂ n---n n
复制数摞顶层16位数。
§ nn nn-1……n1 n0 n---nn nn-1……n1 n0 nn
16位的数nn是第n项数摞值的拷贝,不计入n本身{0…数摞总项数减1}。
例如:0 § 是等价于♂
1 § 是等价于∽
↑↓ n1 n2---n2 n1
汉语编程单片机在执行中将根据一种非常复杂的运行机制最终通过图5的54总线通道仲裁器从只可读存储器(图5的52)中找到这些标识,并当作程序执行或做其它的处理。虽然程序的执行是根据只可读存储体(图5的52)中的内容完成的,但执行中所处理的数据都必须在可读写存储体(图5的56)中读出或保存,所以总线仲裁器这时必须保证将与可读写存储器体的通道打开。
汉语编程单片机系统的编程特点:
单片机汉语编程系统是以词典为单元基础,完成系统的解释、编译及运行。词典中含有操作系统应有的设备驱动、设备管理、文件管理、命令管理、解释、编译、编辑等各个层次。对于一般程序的编译是以“编”开头句号“。”结束。随着“编”后的除分割符空格之外的第一串字符串是此词的名称。每“编”一个新词,其词名就既可以作为命令、语句使用,同时它也是一个子程序、一个宏的标识。如“编”一个平方的程序可以用下列方法:
编平方♂ ★。
这时词典单元中就形成了一个新词,这个词可以直接以命令的方式执行:
3平方 显9
同样它还可以作为语句供其他的程序中使用:
编 四次方 平方 平方。
而执行:
3 四次方 显81
在“四次方”程序实体中使用的只有自己所编“平方”词而已。从此例可以说明,利用这样的程序设计方法,程序设计者随着程序设计的进行将越来越依赖于自己新繁衍出的那部分属于自己的东西。程序员的语文水平最终是程序设计的关键所在。
所以汉语编程单片机的基本表达方式是本发明的内容之一如使用“编”开头,句号“。”结束等。在程序设计中每当使用“编”这个词时,解释器就会根据这个词的词名标识在图5的52只可读存储器的词典单元中找到“编”的属性标识并繁衍出“编”后所跟宾语的新词,直到遇到句号“。”结束。这个新词生成在可读写存储器中。图5的54总线通道仲裁器会根据汉语编程单片机计算机系统的运行机制自动地访问图5的53可读写存储器,使得两个存储器好象一个一样。
由于汉语编程单片机系统中固有词典单元(图5的57)中含有能够繁衍新词的词典标识单元,以及它们的实体,它们可以在可读写存储体(图5的57)中繁衍出新词,同时本系统会根据总线通道裁器访问两个存储体之一的具体存储区域。所以词典单元中具有繁衍能力的基本词是非常重要的。具体如下:
编 ---
使用形式:
编……。
选择检索词汇支“支→→”与编译词汇支“编译支→”相一致。在“编译支→”中生成的词典单元项目,并设置编译模式。在输入流中的后随的非立即执行词汇的编译地址被存入词典单元,当以后调用词时,非立即执行词时才被执行。立即词则是一遇到就被执行。对新生成的词汇定义在成功处理相应的“。”或“。汇编”之后才能从词典单元中查出。如果某一词汇在“支→→”和“汉语根”词汇支中检索后还找不到,则按当前数基进行数字的转换和编译,如果转换再失败,则存在错误条件并异常终止编译。
--- 编,即,
--- (编译时)
停止一个“编”定义的编译,使这个“编”定义的可以在词典单元中合法的查出,设置解释状态并编译“终止”。
建词头 ---
生成一个词的标题,假设计数字节和文本名称已被取入“可用地址”。使标题形式适于在“汇编”机器(代码)定义中使用即采用属性域地址中 含有实体域地址的格式。
建词 ---
定义词汇使用形式:
建词
生成的词典单元项目。在生成之后,下一个可利用词典单元单元就是的实体域中的第一个字节。随后执行时,的实体域中的第一个字节的地址被留在数摞顶层。“建词”并不给的实体域分配空间。
动作 --- 编,即,
---
定义一个词在执行时运作,而该词是由高级定义词所生成的。其使用形式:
编……动作…。
随后是:
…
其中是“建词”或者执行“建词”的任何用户定义的词汇。“动作”标记定义词汇定义部分的结束。并接着开始对那些以后用定义的词在执行时的动作进行定义。当以后执行时,的实体域地址被放在数摞顶层,执行“动作”和“。”之间的词汇序列。
为 n---
定义词汇的使用形式:
n为
它生成词汇,在它的实体域中含有常数n。当以后执行时,它将数值n放在数摞的顶层。
双数为 d---
定义词汇的使用形式:
d为
它生成词汇,在它的实体域中含有常数d。当以后执行时,它将32位数值d放在数摞的顶层。
变量: ---
定义词汇的使用形式:
变量:
执行变量时,它生成的定义并在它的实体域中分配两个字节。
当以后执行时,实体域地址留在数摞的顶层。
双变量:---
定义词汇的使用形式:
变量:
执行变量时,它生成的定义并在它的实体域中分配四个字节。
当以后执行时,实体域地址留在数摞的顶层。
词典单元规范:
汉语编程系统中词的结构和运行的机制都有及其规范的形式,从而从系统的优化上具有很大的优势,从而将高级语言成功地应用在单片机系统之上。
汉语编程系统中的词都必须有其代码部分的标识,此标识可以被系统的内部解释/编译器识别,以保证其被执行或编译。另外汉语系统中的词还应有一个词名标识,以便于检索,同时名称标识中还含有标定代码的标识,如命令的执行就是先找到词名的匹配,然后根据词名标识出的代码标识执行此程序
由于有了这种汉语编程方案,使得单片机的编程可以象普通个人机那样只要接上键盘、监视器和磁盘就可以编程,而程序设计完成后又可以直接将这个系统应用于现场。在现场如果需要调试也只需象开发时一样接上键盘、监视器和磁盘,就如同开发时的编程一样。一般情况下汉语编程单片机使用的键盘、监视器和磁盘是借用流行的PC机的键盘、磁盘监视器来实现的这样就不必专门为之开发汉字系统,开发者习惯于哪一种录入方法或汉字系统都是可以的。
单片机的开发有其特殊的要求,如果在巴掌大的电路板上实现如同PC机那样的内存和外设功能,其困难是相当大的。如单片机的存储器分为ROM和RAM两种方式,在开发时必须使用RAM方式,以保证随时将所编写的程序写入存储器并运行此程序,而在程序设计完后又要将程序写入ROM并将此段地址以ROM的方式运行,在开发系统上是将一些管座保留在电路板上,并以换芯片的办法来更换ROM和RAM,又由于ROM和RAM地址各有要求,只好将存储空间分割的为多个段页以不同的管座来分配ROM和RAM地址。自然管座多电路板也将增大,成本也会因此而升高,而且频繁地插拨芯片对设备也会有损害。所以此方法不宜用于目标机,从而造成了每开发一个产品将针对此产品的特点设计其计算机部分的电路。而且在设计过程中对于ROM和RAM的地址分配关系与实际的产品有多少距离还是设计者担心的问题。
在汉语编程单片机系统中成功地解决了这个问题。首先是打破传统的设计概念,不是用IC插座来直接更换ROM和RAM的地址,随着硬件价格的下降,与其用多个芯片还不如用存储量尽可能大的更少芯片,使其价格相当。然后在高级语言编程的实现中必须保证程序与数据绝对分开,也就是说汉语编程系统不需要用户考虑应用程序是数据和程序的地址问题,在设计中可读写存储体(图5的53)中的程序在目标机中可以完全保证在只可读存储体(图5的52)中运行。编程中系统自动将程序区的地址生成ROM后系统还根据“可用地址”空间可以从可读写存储体的新地址中生成新的程序及词。
解决这个问题的方法是基于软硬一体化的设计。首先将两个存储体,只可读存储体(图5的52)和可读写存储体(图5的53)部分地址在硬件连接上重叠,然而两个存储体的数据的读出与否是要通过总线通道仲裁器决定。系统中有一个“固词→”,总线仲裁器会根据在“固词→”指针之上的地址为可读写存储体反之为只可读存储体选择通道。例如对于标准的汉语编程系统的词典单元结构是以64K为基础的这样用一个27512ROM芯片就将全部存储区覆盖有余,而一至两个62256芯片几乎可以覆盖编程所需的程序区和数据区。此办法显然规范了设计和缩小了电路板尺寸,综合考虑成本几乎与传统的设计相当。
总线仲裁器除了根据上述的要求选择通道以外还可根据系统的数据要求选择通道。例如设一个变量后,在读写此变量时总线仲裁器就必须保证选择可读写的存储体(图5的53)为此变量实际区域。
总线仲裁器可以是一个比较器。通常的方式如图6所示,系统在存储器访问有效时(图6的3)提供存储器访问地址(图6的1)与“固词→”(图6的2)经比较器(图6的4)比较,高于“固词→”就选择RAM(图6的5),而低于“固词→”就选择ROM(图6的6)。
该总线仲裁器还可以是一个比较器加地址平移器,如图7所示,与图6不同之处是比较器加地址平移器(图7的4)可以将实际的RAM地址平移变换后(图7的7)提供RAM,这样就可以减少RAM与ROM的地址重叠范围。
除了基本上按地址高低比较出ROM和RAM地址之外,另外对于具体的单片机芯片或具体的系统在译码上会根据具体要求有所不同。也可以是一个比较器加上一个地址平移器等。这种特殊的总线仲裁器实际非常简单,虽然不同型号的单片机汉语编程系统存储体译码器有所不同,但其基本形式都可以规范到统一的形式上来。
利用IBM-PC及兼容机仿真终端与本系统一个串行口连接完成终端的连接;
串行口的物理协议即与PC机串行口的电路接口可以是电缆的方式与PC机的RS232相连。引导一种普通的汉字系统,再启动单片机汉语编程系统所提供的终端软件直接利用PC机的键盘、监视器与磁盘等外设资源。
在单片汉语编程系统内部每执行一次“等键”操作就从串行口输入一个字符,而每执行一次“印字符”操作就向串行口发送一个字符。对于字符串操作以及块操作都是建立在此基础之上的。利用汉语编程的设备化原理,只要有“印字符”和“等键”操作,就可以完成操作系统中的键盘管理、磁盘管理、以及字符串输出管理。
印字符 ---
将数摞上的数的低8位作为字符代码,发送在终端上。如果是汉字内码,那么要连续发送两次才能将字型印出。
等键 ---
操作前数摞上没有数,操作后给数摞上留下8位的字符代码。
如果是ASCII码,其代码只占7位,而如果是汉字内码,那么字符将占8位。
例如对于HD64180单片机汉语编程系统的“等键”是用下列方法编写:十六进制
汇编(印字符)
1¥:in0 a,(C4)
bit l, a
jr z, l¥
pop hl
ld a, l
outO(C6), a
汇编尾 汇编。
编 印字符 向印字符 读 执行。
十进制
而“等键”却与之相反:
十六进制
汇编(等键)
l¥:a, (C4)
bit 7, a
jr z, l¥
inO a, (C8)
ld h, O
ld l, a
push hl
汇编尾 汇编。
编 等键 向等键 读 执行。
十进制
其中设C6为串行口发送地址,C8为串行口接收地址,C4为状态地址。
上述两个程序在执行中首先是将终端发送来的串行信号通过CPU的串转并寄存器接受到CPU中,然后将此信号作为一种字符的协议以数据的方式由总线仲裁器选择送到可读写存储体(图5的f)指定的数摞占有的区域中。
从上例可以看出(等键)和(印字符)为汉语编程系统的基本设备启动层,由于采用向量管理设备启动,在必要时可以用其设备启动词就“向印字符”及“向等键”中的内容置换而采用新的设备启动程序。这说明汉语系统中真正地具备了操作系统中必备的启动和设备管理两个层次。
有了上面的设备启动及设备管理程序,在PC机一端就可以进行终端程序的设计,一般情况下,在PC机一端每收到一个字符及为单片机发送一个字符,则要进行显示,而每接收到一个击键动作,则应为单片机等待的键盘动作,所以就将此键值发送到单片机中。用PC机的汉语程序计算机语言设计的实际程序的简化形式如下:
编 终端 环首
终端查询
就 等键 发送到串口 然后
读串口 -1 相等
就♀ 否则 印字符 然后
回首。
稍微复杂一点的就可以将磁盘管理的块操作功能加入实现磁盘的管理。
带I/O译码的局部总线
由于汉语编程单片机系统提供了规范化存储体设计,一般的应用都可以满足,而单片机应用中的外设却是五花八门。如何能将其简化并有一个规范的形式是此项发明必须解决的问题。综合计算机外设的应用形式,我们分析出对普通单片机所提供的端口要满足常规的应用是不够的,而常用总线提供的I/O扩充对于单片机系统也过于庞大和复杂。综合起来设计一种符合普通应用的局部总线既可以简化应用系统的设计又可以满足通常应用的要求。
首先要分析出通常I/O所需的资源。一般的应用如果有8个以下的8位I/O地址就可以满足一般的应用,所以提供八个连续的直接片选是非常有用的,但是对于许多外围的芯片需要一个片选能覆盖4~8个地址。对于这样的要求,使用八个连续地址的直接片选就不使用了。如何将上述两种分析加以综合呢?
在巴掌大的电路板上不可能使用更多的译码芯片,使用一个3-8译码器和3个低3位地址可以译出八个片选,如果使用3-8译码器对A3、A4、A5进行译码就得到了每个选通端选8个连续的地址,这样对于一个3-8译码器可以译出连续64个地址。但这时就必须向外设提供地址的低三位A0~A2。
综合上述分析在就可以决定局部总线上应该提供的信号。八个片选端、3~8个地位地址、读写信号、以及辅助控制端如中断、和中断响应等。
图8是译码电路的主要部分:
为了节省电路板空间,地址的选择采用短路子,当A3~A5接有短路子,同时3-8译码器接A0~A2,这时译码器可根据短路子的位置选择8个连续的地址,而A3~A5不接短路子时,3-8译码器的输入接A3~A5这是译码器可根据剩下的A6~A7短路子选择8个连续的地址段,每段地址占8个地址空间。另外局部总线的译码还主要体现在译码器只对I/O译码,所以此译码器只是在I/O申请有效时才有效。例如对于一个8255芯片可以直接按后一种连接,见图9,选择一个片选,接两个地址线A0~A1。这个片选选择的地址段就被8255占用,因为8255是占4个地址,在这个地址段中8255就重复的使用了两个地址段,共占8个地址。
又如要将一个8位数据锁存在74LS373内只需用8个数据线、一个地址片选、一个写信号就可以直接构成输出回路,使用中只需用一条汉语编程词“n1 n2端口写”就会根据这个词的代码标识找到实际的向端口写数据的程序并从指定的片选端给出选通信号同时发出数据将数据写入此锁存器。同样一个地址还可担任数据的输入,由图10可以说明。
连接终端的通信口物理协议移出板外:
由于汉语编程单片机系统要求尽量小的面积,每加增加一个芯片都受到很大的限制,加上汉语编程单片机是以商品的方式出售,虽然都设有串行口,但具体采用何种物理协议也不一定。这样只是在电路板上留出串行口插头,而具体通讯的物理协议就移出板外以电缆的形式直接与PC相连接,也可以作为实际产品的物理层通讯协议,对于通信协议有特殊要求的产品可以简单地设计电缆部分满足其要求。图11和图12提供RS423及RS232两种物理协议的电路。图11的J1接RS423,J2接单片机的串口;图12的J1,J2分别为电源的入与出,而J3接单片机串口,J4接RS232接口。
在实际应用中是以电缆的方式给用户提供产品。这样用户可以选择随意的物理协议同时又不影响编程中的软件效果。
在汉语编程单片机的计算机系统中汉语词典单元的必备词为:
√∽∴♀♂§↑↓非0♂读暗摞>暗摞 暗摞>摞深
双∽双∴双♀双♂双↑↓
数基 十进制 十六进制
+ - ★ / /余商 求余数 求补 绝对值 取大 取小
★/★/余商 混★混/余商 无符/余商 无符混★双/余商
1+1-2+2★2/
与 或 非 异或 (异或) 单转双
=<>0 0= 0> 无符
双=双
读 写 字节读 字节写 双读 双写 +写字节空出 填数 填字节 字节传送 字节逆传 填充 填0 填空格 串相等
符转数 串转数 串变双数 扫描 查词 等输入 计字
收字符
等键
双显右齐 双显 显 显右齐 无符显 无符显右齐
印字符 印字串 显“ 空格 个空格 空格符 回车
〖#〗#剩余 插显 插负号
就 否则 然后 如和 对应就 而和 其余则 而后
+回环 循环 ?循环
回环 内环数 外环数
环首 回首 就出来 就继续 重复
出循环 终止 复位解释 全复位
编。建词头 建词 动作 为 双数为 变量: 双变量:
(。汇编)。汇编 汇编 汇编。
释放 词汇中定义 汉语根
固词→词典→
>实体域 链域>名域 名域>链域 名称>链域>>链域
(显(编译 强编译 找 找编 立即词 编解态 进编译 进解释
屏蔽 解屏蔽 执行
看内存 看词
端口写 端口读
其具体说明见附页
实施例:
经过数年的开发,目前本发明已有以HD64180、MCS98、MCS51为CPU的单片机汉语编程系统的系列产品。其主要产品形式有汉语编程STD工业控制机的系列产品、带有局部总线的汉语编程单片机最小计算机系统以及现场直接应用的目标产品等等。
例如对于HD64180单片机汉语编程系统,使用HD64180单片机作为CPU(图5中的c),使用单片机自带的串行口(图3的34)与终端(PC机)33相连,一个27512用于只可读存储体(图5中的52),两个62256用于可读写存储体(图5中的53),利用一个拨动开头就在指定“固词”的地址,通过一个与非门比较,CPU可选择两个存储体中的一个。
本发明效果主要体现在软件和硬件的设计效率上。对于硬件设计来讲,单片机开发者已不需对单片机的硬件设计进行任何考虑,只需将所设计的应用系统和汉语编程单片计算机与外设接口部分简单的连接弄清楚并一步的进行连接完成自己的硬件设计。而软件设计则直接使用语言来编写计算机的程序,对于一般受过普通中等教育的人在短时间内都可学会。与传统的单片机开发方法相比,其开发效率可以提高二十倍。
使用用汉语编程单片机、工控机,对于一般的应用领域就可以直接利用现有的人才条件完成各种控制与仪表方面的计算机化设计,甚至与家庭自动化控制等等。而不需要具有单片机开发素质专业人才去完成。可以想象由于汉语编程的出现计算机的应用将进一步的普及化。
附页 汉语编程语言分类词汇表
词汇表中每一项定义的第一行是对数摞操作过程的符号表达。这些符号表明输入参数被存入明摞的顺序。三条横线“---”表示执行点,留在数摞里的任何参数都被列出。在这种表示中,数摞顶层在“---”的右端。下面是数摞参数的缩写和整个词汇表中所用数的类型。这些缩写可以有数后缀,以便区别相同类型的多重参数。
右边的文字表明定义特征:
编 只可用于“编”定义中的词
执 仅可执行词。
即 立即执行词
1 数摞操作
1.1单精度数摞操作
√ nn…… n1 n0 n---nn-1……n1 n0 nn
第n个数摞值,不计入n本身。它首先被移走,然后再移到数摞顶层。
将其余值下移入空位置{0…数摞总项数减1}。
例如:2√等价于∴
0√是零操作
∽ n1 n2---n1 n2 n1
复制数摞次项。
∴ n1 n2 n3---n2 n3 n1
旋转数摞顶层三项内容。即将三项中最深数摞内容移到数摞顶层。
♀ n---
从数摞顶层删去16位的数。
♂ n---n n
复制数摞顶层16位数。
§ nn nn-1……n1 n0 n---nn nn-1……n1 n0 nn
16位的数nn是第n项数摞值的拷贝,不计入n本身{0…数摞总项数减1}。
例如:0 § 是等价于♂
1 § 是等价于∽
↑↓ n1 n2---n2 n1
交换数摞顶层两项内容。
非0♂ n1---n1 (若为零)
n1---n1 n1 (若为非零)
仅当n1为非零时复制n1。它通常用于恰在词汇“就”之前拷贝该值(以在控制结构内使用此数摞值),或者在词汇“就出来”之前拷贝该数值(以把控制参数传送到“环首…就出来”控制结构之外)。
读音摞 ---n
拷贝暗摞顶层的内容到明摞顶层。
>暗摞 n---
从数摞顶层移出一个数n,并放到暗摞中最高可访问的位置。应和同一定义中的“暗摞>”平衡使用。参见“暗摞>”。
暗摞> ---n
将暗摞顶层的数值n移到明摞顶层。参见“>暗摞”和“读暗摞”。
摞深 ---n
测出在n被加到数摞以前,数摞中含有16位数值量的数目。例如以下的操使“显 显 显”成为:
48摞深显 显 显284★
1.2 双精度数摞操作
双∽ d1 d2---d1 d2 d1
复制数摞第三、第四项到顶层。
双∴ d1 d2 d3---d2 d3 d1
按双精度旋转数摞顶层三项内容。即将三项中最深数摞内容移到数摞顶层。
双♀ d---
从数摞顶层删去两层数,即一个32位的数。
双♂ d---dd
复制数摞顶层两层数,即一个双精度数。
双↑↓ d1 d2---d2 d1
按双精度交换数摞顶层两项内容。
2 数基
数基 ---
是一个包括当前数基的任务变量,它用于输入和输出转换。
二进制 ---
设置输入-输出的数字变换基数为二。
十进制 ---
设置输入-输出的数字变换基数为十。
十六进制 ---
设置输入-输出的数字变换基数为十六。
八进制 ---
设置输入-输出的数字变换基数为八。
3 算术运算
3.1单精度算术运算
+ n1 n2---n1+n2
n1,n2相加,其结果留在数摞的顶层。
- n1 n2---n1-n2
n1减去n2,其结果留在数摞的顶层。
★ n1 n2---n3
留下n1,n2相乘的最低的有效16位,带符号乘积在数摞顶层。
/ n1 n2---n1/n2
n1除以n2留下带符号的16位下整商。
/余商 n1 n2---
n1除以n2留下余数和带符号的16位下整商。余数取除数符号或为零。
求余数 n1 n2---
n1除以n2留下余数。余数取n2的符号或为零。除法运算为下整除。
求补 n---n2
在数摞顶上留下n的二进制补码。
绝对值 n---│n│
求出n的绝对值│u│,并留在数摞的顶层。如果n的值为-32768,则具有相同的数值。
取大 n1 n2---
将n1或n2两者之一的较大数留在数摞顶上。
取小 n1 n2---
将n1或n2两者之一的较小数留在数摞顶上。
3.2 双精度算术运算
双+ d1 d2---d1+d2
双精度数d1与双精度数d2相加,得出的双精度结果留在数摞的顶层。
双- d1 d2---d1-d2
双精度数d1减去双精度数d2,得出的双精度结果留在数摞的顶层。
双绝对值 d---│d│
求出双精度数d的绝对值│d│,并留在数摞的顶上。
双求补 d1---d2
将双精度数d1转换成二进制补码的双精度数。
3.3 混合运算
★/ n1 n2 n3---[n1★n2]/n3
n1,n2相乘产生32位带符号的中间结果,再被n3除,得到下整商留在数摞的顶层。
★/余商 n1 n2 n3---
n1,n2相乘产生32位带符号的中间结果,然后被n3除,得到16位的余数和16位的下整商。余数取除数的符号或者为零。如果除数为零或大于16位则存在错误。
混★ n1 n2---d
留下单精度有符号数n1,n2相乘,留下双精度带符号乘积在数摞顶。
混/余商 dn---
有符号双精度数d除以有符号单精度数n得到余数和商留在数摞的顶。
无符/余商 ud u---
数摞上第二、三层为一个双精度无符号数ud,顶层为一个单精度无符号数u,ud除以u得出单精度无符号余数和商。如果分母u为零或溢出16位,则存在错误条件。
无符混★ u1 u2---ud
两个无符号16位数u1,u2相乘,在数摞顶上留下无符号32位乘积ud。
双/余商 dn---
仅由“#”使用的混合级除。在应用中避免使用。
3.4 快速运算
1+ n1---n2
快速运算。将n1加1的结果留在数摞顶层。
1- n1---n2
快速运算。将n1减1的结果留在数摞顶层。
2+ n1---n2
快速运算。将n1加2的结果留在数摞顶层。
2- n1---n2
快速运算。将n1减2的结果留在数摞顶层。
2★ n1---n2
快速运算。将n1乘2的结果留在数摞顶层。
2/ n1---n2
快速运算。将n1除2的结果留在数摞顶层。
4逻辑运算
与 n1 n2---
对数摞上的n1,n2按位相与,其结果留在数摞顶上。
或 n1 n2---
对数摞上的n1,n2按位相或,其结果留在数摞顶上。
非 n1---n2
对数摞顶上的n1按位取反,其结果留在数摞的顶上。
异或 n1 n2---n3
对数摞上的n1,n2按位相异或,其结果留在数摞顶上。
(异或) ---
由位组合格式,以对的内容补数。
单转双 n---d
扩展n的符号,通过位15拷贝到双精度数d位32上,使一个单精度数扩展为双精度数。d的最高位有效位部分及符号为在数摞顶层。
5 比较运算
5.1 单精度比较运算
= n1 n2---
如果n1,n2相等,则留下“真”标志,否则留下“假”标志。
<> n1 n2---
如果n1,n2不相等,则留下“真”标志,否则留下“假”标志。
如果n1小于n2相等,则留下“真”标志,否则留下“假”标志。
> n1 n2---
如果n1大于n2相等,则留下“真”标志,否则留下“假”标志。
0
如果n小于零(负数),留下“真”标志;否则留下“假”标志。
0<> n---
如果n不等于零,留下“真”标志;否则留下“假”标志。
0= n---
如果n等于零,留下“真”标志;否则留下“假”标志。
0> n---
如果n大于零,留下“真”标志;否则留下“假”标志。
无符
留下两个16位数的无符号“小于”的逻辑值。
无符> u1 u2---
留下两个16位数的无符号“大于”的逻辑值。
双= d1 d2---
如果d1,d2相等,则留下“真”标志,否则留下“假”标志。
双
如果d1小于d2,则留下“真”标志,否则留下“假”标志。
双
如果d1小于d2,则留下“真”标志,否则留下“假”标志。
双> d1 d2---
如果d1大于d2,则留下“真”标志,否则留下“假”标志。
6 存储器操作
读 ---n
留下中的16位的内容在数摞顶层。
写 n---
将16位的n写入。
字节读 ---
在数摞顶层留下中的8位内容,数摞顶层的高8位为零。
字节写 n---
把n的最低有效8位写入中去。高8位自然丢失。
双 读---d
从读取最高有效位,从+2读取最低有效16位,以双精度数的格式放在数摞上。
双写 d---
将数摞上的双精度数d的最高有效16位写入中,最低有效16位写入+2中。
+写 n---
将n加到中的数值上。
字节空出 n---
在词典单元中分配n个字节。下一个可用词典单元的地址被相应的更新。
填数 n---
将16位的n存入词典单元指针的当前位置即“可用地址”处,然后指针移两个字节。
填字节 n---
将16位的n的最低有效8位存入词典单元指针的当前位置即“可用地址”处,然后指针移一个字节。
7 访问磁盘
-->-- 即
继续解释下一个磁盘屏幕。
编辑 ---
启动全屏幕编辑器。
屏装载 n---
保存“输入流→”和“块号”中的内容,它们定位当前输入流。随后通过置“输入流→”为零和“块号”为n,使输入流更换到屏幕n的开始处。屏幕被解释。如果屏幕n的解释不被明确终止,而输入流被耗尽,则解释被终止;同时“输入流→”及“块号”的原来内容复原。如果n为零,则为错误。参见“输入流→”、“块号”、“-->“块地址”。
屏。 --- 即
停止屏幕的解释。
块地址 u---
是含有存储块u第一个字节的赋值缓冲区地址。如果占有该缓冲区的存储块不是块u,和已被更新的,则在被赋值该缓冲区前,被转移到磁盘存储器中。如果存储块u已经不在存储器中,则它从磁盘存储器中转入赋值的块缓冲区中。存储块不可以被赋值给几个缓冲区。如果u不是可以利用的存储块号,则存在错误条件。只有用“块地址”和“地址”引用过的缓冲区的内容才是有效的。
标记 ---
标记最新引用的块为已更新的。当它的缓冲区空间被不同块存储占用时,或是当执行“存缓冲区”或“块存”时该块随后被自动地转移到磁盘。
存缓冲区 ---
将全部更新的磁盘缓冲区写入磁盘,接着清除全部缓冲区的赋值。只要用户更改屏幕文件,或用用“退出”命令回突主系统时,这个功能就由汉语编程系统自动完成。
块存 ---
将“标记”过的全部缓冲区内容写入磁盘。全部块缓冲区不再被标记为修改过的,但继续被赋值给它们各自的磁盘块。
块号 ---
含有正在被解释的磁盘块号的变量。若“块号”中的值为零,则输入取自终端输入缓冲区。
8 字符处理与转换
8.1 字符处理
字节传送 ---
把从开始的指定传送到开始的区中,的内容首先被传送,逐步移向高存储地址。如果字节为零,没有内容被传送。
字节逆传 ---
把从开始的指定传送到开始的区中。传送开始将+-1的地址移到+-1,连续地移到向低地址传送。如果字节数为零,无任何移动。
填充 <8位数>---
从开始,以一定的<8位数>填入存储区。如果字节为零,无动作。
填0 n---
从开始的n个存储字节设置为零,如果n为零,没有动作。
填空格 ---
从存储区开始,用给定的ASCII码空白符填充。
串相等 ---
快速字符串比较。如果字符串相同,留下“真”标志,否则留下“假”标志(零)。
8.2 字符转换
符转数 n1---n2(转换成功)
n1---(转换失败)
将ASCII码(使用数基n1)转换为它的等效二进制数n2,并伴有“真”标志。如果转换失败,仅留下“假”标志。
串转数 +d1---d2
+d2是将文本中+1处开始的字符转换成数字结果。转换中它使用基数值。把+d1的每一位乘以基数值后累加到+d1中。转换继续到遇上一个不能转换的字符为止。不能转换字符的地址为留在数摞。
串变双数---d
使用当前数基,将在中具有先行字符计数和结尾ASCII空格符(20H)或零的字符串转换为带符号的双精度数。如果文本中遇到小数点,则它的位置将在“小数位”中给出,但不发生其他影响。如果数字转换不可能,将给出错误信息。参见“串转数”。
扫描 ---
通过非破坏性地接收来自输入流中的字符,产生一个计数字符串,直到遇到定界。先行定界符被忽略。整个字符串作为字节序列存入从开始的存储器中。第一字节含有字符的数目。字符串后面的ASCII空格符不包括在计数之中。如果找到定界符,“输入流→”中的内容就被调整定界符后面字符处。“输入流长度→”不被改变。
查词 ---n
是计数字符串的地址,该字符串是在当前检索次序中寻找的词汇名称。如果词汇找不到,为计数字符串,而n为零。如果词汇被找到,是该词的编译地址(属性域地址),并且当词汇不是立即执行词时置n为-1,当词汇是立即执行词(优先位置1)时,置n为1。
等输入 ---
从操作者终端输入80个字符文本(或直到遇见)。文本放置以“终端址”为首地址的区域内。把“输入流→”置零,“输入流长度”等于接收的字符数。
计字 ---n
留下由开始的信息文本的字节计数n和字节。设的第一个字节含有文本字节数,而实际文本是从第二字节开始的。典型的应用在“计字”之后跟随词汇“印字串”。
8.3 字符串管理指针
终端址 ---
具有输入流中的当前字符偏移量的地址。参见“扫描”。
收字→ ---
留下通过最后执行“收字符”实际收到和存储的字符计数变量的地址。
输入流长度 ---
具有文本输出缓冲区中字节数的变量的地址。注意,它不是缓冲区的长度,而是缓冲区中的当前存在的输入流的长度。当“块号”中的值为零时,“输入流长度”是通过词汇“扫描”访问的。在执行“收字符”后通过“等输入”把它置之与“收字→”的内容相等。
收字符 ---
从终端将字符移到开始的区域,直到遇见或者全部已被接收。不存入存储器。一个“空”字符被附加到文
本串的末端。实际接收到的和被存入存取器中的全部字符将被显示。
收到的字符计数(不包括)被留在“收字→”中。
9 输入输出及格式
9.1 字符输入
终端查询 ---
对终端键盘进行测试,以启动所有的键。“真”标志表明启动,并保留此“真”标志于任何呼叫,直到调用词汇“等键”才读入字符。
等键 ---
操作前数摞上没有数,操作后给数摞上留下8位的字符的代码。
如果是ASCII码,其代码只占7位,而如果是汉字内码,那么字符将占8位。
9.2 数字输出
双显右齐 dn---
按照当前数基,以每字段为n个字符宽和从右对齐的格式打印一个带符号的双精度数d,如果d为负数,ASCII先行负号“-”被显示,如果显示d所需的字符大于n,就存在格式上错误。
双显 d---
打印32位二进制补码的带符号双精度数。如果d为负数,ASCII先行字符“-”就被显示,结尾空白符总是被显示出来的。设定高16位是在数摞的最高可存取处。按照当前的数基转换。
显 n---
如果n为负数,则由带有先行负符号的自由字段格式显示n的绝对值。尾随空格符也被显示。
显右齐 n1 n2---
以字段n2和右对齐的格式打印数字n1。不打印后边尾随的空白符。
无符显 u---
以自由字段的格式显示无符号数u。并显示一个结尾空白符。
无符显右齐 u n---
以n个字符宽的右边对齐的字段格式显示u,前面用空格符填充。
9.3 字符输出
印字符 ---
将数摞上的数的低8位作为字符代码,发送在终端上。如果是汉字内码,那么要连续发送两次才能将字型印出。
印字串 ---
数摞上给定一个字符串的和,执行时将这些字符串发送在当前的字符显示设备上。
显“ --- 编,即,
--- (编译时)
使用形式:
显“”
随后的执行将显示但不包括结尾定界符“″”(后引导)。
符号“显″”之后的空格符不是的一不部分。
空格 ---
在当前的字符输出设备上将ASCII空格字符输出。
个空格 n---
在当前的字符输出设备上将n个ASCII空格字符输出。
空格符 ---
为一个常数,它在数摞顶层留下“空格符”的ASCII码值32。
回车 ---
发送回车和换行到选定的输出设备,复位“输出流→”内容为零。
9.4 输出格式化
〖 ---
使用下列词编排图形字符的输出格式:
〖##剩余 插显 插负号〗
# +d1---+d2
将数基值除+d1的余数转换成ASCII字符,并增补到格式输出字符串的较低存储地址中。+d2是商并留作进一步处理。典型地用于“〖”和“〗”之间。
+d---
通过清除+d终止数字输出转换。留下适于打印(印字符)的文本地址和字符计数。
#剩余 +d1---00
通过“#”的使用,在文本输出缓冲区产生ASCII文本,直到商为零。
如果数值初始为零,将加一个“0”到输出字符串中。典型地用于“〖”和“〗”之间。
插显 ---
用于“〖”和“〗”之间,将ASCII码或汉字字符插入到图象数字输出串中,例如在十六进制下“2E插显”将放置一个小数点“.”。
插负号 n---
当n为负数时,在文本输出缓冲区中被转换的数字输出串之前存放一个ASCII符号“-”。n被舍弃。
输出流→ ---
为具有发送字符增量的变量,用户可以变更和检查“输出流→”中的内容以控制显示格式。
数输出→ ---
在数字输出转换过程中,保存文本最后字符地址的变量。
小数位 ---
以双字长整数输入的小数点右边位数的位置的变量。它也被用于在用户指定的数据输出格式中保持小数点的位置在列方向一致。单字长数输入的约定值为-1。
暂缓区 ---
留下保存中 间处理过程数据的暂存区的低地址。“暂缓区”的地址或内容可以改变,如果下一个可用地址单元的地址被改变,则这些数据被舍弃。“暂缓区”的最小容量为84个字节。
10 控制结构
10.1 转移
就 --- (运动时) 编,即,
--- (编译时)
在“编”定义中出现的形式:
就真部分…然后
就 真部分…否则 假部分…然后
在运行时,就按照数摞上给出的执行,如果为“真”(非零),前继续执行“真”的部分。如果为“假”(零),则跳到“否则”及其假 部分是可选择的,如果没有该部分,则“假”部分的执行就跳到“然后”之后。
否则 --- 编,即,
---(编译时)
“编”定义中出现形式:
就…否则…然后
运行时,在执行“就”的“真”部分之后执行“否则”,“否则”迫使执行跳过其他的“假”部分,并执行“然后”部分。它不影响数
然后 --- 编,即,
--- (编译时)
使用形式:
就…否则…然后
或
就…然后
“然后”是在“否则”之后继续执行之点;或没有“否则”时,则它是在“就”之后继续执行之点。
如和 n--- 编,即,
“编”定义中使用的形式:
如和 …对应就
而和 …对应就
…
其余则…
而后
注意:“…对应就…而和…对应就…”可以按需要多次重复。在编译时,“如和”保存“暂摞→”的当前值,再把“暂摞→”位置为数摞指针的当前位置。这个内容由“而后”用于解释前面“其余则”留在数摞的向前引用。n留作错误检查。“如和”没有运行效果,不编译代码到词典单元中。
对应就 n1 n2---n1(如不相符) 编,即,
n2 n2--- (如相符)
---n
在运行时,“对应就”检查n1和n2是否相等。如果相等,n1和n2都从数摞被清除,并继续执行直到下一个“而后”的代码。在编译时,“对应就”安置比较及“0跳转”,并为在的偏移保留空间。有“而和”或“其余则”用于分辨偏移,n用于错误检查。
而和 --- 编,即,
n1---n2 (编译时)
运行时,如果在最后的“对应就”处相符,“而和”将控制转移到下一个“而后”后面的代码。如果在最后的“对应就”处不相等,“而和”即为将执行转移到达的位置。在编译时,“而和”编译一个“跳转”,保留转移偏移量,并留下参数和n2。“而和”还通过计算从到“可用地址”的偏移量,并将其存入中,以决定在“对应就”处的未决定前向“0跳转”。
其余则--- 编,即,
n1---n2 (编译时)
运行时,如果在最后的“对应就”处相符,“其余则”将控制转移到“而后”后面的代码。如果在最后的“对应就”处不相等,“其余则”即为将执行转移到达的位置,并执行到“而后”之间的内容。在编译时,“其余”编译一个“跳转”,保留转移偏移量,并留下参数和n2。“其余则”还通过计算从到“可用地址”的偏移量,和将其存入中,以决定在“对应就”处的未决定前向“0跳转”。在“如和…而后”的结构中“其余则”是最后必须出现的结构,它表明在没有匹配项时,程序应该执行“其余则”部分。
而后 n--- (若不相符) 编,即,
--- (如果相符)
…n--- (编译时)
在运行时,如果输入值不等于任何“如和”、“而和”值,“而后”就清除该输入值。“而后”并成为前面所有“而和”或“其余则”的前向转移目标。在编译时,“而后”编译“♀”,然后直至“而和”和“其余则”留下的所有地址被解析完,才计算前向转移的偏移。最后,还原由“如和”保留的“暂摞→”数值。
10.2 循环
10.2.1 固定循环
+回环 n--- (运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
循环… n+回环
n被加到循环指数之上,如果新的指数被增大到“限定值-1”和“限定值”的边界。循环被终止而循环控制被舍弃。当循环被终止时,控制结构转移到相应的“循环”之后。
循环 n1 n2--- (运行时) 编,即,
--- (编译时)
使用形式:
循环…回环
或
循环…+回环
开始运行由控制结构终止的循环。循环指数从n2开始,并按限定值n1终止。循环至少执行一次。
?循环 --- (运行时) 编,即,
--- (编译时)
使用形式:
?循环…回环
或
?循环…+回环
开始运行由控制结构终止的循环。如果限定值与循环指数一开始就相等,不执行循环而且控制立即转到相应的“回环”或“+回环”之后。
回环 ---(运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
循环…回环
固定循环指数是逐一递增。如果递增的指数超出“限定值-1”和“限定值”的边界。循环被终止而循环控制被舍弃。当循环被终止时,控制结构转移到相应的“循环”之后。
内环数 ---n 编,
用于“循环…回环”之中,以拷贝最内层循环指数到数摞顶层。参见
“外环数”。
外环数 ---n 编,
拷贝下一层循环的循环指数到数摞顶层。仅可用于下列嵌套的“循环…回环”中:
循环…循环…外环数…回环…回环
10.2.2 不定循环
环首 --- (运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
环首…就出来
环首…回首
环首…就继续…重复
运行时,“环首”标记一个可以被重复执行序列的开始。它也作为相应的“就出来”或“重复”的返回点。当执行“就出来”时,如果数摞顶为“假”,就返回到“环首”;而对于“回首”和“重复”则总是回到“环首”。
回首 n--- (编译时) 编,即,
在“编”与“。”中使用,其形式为:
环首…回首
在运行时,“回首”迫使执行返回到相应的“环首”,对数摞无影响。典型的使用条件是执行“终止”、“全复位”或“复位解释”来终止此循环。
就出来--- (运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
环首…就出来
在运行时,“就出来”控制条件转移回到相应的“环首”。如果为“假”,执行返回到“环首”之后;如果为“真”,继续向前执行。
就继续--- (运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
环首…就继续(真部分)…重复
在运行时,“就继续”依照数摞上的逻辑选择条件执行。如果为真(非零),“就继续”执行“真”部分,直到“重复”,随后由“重复”转移返回“环首”。如果为“假”执行到“重复”之后的存在的程序结构中。
重复 --- (运行时) 编,即,
--- (编译时)
在“编”与“。”中使用,其形式为:
环首…就继续…重复
运行时“重复”无条件转移回到相应的“环首”之后。
10.3 程序的退出
出循环 ---
执行转移至下一个“回环”或“+回环”外的代码。循环被终止而循环参数被舍弃。仅可使用形式:
循环…出循环…回环
或:
循环…出循环…+回环
在上面的例子中,“循环”可以用于“?循环”取代,“出循环可以用于嵌套在固定循环中的其它控制结构中,在一个固定循环中可以有几个“出循环”。
终止 ---
终止执行当前“编”定义的词。控制返回到下一个外层“编”定义,
不可用在固定循环中。
复位解释 ---
清除暗摞,设置解释状态,接受从当前输入设备来的新输入,并开始文本的解释。
全复位 ---
清除数摞,并把控制转移到“复位解释”。
11 词定义
编 ---
使用形式:
编……。
选择检索词汇支“支→→”与编译词汇支“编译支→”相一致。在“编译支→”中生成的词典单元项目,并设置编译模式。在输入流中的后随的非立即执行词汇的编译地址被存入词典单元,当以后调用词时,非立即执行词时才被执行。立即词则是一遇到就被执行。对新生成的词汇定义在成功处理相应的“。”或“。汇编”之后才能从词典单元中查出。如果某一词汇在“支→→”和“汉语根”词汇支中检索后还找不到,则按当前数基进行数字的转换和编译,如果转换再失败,则存在错误条件并异常终止编译。
。 --- 编,即,
--- (编译时)
停止一个“编”定义的编译,使这个“编”定义的可以在词典单元中合法的查出,设置解释状态并编译“终止”。
建词头 ---
定义词汇使用形式:
建词
生成的词典单元项目。在生成之后,下一个可利用词典单元就是的实体域中的第一个字节。随后执行时,的实体域中的第一个字节的地址被留在数摞顶层。“建词”并不给的实体域分配空间。
动作 --- 编,即,
---
定义一个词在执行时动作,而该词是由高级定义词所生成的。其使用形式:
编……动作…。
随后是:
其中是“建词”或者执行“建词”的任何用户定义的词汇。“动作”标记定义词汇定义部分的结束。并接着开始对那些以后用定义的词在执行时的动作进行定义。当以后执行时,的实体域地址被放在数摞顶层,执行“动作”和“。”之间的词汇序列。
为 n---
定义词汇的使用形式:
n为
它生成词汇,在它的实体域中含有常数n。当以后执行时,它将数值n放在数摞的顶层。
双数为 d---
定义词汇的使用形式:
d为
它生成词汇,在它的实体域中含有常数d。当以后执行时,它将32位数值d放在数摞的顶层。
变量: ---
定义词汇的使用形式:
变量:
执行变量时,它生成的定义并在它的实体域中分配两个字节。
当以后执行时,实体域地址留在数摞的顶层。
双变量: ---
定义词汇的使用形式:
变量:
执行变量时,它生成的定义并在它的实体域中分配四个字节。
当以后执行时,实体域地址留在数摞的顶层。
12 汇编语言
(。汇编)---
由“。汇编”编译的运行过程,它把最近定义的词汇的属性域地址重写入指向随后的机器代码序列。参见“。汇编”。
。汇编 --- 编,即,
使用形式:
编…建词…。汇编…汇编。
停止编译,终止对的定义而执行汇编程序部分。当用以下形式:
为定义新词汇而执行,的执行地址将包括中“。汇编”后的机器代码序列的地址。任何的执行都将使此代码序列被执行。参见“汇编”和“动作”。
汇编 ---
定义词的使用形式:
汇编……汇编。
为生成一个词头,它是由后面的汇编语言词序列定义的。如此定义的词称为代码定义。
汇编。 ---
终止一个代码定义,并允许在词典单元中找到对应代码定义的。
13 词典单元管理与解释编译
13.1 词典单元管理
13.1.1 词典单元管理
释放 ---
执行形式:
释放
如果在编译词汇支中找到,从词典单元中删除词,和在这个后面定义所有词汇,不管它们的词汇支。如果没找到,显示错误。
词汇中定义---
使用形式:
词汇中定义
把编译词汇支改为与当前检索顺序中第一个词汇支相同。
汉语根 --- 即,
主词汇支的名称。执行“汉语根”时它成为检索顺序中的第一个词汇支。“汉语根”是初始编译词汇支,并且是检索顺序中的第一个词汇支。新定义成为“汉语根”词汇支的一部分,直到不同的编译词汇支被建立。
13.1.2 词典单元指针
暂摞→ ---
它是暂时存放数摞指针位置的用户变量。用于检查编译错误。
编译支→ ---
它把指定编译词汇支的用户变量的地址留在数摞顶层。参见“词汇中定义”。
支→→ ---
含有指向词汇支指针的变量,这个词汇支是当前检索顺序中的第一个词汇支。
固词→ ---
具有的用户变量,在该地址以下的词典单元内容不能用“释放”删除。若要去掉该地址以下的内容,用户可以更改“固词→”中的内容。
词典→ ---
典单元指针变量,它包含词典单元中下一个自由存储地址。其数值也可以由“可用地址”读出并可以用“字节空出”更改。
13.1.3 地址域变换
>实体域 ---
将属性域地址(编译地址)转换为相应的实体域地址。
链域>名域 ---
将连接域地址转换为相应的名称域地址。
名域>链域 ---
将名称域地址转换为相应的连接域地址。
名称> ---
将名称域地址转换为相应的属性域地址。
链域> ---
将连接域地址转换为相应的属性域地址。
>链域 ---
将属性域地址转换为相应的连接域地址。
13.2 解释编译及控制
13.2.1 词的解释编译
( --- 即,
使用形式:()
以右括号“)定界符中的“”,被认为是注释。对注释不进行任何处理。左括号“(”后面的空格符不是“”的一部分。在解释或编译时可以随意地使用“(”。“”中的字符数是从零直到输入流中结束括号前所保留的字符数目。参见“显(”。
显( ---
---(编译时)
使用形式:
显()
在选定的当前输出设备上显示字符“”,但不包括右括号结尾定界符“)”。符号“显(”之后的空格符不是“”的一部分。参见“显″”。
编译 --- 编,
当执行含有“编译”的词汇时,在“编译”之后的词汇的执行地址被拷贝(编译)到词典单元的当前可用地址处。它允许在对执行地址(这是解释程序所作的)简单编译中,加入对具体编译状态的处理。一般用于立即词执行的词汇。参见“如和”语句原码的实例。
强编译 --- 编,即,
--- (编译时)
“编”定义中使用的形式:
编…强编译…。
其中已预先被标记为“立即词”。“强编译”将迫使对立即词的编译,否则立即词将在编译过程中执行。
找 ---
使用形式: 找
留下词典单元中该词汇的属性域地址。如果在当前的检索顺序中没有找到就给出错误提示。
找编 ---(运行时) 编,即,
--- (编译时)
使用形式:
找编
的编译地址作为数值被编译。当后来执行定义时,把该留在数摞的顶层。如果在当前的搜索顺序中未找到,则发出错误信息。
立即词 ---
标记最近作出的定义词为立即词。以便在编译时一旦遇到这个定义就立即执行经,而不进行编译,即在这个最新词的名称域地址单元中疫立了优选位。此方法允许定义处理非常编译情况,而不是将它们建成基本可编译词。用户可半“强编译”放在被“立即词”说明过的词之前以迫使它们被编译。
编解态 ---
具有编译或解释状态的变量。非零表示编译,零表示解释。
进编译 --- 编,即,
设置编译状态。随后编译来自输入流的文本。参见“数编译”、“进解释”。
进解释 --- 即,
--- (编译时)
设置解释状态。参见“数编译”、“进编译”。
屏蔽 ---
在此后定义中,用于设置定义的名称域中的“屏蔽位”。它防止在词典单元检索中取出不完整的定义,直到编译完成无误为之。
解屏蔽 ---
使词典单元检索中可以访问最近定义词汇。一般在执行“。”时将这个词赋予合法性。
执行 ---
将数摞顶层的作为一个词的属性域地址去执行这个词。属性域地址也可以称为编译地址。
匹配否? n1 n2---
如果n1不等于n2,发出错误信息。该信息表明编译条件不匹配。
全复位″“--- 编,即,
--- (编译时)
使用形式:
全复位″″
当以后执行时,如果为“真”,由后引导 “″”结尾符定界的将被显示,接着执行“全复位”的异常终止顺序。如果标志为“假”,除去而继续向前执行。“全复位″”之后的空格符不是的一部分。
13.2.2 数的解释编译
立即数 ---n 编
“立即数”是由数编译的,其后随有16位的数 值。在运行时,“立即数”将该16位数值留在数摞要面层。
数编译 ---n 编,即
n---(编译时)
“编”定义中典型使用形式:
进解释16b进编译数编译
编译一个系统相关的操作,以便后来执行“编”定义的词时半n留在数摞顶层。
双数编译 ---d 编,即
d--- (编译时)
在编译“立即双数”时,将留在数摞中的整体上双精度整数编译成“立即双数”的参数。当以后执行时将双精度数d留在数摞顶层。
编译数 d---
将数摞顶层的一个双精度数 d以立即数的形式编译到当前可用的词典童蝇去。如果“小数位”中的值为-1就以单精度的形式编译,否则就以双精度的形式编译。编译单精度数占用了两个四个字节,前两个字节为词“立即数”的属性地址,后一个字节为单精度数的二进制代码。双精度数的编译占据六个字节,前两个字节为“立即双数”的属性域地址,后四个字节为双精度数的二进制代码。
变立即数 d---N(“小数位”中的值为-1)
d---d (“小数位”中的值为非-1)
将数摞顶层的双精度数d按“小数位”中的单双精度标志分别处理为单精度数n或双精度数d放在数摞顶层。
立即双数 ---d 编,即
是“双数编译”的运行例行程序,它将一个32位数值放在数摞顶层。
ASCII ---
--- (编译时)
使用形式:
ASCII
其中的定界符是空格符。在解释中,的ASCII码值留在数摞顶层,其高8位为零。在编译中,是作为文字被编译的,
所以后来执行“编”定义时,的ASCII码值被留在数摞顶层。
在词典单元中编译“立即双数”的后四个字节是数值d。
14 系统管理
冷启动 ---
热启动 ---
作为调整词典单元指针到最低地址和通过“全复位”重新启动的过程。可以从终端调用,以除去应用程序和重新启动。
摞出界? ---
如果数摞超出了限定的范围,发出错误信息。
类错? n ---
如果为“真”,发出n类错误信息。
摞→写 ---
摞→读 ---
将数摞顶层地址送回到数摞顶层的与计算机相关的过程,所说的数摞顶层的地址是指在执行“摞→读”之前的地址,例:
12摞→读 读 显 显 显 将 打印 221
暗摞→写
按数摞值初始化暗摞指针。
暗摞→读 ---
将暗摞指针寄存器当前值留在明数摞顶层。
暗摞底 ---
含有“暗摞指针”初始值的任务变量。参见“暗摞→写”。
明摞底 ---
含有“数摞指针”初始值的任务变量。参见“摞→写”。
15 工具及显示
看内存 ---
以十六进制和ASCII码显示存储到+中的内容。
看词 ---
列出当前检索顺序中第一个词汇中的全部定义名称。
16 端口操作
端口写 X---
输出参数X到的端口,其输出可能是八位或十六位,要根据具体的机器和版本而定。
端口读 ---X
从输入输出口读入一个参数X到数摞顶层。其读入的数值可能是八位或十六位要根据具体机器和版本而定。
汉语计算机系统,汉语编程单片机的计算机系统相关推荐
- 现在汉语也能编程了!学编程,英语还重要吗?
很多想要学编程的小伙伴,却因为英语而却步,今天播妞就跟大家聊聊,学编程,英语真的很重要吗? 其实,不考虑代码的可读性.兼容性和逼格的话,我们完全可以用汉语.古希腊文编程!不信的话,我们可以试试用汉语编 ...
- 如何正确使用计算机提纲,计算机系统操作论文大纲格式 计算机系统操作论文提纲如何写...
为论文写作提供[100个]计算机系统操作论文大纲格式,海量计算机系统操作相关论文提纲,包括专科与本科以及硕士论文提纲,解决您的计算机系统操作论文提纲如何写的相关难题! 五.基于ARM的嵌入式Linux ...
- c语言delay_利用C语言编程单片机,制作可以根据环境光照调整亮度的智能灯
上一节,我们利用C语言编程单片机仿制了达文西的"古怪手电筒",达成了"在有光的时候就会亮,在没有光的情况下绝对不会亮!"的目标. 其实在此基础上,C语言还能做些 ...
- 常用计算机系统包括,常用的保护计算机系统的方法有()。
相关题目与解析 以下那个不是常用的保护计算机系统的方法()A.禁用不必要的服务B.安装补丁程序 在()中规定了计算机系统安全保护能力的五个等级. 随着计算机应用的深入,开发各种不同的企业内部信息管理系 ...
- 看我用汉语编程(汉语Visual Basic编程软件发布)
http://baike.baidu.com/view/14260.html?tp=0_01 Visual Basic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言.从任何标准来说, ...
- 深入理解计算机系统:网络编程 上
一直以来对计算机网络比较感兴趣,但是无奈大学计算机网络的学习非常表面,已经忘得差不多了.毕业后读了一些网络方面的书,对网络知识的冰山一角有了一些感悟. 随着网络方面的书越读越多,不懂的地方也越来越多. ...
- 汉语写代码编程与为什么很多软件有简体中文版
软件不是需要用英文代码写吗? 写好的软件不是应该为英文的吗? 为什么会有简体中文版的呢? 编译器编译的时候是怎么认识汉字的呢? 如果字符串支持中文的话?那是不是也会支持汉语.日文.甚至支持其他语言? ...
- CSAPP 并发编程 ——深入理解计算机系统
12.3 基于线程的并发编程 到目前为止,我们已经看到了两种创建并发逻辑流的方法. 在第一种方法中,我们为每个流使用了单独的进程.内核会自动调度每个进程. 而每个进程有它自己的私有地址空间,这使得流共 ...
- 深入理解计算机系统:网络编程 下 一个简单的web服务器
编写一个web服务器的基础是熟悉套接字接口.笔者因为还没有对其进行实践,只对其有一些粗浅的了解.本文重点记录一个web服务的核心功能主要由哪几部分组成. 1. main函数 之前写到,从客户端到服务器 ...
最新文章
- ZOOKEEPER安装及测试
- golang sql查询获取结果集个数
- 完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示......
- 网狐棋牌客户端连接服务器修改方法6,网狐游戏服务器 客户端连接
- 多线程:中断(interrupt、interrupted、executor)
- base64图裁剪 php_世界上最好的编程语言PHP图层裁剪服务搭建详解
- 笔记函数 - 判断内存是否有效
- 《Java 高并发》02 多线程的特性
- CentOS 6.5 生产环境编译安装LNMP
- 致我们终将逝去的39%“峰值性能”!
- centos7.5 su: 无法设置组: 不允许的操作(实测补充)(这是乱获取权限导致的,要注意权限问题)以及推荐文件操作
- python中random库
- 【codevs1907】【方格取数3】二分图最大带权独立集
- The Child and Toy
- gamma软件linux安装图示,[转载]linux下安装GAMMA软件
- mysql触发器新增或修改_mysql触发器实例 插入数据前更改数据值
- flink读取不到文件_Flink读取本地文件
- oracle学习札记95
- html5 retina 1像素,7种方法解决移动端Retina屏幕1px边框问题
- ResNet50修改网络适应灰度图片并加载预训练模型