大家好!

这是我最近一直在开发的项目,用于更好地了解解释器。

项目名为GMLVM,一款功能齐全的(几乎)GML解释器,使用纯GML编写并在GML中运行。

它能做什么?

它可以将GML代码转换为字符串,自增结构和其他(可选)结构,并在运行时像原生代码一样运行。可以想象成像execute_stringeval(从JS)。

它为你提供了在游戏中添加模组化功能的机会,而不强制玩家构建外部DLL或处理复杂的LUA绑定。

主要特性

  • 完全语法支持:循环(forwhiledo/until),条件语句,switchtry/catch/finally,以及现代操作符(??)。
  • 数据结构:支持数组,结构和[? ].map/[| ]列表访问。
  • 函数及闭包:第一级函数,递归和良好的词法范围(闭包按照预期运行)。
  • 构造函数及继承new关键字和: Parent()构造函数继承。
  • 模板字符串$"Hello {name}!"可以直接使用。
  • #macro支持常量。
  • ...还有更多其他特性。

在未来的开发中,我想添加沙盒和调试功能,但目前我开发了一种定制的错误消息,优于GameMaker的错误消息。

https://preview.redd.it/hgg1znumguwg1.png?width=541&format=png&auto=webp&s=23fb48bf0096b2b4a01d5548949e377494de9a15

下面是一段代码示例:

gmlvm_init(); // 初始化

result = gmlvm_run(@"
var a = 20;
var b = 50;
var c= a + b;
show_debug_message($'and we got {c}'); // 你甚至可以使用函数或变量,在代码字符串外面,可以参考上述它在运行时像原生代码一样运行
return c; // 可选, 你不必返回任何东西
");

show_debug_message($"the addition result is {result}");

但如果将此调用在每帧执行,会消耗过多的性能,因此如果这种情况存在,我们也提供了两步执行:gmlvm_parse_only,它会将代码转换为AST,然后我们可以再次调用gmlvm_vm来运行它.

请注意,该项目仍在开发中,而且可能还有大量的 Bugs,即使它通过了100多个测试。

Github: https://github.com/erkan612/GMLVM

对本项目的建议和问答都心领神会,感谢你阅读!