vla*_*fol 5 compiler-construction interpreter bytecode llvm-ir jvm-bytecode
我玩了一个很棒的沙盒塔防游戏Mindustry。
很酷的事情是您可以使用游戏嵌入式处理器块来控制单元。你可以命令他们建造积木、在地图上巡逻、包围最弱的敌人、治疗朋友并将弹药带到炮塔。
有一些示例如何对此类块进行“编程”:
一些“文档”可以在这里找到:
问题是处理器“语言”非常原始。只有一个控制语句:jump-to-line-if-statement-is-true. 没有 if/else 语句,没有 for 循环,没有函数和类。因此,使用这些指令编写任何复杂的东西几乎是不可能的。
所以我的想法是让我自己的简单编译器从“真正的”编程语言(带有 if、else、for、function、struct/class)到这些原始指令,然后将其导出到游戏中。
我的第一个想法是在 Mindustry 中实现 JVM 或 LLVM-IR VirtualMachine 来运行编译后的字节码,但它看起来很复杂。这些字节码中有很多指令。
然后我考虑实现 Lua 或简化的 Python 解释器,它看起来是可能的,但无论如何这是一项艰巨的工作:-)
我很好奇最简单的方法:-) 也许有基于 ~10 条指令或一些示例项目的简化 JVM/LLVM 字节码,或者在 Brainfuck 或一些有限的架构上运行 Lua/Python :-)
====嵌入式CPU语言====
所以控制指令集是:
op add result x y~ result=x+y- 将变量设置为 arifmethics 操作的结果 + - * / < > % == min max 等@counter,它是执行行的一行,您还可以设置此变量的值以跳转到任何特定行jump cond lineNo-lineNo如果cond为真则跳转到行也可以执行某种可重用的程序,例如
op add retAddr @counter 1 # Save where we will continue after the function returns by adding 1 to the counter
set @counter myFunc # Jump to the line representing myFunc
...
set @counter retAddr # Return to the line set earlier after the function is called
Run Code Online (Sandbox Code Playgroud)