这是为BIToy OS设计的专用的编程语言,目的是通过是通过较少的指令、简单的语法模拟一个图灵完备的语言。
目前版本的语言运行时为机器上的C语言,暂未实现使用BIToy OS的内存系统作为语言的内存管理。
源代码扩展名:.bty
语法类似汇编,使用解释执行的方式运行。
一条语句由指令码
+操作
组成(指令码与操作之间隔着一个空格),如:
JMP C
:跳到第C行语句
准备实现使用#
来做注释
指令码 | 说明 |
---|---|
JMP X |
指令跳转到第X 行 |
IF 逻辑表达式 |
如果满足逻辑表达式,则执行IF后紧跟着的一行,否则执行IF后的第二行 |
NUM A,B,C,D |
声明变量A ,B ,C ,D |
OP B=A+B |
将A +B 的结果存入B 内 |
PRT B |
将B 的值输出到终端 |
END 0 | 程序结束,并返回值0 |
-
如果读到了无法解码的操作(比如空操作),则忽略错误,自动让指针+1
-
JMP指令用于实现代码的跳转,让程序从当前执行跳到给定行并继续执行
- 如果JMP给出的行数非法,比如JMP后紧跟了一个远大于代码行数的数,则这条JMP操作放弃执行,不跳转。并抛出一个越位警告。
- JMP后跟着的行数可以是一个变量,也可以是一个数
- 比如
JMP 2
:跳转到第二行
- 比如
- 同时JMP后面的数可以使用
+
、-
来修饰,达成相对行数的跳转- 比如
JMP -2
:跳转到JMP这行的前两行(跳转到JMP所在的行数-2的那行)
- 比如
- 通过JMP操作和IF操作配合使用,可以实现程序的循环。
-
IF指令用于实现逻辑表达式的判断
-
逻辑表达式的运算符是C-Like的,比如:
<=
小于等于>=
大于等于==
等于||
或操作&&
与操作
-
虽然目前程序并没给定布尔类型的变量,但是仍可以通过逻辑表达式来判断IF的真假
-
如果IF操作为真,则跳转到IF后紧接着的一行,否则执行IF后后的第二行。比如:
-
1 NUM A 2 OP A=A+1 3 IF A>1 4 JMP +2 5 JMP 2 6 PRT A
-
在这个例子中,第3行的判断中,如果A的值不大于1,逻辑表达式为假,则会执行第5行代码(IF后的第二行)
JMP 2
跳转程序到第二行执行;如果A的值大于1,逻辑表达式为真,则 执行第4行代码,意思为跳转到4+2=5
也就是第六行代码。 -
事实上,IF后紧挨着的JMP常常跟着+2来跳过IF非分支的执行
-
-
NUM指令用于声明变量
- 可以把声明的变量看作是声明了一个寄存器,而变量名是这个寄存器的唯一标识
- 声明变量后,变量的默认值为0
- 变量只能先声明后使用
- 如果使用了非法的变量,则会返回0值
- 变量名区分大小写
- 保留的变量名:
ANS
- 待实现数组的声明
- 目前的一个NUM桶是32位
-
OP 指令用于操作
-
可以实现赋值、加减乘除运算、带括号运算。实现原理为运算式数
C=10
让寄存器C的值变为10C=A+B+D
让寄存器的值为A+B+D的运算结果C=(A+B)*C
让寄存器的值为(A+B)*C的运算结果
-
在计算时如果引用了一个非法的变量,则会返回值0
- 比如
C=A+B
中,假如变量A没有提前声明,则默认执行为0+B=C
- 比如
-
如果操作结果没有指定对象,则会默认将结果保存在
ANS
中-
比如
OP A+B
,则你可以使用ANS
(一个预声明的寄存器)来引用结果的值 -
1 OP 1+2+3*(4+5) 2 PRT ANS
-
输出为
30
-
-
-
PRT 用于打印对应的数据
-
END 为程序运行的终点,执行到END后,程序停止退出,并返回END后紧跟着的值
-
声明一个解释器对象,方便后续移植
-
变量的寄存器先使用链表,日后如果有机会可以使用平衡二叉树
- 通过输入变量名找到对应的寄存器的地址
-
使用计算树来实现运算的操作
-
使用指针来执行当前代码A
解码器盒图: