关于解释器:JIT代码生成技术

关于解释器:JIT代码生成技术

JIT code generation techniques

虚拟机如何动态生成本机代码并执行它?

假设您可以弄清楚您要发出的本机操作码是什么,如何实际运行它?

是否像将助记符指令映射到二进制代码,将其填充到char *指针并将其强制转换为函数并执行一样,有点怪癖?

还是会生成一个临时共享库(.dll或.so或其他),然后使用LoadLibrary之类的标准函数将其加载到内存中?


您可以使程序计数器指向您要执行的代码。请记住,数据可以是数据或代码。在x86上,程序计数器是EIP寄存器。 EIP的IP部分代表指令指针。调用JMP指令以跳转到一个地址。跳转后,EIP将包含此地址。

Is it something as hacky as mapping the mnemonic instructions to binary codes, stuffing it into an char* pointer and casting it as a function and executing?

是。这是一种方法。结果代码将转换为C语言中的函数指针。


Is it something as hacky as mapping the mnemonic instructions to binary codes, stuffing it into an char* pointer and casting it as a function and executing?

是的,如果您使用C或C ++(或类似的东西)来做,那正是您要做的。

看起来很黑,但这实际上是语言设计的产物。请记住,您要使用的实际算法非常简单:确定要使用的指令,将它们加载到内存中的缓冲区中,然后跳转到该缓冲区的开头。

但是,如果您确实尝试执行此操作,请确保在返回C程序时正确使用了调用约定。我想如果我想生成代码,我会寻找一个图书馆来照顾我。 Nanojit最近成为新闻。你可以看一下。


对。您只需构建一个char *并执行它。但是,您需要注意一些细节。 char *必须在内存的可执行部分中,并且必须具有正确的对齐方式。

除了nanojit之外,您还可以签出LLVM,这是另一个库,能够将各种程序表示形式编译为功能指针。它的界面整洁,生成的代码趋向于高效。


Is it something as hacky as mapping
the mnemonic instructions to binary
codes, stuffing it into an char*
pointer and casting it as a function
and executing?

是的,那行得通。

要在Windows中执行此操作,必须将PAGE_EXECUTE_READWRITE设置为已分配的块:

1
2
3
4
5
void (*MyFunc)() = (void (*)()) VirtualAlloc(NULL, sizeofblock,  MEM_COMMIT, PAGE_EXECUTE_READWRITE);

//Now fill up the block with executable code and issue-

MyFunc();

关于生成DLL:为此需要额外的I / O,再加上链接,再加上生成DLL格式的复杂性,将使事情变得更加复杂,并且最重要的是,它们会破坏性能。此外,最后您仍然调用指向已加载代码的函数指针,因此...
而且,JIT编译一次只能发生一种方法,如果要这样做,则会生成许多小的DLL。

关于"可执行部分"的要求,在POSIX系统上调用mprotect()可以修复权限(Win32上有类似的API)。您需要对较大的内存段执行此操作,而不是对每个方法都执行一次,否则会太慢。

在纯x86上,您不会注意到该问题,在具有PAE或64位AMD64 / Intel 64位计算机的x86上,您会遇到段错误。


除了Rotor 2.0之外,您还可以查看OpenJDK中的HotSpot虚拟机。


据我所知,它必须编译内存中的所有内容,因为它必须运行一些试探法来优化代码(即:随着时间的推移而内联),但是您可以看看Shared Source Common Language Infrastructure 2.0转子版本。整个代码库与.NET相同,除了抖动和GC。


推荐阅读

    linux命令行执行py?

    linux命令行执行py?,系统,环境,官网,一致,文件,程序,脚本,源文件,后台,终端,l

    linux执行权限命令行?

    linux执行权限命令行?,地址,电脑,系统,数字,工作,权限,目录,文件,新增,信息,L

    程序执行linux命令?

    程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

    linux执行2个命令?

    linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

    linux命令批量执行?

    linux命令批量执行?,系统,代码,工作,周期性,数据,定期,环境,命令,文件,脚本,l

    linux二进制执行命令?

    linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

    linux虚拟机ls命令?

    linux虚拟机ls命令?,系统,信息,时间,命令,最新,标准,工作,名称,文件,目录,lin

    linux执行退出命令?

    linux执行退出命令?,档案,状态,工作,命令,信息,地址,电脑,系统,编辑,文件,lin

    linux中后台执行命令?

    linux中后台执行命令?,系统,状态,暂停,灵活,电脑,网络,服务,第一,名字,命令,l

    linux虚拟机扩容命令?

    linux虚拟机扩容命令?,扩大,系统,在线,虚拟机,盘后,工具,硬盘,磁盘,单击,下

    linux常用的执行命令?

    linux常用的执行命令?,系统,地址,工作,基础,标准,命令,工具,环境,信息,代码,L

    linux执行线程命令?

    linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin

    linux执行多条命令?

    linux执行多条命令?,数据,通信,管理,系统,命令,标准,信息,工具,代码,环境,Lin

    linux虚拟机系统命令?

    linux虚拟机系统命令?,系统,环境,密码,电脑,软件,工具,信息,位置,设备,虚拟

    linux命令大全虚拟机?

    linux命令大全虚拟机?,地址,网络,名字,系统,信息,密码,电脑,状态,首次,名称,

    linux退出命令未执行?

    linux退出命令未执行?,服务,工具,代码,环境,数据,官网,命令,用户,脚本,字符

    linux动态执行命令?

    linux动态执行命令?,时间,信息,名字,工作,网上,业务,工具,对比,地址,下来,如

    linux命令执行次数?

    linux命令执行次数?,时间,系统,地址,命令,数据,管理,工具,信息,环境,历史,lin

    虚拟机linux拷贝命令?

    虚拟机linux拷贝命令?,系统,工具,服务,电脑,软件,项目,虚拟机,异常,命令,文

    linux命令一起执行?

    linux命令一起执行?,系统,标准,设备,地方,软件,代码,网站,网络,周期性,命令,l