主要观点:作者介绍在 Go 中进行运行时代码生成与执行的概念及相关内容,包括避免使用易混淆的术语、提及相关已有项目、阐述运行时代码生成与执行的步骤及注意事项、给出简单的 Go 运行时代码生成与执行的小演示等,后续将继续探讨相关更深入内容。
关键信息:
- 明确区分“运行时代码生成与执行”“AOT”“JIT”,避免混淆,重点介绍纯 Go 程序中生成机器码并在同一进程中执行的情况。
- 列举多个在 Go 生态中进行类似尝试的项目,且这些项目都避免使用 CGo。
- 运行时代码生成与执行可分为生成机器码(通过 mmap 等操作)、标记可执行、获取机器码地址并调用“跳板”Go Asm 函数、跳转到机器码执行等步骤,要注意 Go 运行时行为和实现细节。
- 给出一个简单的 Go 运行时代码生成与执行的小演示,包括准备源文件、编写 Go 代码和 Go Assembly 代码、编译运行程序等,演示了如何分配内存、写入机器码、标记可执行及执行机器码等过程,还通过补丁写入特定机器码来使程序成功执行。
重要细节: - wazero 是作者创建的 WebAssembly 运行时,从 hobby 项目变为工作内容,其能从 WebAssembly 字节码生成等效的机器码且无依赖。
- 演示中在 AArch64 系统上进行操作,需注意内存区域标记等细节,如 OS 通常禁止用户空间的读写可执行内存区域,需标记为只读可执行。
- 对于汇编语法可参考A Quick Guide to Go’s Assembler。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。