Compiler construction Mindustry游戏CPU架构的最简单编译器
我玩了一个奇妙的沙箱塔防御游戏 最酷的是,你可以使用游戏嵌入式处理器块来控制单元。你可以命令他们建造街区,巡逻地图,包围最弱的敌人,治疗朋友,把弹药带到炮塔 有一些示例说明了此类块的“编程”是如何进行的:Compiler construction Mindustry游戏CPU架构的最简单编译器,compiler-construction,bytecode,interpreter,llvm-ir,jvm-bytecode,Compiler Construction,Bytecode,Interpreter,Llvm Ir,Jvm Bytecode,我玩了一个奇妙的沙箱塔防御游戏 最酷的是,你可以使用游戏嵌入式处理器块来控制单元。你可以命令他们建造街区,巡逻地图,包围最弱的敌人,治疗朋友,把弹药带到炮塔 有一些示例说明了此类块的“编程”是如何进行的: 可在此处找到一些“文档”: 问题是处理器“语言”非常原始。 只有一条控制语句:如果语句为true,则跳转到第行。 没有if/else语句,没有for循环,没有函数和类。所以用这些指令几乎不可能写出任何复杂的东西 所以我的想法是制作我自己的简单编译器,从“真实”编程语言(带有
如果语句为true,则跳转到第行。
没有if/else语句,没有for循环,没有函数和类。所以用这些指令几乎不可能写出任何复杂的东西
所以我的想法是制作我自己的简单编译器,从“真实”编程语言(带有if、else、for、function、struct/class)到这些原始指令,然后在游戏中导出
我的第一个想法是实现JVM或LLVM-IR虚拟机,以便在Mindustry中运行编译的字节码,但它看起来很复杂。这些字节码中有很多指令
然后我考虑实现Lua或简化的Python解释器,这看起来是可能的,但无论如何,这是一项艰巨的工作:-)
我对最简单的方法很好奇:-)
可能存在基于~10条指令或一些示例项目的简化JVM/LLVM字节码,或者在Brainfuck或某些有限的体系结构上运行Lua/Python:-)
==嵌入式cpu语言====
因此,控制指令集为:
- 读取-将数据从永久存储地址读取到变量
- 写入-将数据从变量写入永久存储器
- 集合-集合变量数据
- link-从数组中获取第i个元素
- 操作员
op add result x y
~result=x+y
-将变量设置为操作结果+-*/<>%==min max等
- 特殊变量
@counter
是执行行的一行,您还可以将此变量的值设置为跳转到任何特定行
jump cond lineNo
-如果cond
为真,则跳转到行lineNo
此外,还可以执行一些可重用的过程,如
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
不可能为任何语言实现完整的编译器,因为动态内存管理实际上是不可能的。然而,这是一个良好的开端
注意现场的空穴:
您将无法使用大部分Python。所有的限制都源于商业
处理器体系结构:
没有数据结构,只允许标量值(浮动或不透明对象)。唯一的例外是作为固定大小浮点数组的内存单元
你不能间接访问变量,没有指针,没有getattr
继前者之后,不可能实现动态内存/堆栈(至少在没有内存单元的情况下)。这使得列表、迭代器、类、闭包和其他事情变得不可能
内置设置非常有限,您只能调用游戏中可用的设置(M.print、M.draw.clear等)
Mindustry已经有一个非常有用的编译器(称为mindcode):
编译器可用于此web应用程序:
您已经获得了目标语言,因此涉及不同的目标语言(JVM字节码或LLVM-IR)似乎是一个不必要的复杂问题。我希望将一些“真实”语言编译成嵌入式语言)围绕“真实”的可怕引语令人困惑。你是说像Java或Python这样的现有知名语言,还是一种具有if,else,for,function,struct/class的特殊语言?好吧,那么如果你的源语言不是Java,目标语言不是JVM字节码,为什么你要把JVM字节码引入问题中?编写一个编译器,将您的特殊结构化语言翻译成Mindustry控制语言,而不用担心其他语言/格式。(除了编写编译器所用的语言之外,它可以是任何你喜欢的语言。)指令的数量肯定不是问题的关键。Java字节码中有大约200条指令,将它们映射到任何其他指令集体系结构可能是一天的工作。真正的挑战是线程和垃圾收集堆的实现,以及包含未在字节码中实现的方法(但JVM内部操作或JNI)的大型库。可以定义一堆变量a0、a1、a2、a3、a4
,然后使用跳转技巧通过索引访问它们,参见m=7的示例;n=3;这里:只有大约100行代码!太简单了,这是我需要的@弗拉基米尔:你应该回答这个问题。我之所以找到它,是因为您的评论还有一个警告:没有API的文档(或者至少我没有找到任何文档),当出现问题时,编译器不会给出有用的错误消息。这里有一些代码示例,但我无法得到一个简单的程序来编译。我的意思是,我知道这只是一个有人免费分享的爱好项目,但在目前的状态下,它很难使用。