精英盒子 -> 程序设计 -> jb256语言语法参考 [打印本页]

jybox 2011-12-12 23:36

jb256语言语法参考

JB256JB256是一个解释运行(本人没能力写编译器,但理论上可以编译运行),可以直接操作(虚拟)内存的偏底层语言.

256表示目前版本的JB语言只能进行256以内的无符号整数的算术运算,且只有256B的虚拟内存,不支持中文等多字节字符集.

ps.理论上,运算范围和内存空间可以无限大,只不过我们不建议用它编写过大的程序,因为这将会产生严重的连带副作用————蛋痛.



注意!由于本人能力有限,以上和以下的术语可能并不准确,请见谅.大家自行脑补
JB256没有标识符,只有下面3个关键字,4个运算符,和两个转义符号.



-------------------------
关键字,其实是3个寄存器(初值为0):
jb (主控制器)负责执行命令
da (蛋A)寄存器A
db (蛋B)寄存器B



运算符
++    值翻倍(乘2)(对应字节码0-63)
--    值减倍(除2)注:若出现小数,一律进位(对应字节码64-128)
+    值加一(对应字节码129-191)
-    值减一(对应字节码192-255)





转义符号,空格或者斜杠,作用是一样的:
当有两个连续加号的时候,解释器会认为它是一个“值翻倍”,如果你确实要表示两个“值加一”,请在它们中间用空格或斜杠分割





虚拟内存,JB256有256块虚拟内存,每块虚拟内存可以保存一个0-255的无符号整数。内存的初值为0
其中第256块(索引是255)是只读内存,内容始终是当前执行到的位置的指针





运行过程
jb、da、db分别在三个时间轴上运行,每个单位时间内,向前执行一个计算,然后以jb的值为命令号,da和db的值为参数,来执行系统调用。然后将执行指针向前移动一格,继续执行。
jb、da、db的命令长度必须等长,在运行的时候,他们会被加载到内存中,内存中储存的是它们的字节码(前面已提到)。
它们在内存中的位置是这样:jb1、da1、db1、jb2、da2、db2、jb3、da3、db3.
理论上可以存储75组命令(75*3=255,最后的一块是只读内存),但实际上,运行时你可以动态地擦写内存,写入命令,移动当前执行指针,或用这些内存存储数据







---------------------------
命令表(命令号即为jb的值)
空     1、2、3、4、6、8
交换A和B的值     7
A+B,结果存储到A(B中存储进位次数)    16
A-B,结果存储到A(B中存储借位次数)    17
A*B,结果存储到A(B中存储进位次数)    18
A/B,结果存储到A(出现小数则进位)    19
A%B,结果存储到A     20
A&B,结果存储到A     21
A|B,结果存储到A     22
A^B,结果存储到A     23
A&&B,结果存储到A     24
A||B,结果存储到A     25
A^|B,结果存储到A     26
!A,结果存储到A     27
~A,结果存储到A     28
将A的值写到内存B处     5
将内存B处的值读入A     9
从键盘读取A个字符写入到B处开始的内存中 10
显示从内存B处开始A个字符     11
从键盘读取整数到A     12
显示A的值     13
跳至B处的内存开始执行     15
如果A的值非零,跳过下一条命令    14
退出程序     其他所有值







看不懂?没关系,这本来就是**专用语言,下一章将用一个例子来讲解,大家就会明白了


我们拿出最初的那个例子程序
jb+/+4-+4--+-++--+/+/++-3+4--+4-+4
da+9+3-+/+4-+/+/+/+-+/+3/+/++-+4
db+9+7-+-+-/-+/+/+/++-+9+前面介绍的时候没有提到数字,其实数字是一种缩写形式+9即代表9个连续的加号,注意,如果加号中间有斜杠或空格,不能用数字来缩写





刚刚忘记说了,重复一下,它的功能是从标准输入读入两个数字,然后在标准输出显示它们的和
下面我们去除缩写形式,大概是下面的样子
jb+/++++-++++--+-++--+/+/++---++++--++++-++++
da++++++++++++-+/++++-+/+/+/+-+/+++/+/++-++++
db++++++++++++++++-+-+-/-+/+/+/++-+++++++++++







从标准输入读入两个数字,然后在标准输出显示它们的和,流程大概是这样的
读入一个数字到A(命令12)
交换A和B的值(命令7)
读入一个数字到A(命令12)
A+B,结果存储在A(命令16)
输出A的值(命令13)







然后我们对它进行断句
[attachment=202]

看13楼,这个程序中其实没怎么用到蛋A和蛋B的值,所以接下来我们关心一下jb的运行过程
[attachment=203]



楼上新增了三行
从上到下
第一行是那条命令执行之后jb的值
第二行加星号的是在那里调用了系统函数(未加星号的表示jb的命令号是空命令)
加井号的表示这一行是必定被跳过的(也就是在执行14号命令的时候,蛋A的值必定非0)





其中在第6个命令、第10个命令处发生了读入(其中第8个命令还交换了蛋A和蛋B的值),第14个命令处发生了加法计算,22个命令处进行了输出,24个命令进行了退出
但除了这些预定要执行的命令之外,还有很多其他不必要的命令,比如16处的交换,17和20处的跳过,23处的按位异或。这些就是jb语言的蛋痛所在,为了达到既定的目标,大多都需要执行很多不必要的命令,如何让这些额外的命令不对既定流程造成影响,就是jb的难点所在


ok,教程就到这里




whtsky 2011-12-13 19:13
某花痴女:“我不要ruby,我不要perl,我要jb!”

jybox 2011-12-13 19:46




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.047107 second(s),query:5 Gzip enabled