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的文档(或者至少我没有找到任何文档),当出现问题时,编译器不会给出有用的错误消息。这里有一些代码示例,但我无法得到一个简单的程序来编译。我的意思是,我知道这只是一个有人免费分享的爱好项目,但在目前的状态下,它很难使用。