我正在寻找有关未来虚拟机的一些资源(如jvm或clr)
他们会是什么样子?他们会提供并发运行时,更强大的元编程模型吗?
我正在寻找文章,研究项目或纯粹的推测,任何有趣的阅读.
如果您有任何链接或意见,请分享.
我注意到一些模拟器和虚拟机使用动态重新编译.他们是怎么做到的?在C中我知道如何使用类型转换在ram中调用函数(虽然我从未尝试过)但是如何读取操作码并为其生成代码?该人是否需要预先制作组装块并将它们一起复制/批处理?是用C编写的汇编?如果是这样,您如何找到代码的长度?你如何解释系统中断?
-编辑-
系统中断以及如何(重新)编译数据是我最感兴趣的.经过更多的研究,我听说有一个人(没有源可用)使用js,读取机器代码,输出js源并使用eval来"编译" js来源.有趣.
注意:标记为社区维基.
LLVM中的低级虚拟机在哪里?
我看到我们有llvm-g ++和c-lang,但是对我来说,LLVM几乎就像模拟器的Valgrind,在其上执行指令,我可以编写程序来检测运行代码/中断在某些情况下发生/等......
在LLVM上构建这样的工具在哪里?
谢谢!
我有一种感觉,我会问一个"愚蠢"的问题,但我必须问......
我有2个虚拟机.
我想将一个对象的实例从一个复制到另一个,
是否可以将表示此对象的位复制到VM的堆中,将其发送到另一个VM,就像另一个VM只需要在其内存中分配位并在其堆栈中添加一个引用到此内存插槽一样. .?
目前,为了做这样的事情,我们序列化对象并对其进行反序列化,这比仅仅复制实例效率低(计算方面)......解析是一种计算浪费......
JS序列化示例:每个VM都是V8(JavaScript)的一个实例,其中一种方法是将对象转换为JSON(JSON.stringify),向其发送一些如何获取字符串并将其转换回对象的其他VM(例如,var myObject = eval('(' + myJSONtext + ')');)..(JavaScript只是一个例子,这是某种序列化)
我在某种形式的AST中有一些代码,我想执行它.
我可以想到几种方法,例如:
ast模块)和
compile那或eval那.compile那或eval那.我想我会通过将它转换为Python AST来获得禁食执行compile,然后运行它.ESP.当使用PyPy时,我甚至可能通过PyPys JIT编译优化得到改进(我希望我这样做,是吗?).
你能想到其他可能性吗?你能就什么是最好的方式提出建议吗?
虚拟机用于在不同的操作系统上运行应用程序(Java将代码编译为独立于操作系统的.class文件,这些文件被解释为字节码).由于Android应用程序在相同的操作系统(即Android)上运行,因此它不需要VM(我可能在这里错了).那为什么需要Dalvik VM呢?
我想知道ART是否是虚拟机.dex2oat将dalvik字节代码编译为本机(特定于平台)代码,elf文件.正如android开发者文章中提到的,它仍然有垃圾收集器.我不明白它是如何工作的,我们有本机编译的elf文件,但它仍然在虚拟机环境中运行?GC在这种情况下如何工作?请提供一个很好的参考资料,或者请解释一下.提前致谢.
Python编译器生成的代码对象包含指令(命名co_consts)中使用的常量元组以及包含名称(命名co_names)的元组.
为什么有两个不同的列表?仅使用co_consts名称也不简单吗?
Java的内存模型基于强制执行规则的“先有先后”关系,但也允许在缓存失效方面优化虚拟机的实现。
例如,在以下情况下:
// thread A
private void method() {
//code before lock
synchronized (lockA) {
//code inside
}
}
// thread B
private void method2() {
//code before lock
synchronized (lockA) {
//code inside
}
}
// thread B
private void method3() {
//code before lock
synchronized (lockB) {
//code inside
}
}
Run Code Online (Sandbox Code Playgroud)
如果线程A调用method()而线程B试图在lockA内部获取method2(),则同步lockA将要求线程B在释放其锁之前,观察线程A对所有变量所做的所有更改,甚至包括之前在“代码”中更改的变量。锁定”部分。
另一方面,method3()使用另一个锁并且不强制发生关系之前的事件。这为优化创造了机会。
我的问题是虚拟机如何实现那些复杂的语义?是否在不需要缓存时避免完全刷新缓存?
它如何跟踪在哪个点哪个线程更改了哪个变量,从而仅从内存加载所需的缓存行?
multithreading jvm memory-model happens-before vm-implementation
我有一个抽象的语法树,我需要转换为虚拟机的程序集.我不知道如何最好地这样做,所以我开始使用一串字符串模板.我所说的伪代码示例,比如需要编译一个带有一个条件的简单if语句:
std::string compile_if(Node* n) {
std::string str = "";
curLabel = nLabels++;
str += compile_comparison(n->getChild(0));
str += ".true"+curLabel+":";
str += compile_block(n->getChild(1));
str += ".false"+curLabel+":";
return str;
}
Run Code Online (Sandbox Code Playgroud)
其中每个compile_*基于当前/下一个AST节点生成汇编字符串.然后最后一个字符串通过汇编程序运行.这看起来很草率,难以维护,这肯定不是大多数编译器所做的.这是一个坏主意,我应该改变吗?大多数其他编译器如何生成虚拟汇编代码/机器代码?