Mindustry Game CPU 架构的最简单编译器

如何解决Mindustry Game CPU 架构的最简单编译器

我玩了一个很棒的沙盒塔防游戏 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语言====

所以控制指令集是:

  • 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 处理器架构:

  1. 没有数据结构,只允许使用标量值(浮点数或不透明对象)。唯一的例外是表现为固定大小的浮点数组的内存单元。
  2. 你不能间接访问变量,没有指针,没有 getattr。
  3. 前者的后续,不可能实现动态内存/堆栈(至少没有内存单元)。这使得列表、迭代器、类、闭包和其他事情变得不可能。
  4. 内置函数集非常有限,您只能调用游戏中可用的内容(M.print、M.draw.clear 等)
,

已经有一个非常有用的 Mindustry 编译器(称为 mindcode):https://github.com/francois/mindcode

编译器可与此 Web 应用程序一起使用: http://mindcode.herokuapp.com/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?