GithubHelp home page GithubHelp logo

i-rinka / bitoy-language Goto Github PK

View Code? Open in Web Editor NEW
0.0 2.0 0.0 9 KB

这是为BIToy OS设计的专用的编程语言,目的是通过是通过较少的指令、简单的语法模拟一个图灵完备的语言。

License: MIT License

C 97.34% Makefile 2.66%

bitoy-language's Introduction

BIToy Language

这是为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的值变为10
      • C=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

解码器盒图:

bitoy-language's People

Contributors

i-rinka avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.