【问题标题】:Can a Go App dynamically compile Go code?Go App 可以动态编译 Go 代码吗?
【发布时间】:2017-03-30 12:57:25
【问题描述】:

假设我有一个接受用户输入的 Lua 程序,该输入恰好是有效的 Lua 源代码。这是在程序仍在运行时进行清理、编译和执行的。 Go 是否(或将会)这样的事情(可能)?

【问题讨论】:

  • 是:不会。将是:可能不会。
  • darrencoxall.com/golang/executing-commands-in-go 您总是可以手动将输入保存到文件中,然后从os/exec 运行编译器
  • 是不是意味着 Go 缺乏真正的反射?
  • @EgorSkriptunoff:在运行时编译和执行新代码与反射无关。在 linux 上,您也可以将代码编译并加载为插件,但这仍然与 lua 之类的解释语言可以做的完全不同。
  • @JimB:严格来说,Lua 确实编译代码(到 VM); LuaJIT 编译为 VM,然后将其 jit 编译为机器代码。我喜欢 Go 的地方在于 UTF-8 无处不在,还有 goroutine/channel 的东西,但是唉,也有一些东西不能翻译(很容易)。 Go 创建的代码的执行速度并不总是与 LuaJIT 相当,尽管这可能部分与我尚未以最佳 Go 方式做事的事实有关。也许将 LuaJIT 核心作为一个包添加到 Go(这样 Lua 代码可以即时执行)是前进的方向。

标签: go lua


【解决方案1】:

我认为以下两个项目之间有足够的内容来帮助我实现我想要的。两者都不是完美的替代品,但两者都可以扩展以提供与我最初在 Lua 中使用动态编译所做的服务非常接近的服务。

https://github.com/Knetic/govaluate

https://github.com/japm/goScript

【讨论】:

    【解决方案2】:

    我对如何实现这一点有一个想法,但你几乎必须在 C 中做同样的事情。

    Go 是一种编译语言,因此为了实现您想要完成的任务,您需要在 CSP 上编写一个包装器,该包装器将支持二进制文件的版本控制并通过某种 RPC 导出功能。步骤如下:

    1. 在本地尝试构建 Go 代码
    2. 开始结果
    3. 新程序连接到当前运行程序的 RPC
    4. 指示第一个程序将所有 CSP 数据(通道、goroutine 调度)指向新的运行时
    5. 外部接口切换到新程序,在所有来自旧程序的goroutines结束后,杀死旧进程

    显然,这非常复杂,通过Ottogo-lua 之类的脚本语言,您最终会节省大量时间。

    【讨论】:

    • AKA,您构建了一个带有主 RPC 控制器的迷你分布式系统,该控制器连接到您希望能够重写的部分。
    • 我同意这可能不值得付出努力,像 go-lua 或 golua (github.com/aarzilli/golua) 可能是更明智的方法。
    • 这是我在业余时间会随机做的事情,只是为了看看它是否有效。谢谢你的想法,我会玩这个@Piotr Zduniak
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多