如何解决Mindustry Game CPU 架构的最简单编译器
很酷的事情是您可以使用游戏嵌入式处理器块来控制单元。您可以命令他们建造积木、在地图上巡逻、包围最弱的敌人、治疗朋友并将弹药带到炮塔。
有一些例子说明这些块的“编程”是怎样的:
- https://www.youtube.com/watch?v=6v8Fnt1NEs8
- https://www.youtube.com/watch?v=ldkwofrGxyE
- https://www.youtube.com/watch?v=UFK5m6qKT6U
可以在此处找到一些“文档”:
- https://www.reddit.com/r/Mindustry/comments/ic9wrm/logic_in_60/
- https://mindustrygame.github.io/wiki/logic/3-variables/
- https://www.youtube.com/watch?v=EDfv_oM_TbE
问题在于处理器的“语言”非常原始。
只有一个控制语句: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语言====
所以控制指令集是:
- read - 从 PermanentStorage 地址读取数据到变量
- write - 将数据从变量写入到 PermanentStorage
- set - 设置变量数据
- link - 从数组中获取第 i 个元素
- operator
op add result x y
~result=x+y
- 将变量设置为 arifmethics 操作的结果 + - * / % == min max etc - 特殊变量
@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
解决方法
不可能为任何语言实现完整的编译器,因为动态内存管理实际上是不可能的。不过,https://pypi.org/project/minpiler/ 是一个好的开始。
注意网站上的空洞:
您将无法使用大部分 Python。所有的限制都来自 Mindustry 处理器架构:
- 没有数据结构,只允许使用标量值(浮点数或不透明对象)。唯一的例外是表现为固定大小的浮点数组的内存单元。
- 你不能间接访问变量,没有指针,没有 getattr。
- 前者的后续,不可能实现动态内存/堆栈(至少没有内存单元)。这使得列表、迭代器、类、闭包和其他事情变得不可能。
- 内置函数集非常有限,您只能调用游戏中可用的内容(M.print、M.draw.clear 等)
已经有一个非常有用的 Mindustry 编译器(称为 mindcode):https://github.com/francois/mindcode
编译器可与此 Web 应用程序一起使用: http://mindcode.herokuapp.com/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。