标签: vm-implementation

字节码设计?

我正在设计一种编译语言,编译成中间字节码.但是,我在设计字节码结构时遇到了很多麻烦.有没有人对如何用二进制表示程序有任何指示?或者,是否有任何资源(最好是免费的)如何做到这一点?我发现的最接近的是Lua解释器的字节码描述.

编辑:更多信息:我正在实现我自己的垃圾收集方案,该方案针对不可变性和并发性进行了大量优化.为了提高效率,我需要一些独特的字节码指令,允许程序与垃圾收集方案进行交互.

programming-languages bytecode vm-implementation

14
推荐指数
2
解决办法
4572
查看次数

新动态编程语言的后端选择?

我一直在开发一个Smalltalk变种,只是为了它的乐趣,我想知道当涉及到后端时,什么是stackoverflowers的选择.这些是我目前的考虑因素:

.NET,JVM:这两个VM主要用于静态类型语言,我认为很难定位像smalltalk这样的动态语言.

Python(作为源代码):似乎是最简单的方法.另外,如果我可以发出Python字节码会更好,但它没有被很好地记录为其他VM的AFAIK(需要挖掘Python的源代码以获取详细信息!).

自制翻译:不可能,因为它没有乐趣:-)

LLVM,NekoVM,Parrot是我正在检查的其他选项.你对此有何看法?

compiler-construction interpreter smalltalk vm-implementation

13
推荐指数
1
解决办法
1134
查看次数

究竟什么是Java?

这个问题起初可能听起来很愚蠢,但可能根本就没有.

  • Java不是Java语言,大多数人都知道,因为您可以使用Scala或Groovy 等许多其他语言对Java进行编程

  • Java不是具体的VM实现,因为还有其他实现,不仅是SUN,Microsoft或IBM.

  • Java不是类框架,因为许多实现随意添加或省略类.

  • 甚至不必使用常见的VM规范甚至Java字节码,请参阅Dalvik VM

  • 也许这只是他们分享的一套原则,无论这可能是什么.它绝对不是"一次编写,随处运行",因为至少Dalvik和Microsoft VM/J#并非如此.

所以问题是,Java究竟是什么?甚至有一个确切的定义?

编辑 很多人似乎都认为java只是编程语言.因此,支持java的移动电话必须是一个电话,使用户能够使用由仅使用java语言创建的类文件组成的程序.如果这是真的,那么java虚拟机/ java运行时环境/ java开发工具包将仅用于java,而其他jvm语言将拥有自己的对应xvm/xre/xdk.

java jvm terminology definition vm-implementation

13
推荐指数
4
解决办法
1136
查看次数

如何观察YARV执行的Ruby字节码

我想观察YARV执行的Ruby字节码,post-mortem.

我怎么能得到这个?

这里有人说这是不可能的.但是,有一个hotruby框架似乎执行ruby字节码,所以我很困惑......

非常感谢!

ruby bytecode vm-implementation

13
推荐指数
1
解决办法
2197
查看次数

清理V8的"隐藏类"概念

我读过一些关于V8隐藏类的文章.但是,我脑子里还有几个问题:

如果,比方说,有两个对象:

var a = { }
a.x = 5
a.y = 6

var b = { }
b.y = 7
b.x = 8
Run Code Online (Sandbox Code Playgroud)

难道他们最终以相同的隐藏类或只是分开,因为一个人去0 + x + y和其他0 + y + x?据我所知,他们得到不同的课程,但只是想确保我得到它.

然后,我们有这个案例:

function Point(x, y) {
    this.x = x
    this.y = y
}
var a = new Point(7, 8)

var b = { }
b.x = 6
b.y = 8

var c = {
    x: 8,
    y: 9
}

var d = {
    y: …
Run Code Online (Sandbox Code Playgroud)

optimization v8 vm-implementation

13
推荐指数
2
解决办法
2152
查看次数

什么是这个asm风格"x | 0"一些javascript程序员现在正在使用?

我已经看到了一些性能关键的javascript代码,就像这个项目中的那个,它大量使用0的按位OR运算.例如:

GameBoyAdvanceCPU.prototype.write8 = function (address, data) {
address = address | 0;
data = data | 0;
this.memory.memoryWrite8(address | 0, data | 0);
Run Code Online (Sandbox Code Playgroud)

我知道地板数字的用例是"| 0",但这不是这里的情况,因为它们总是int.它看起来有点像asm.js,这是告诉js引擎我们正在使用整数,允许一些优化吗?如果是这样,哪些浏览器会进行优化?

任何关于它如何工作的指针都会被认可.

javascript optimization bit-manipulation asm.js vm-implementation

13
推荐指数
2
解决办法
306
查看次数

对于8位系统上类似于lisp的语言的VM感兴趣

我正在寻找可以在8位微处理器上运行的推荐虚拟机并支持动态语言.我想要一个VM解决方案,因为我认为在代码密度,可移植性和拥有更小的解释器的能力方面的好处,为更大的程序留下更多空间.

我的目标是在6502微处理器之类的东西上运行一个完整的LOGO解释器,遵循"Apple II的LOGO"语法.

我已经看过对PyMite,Java"微版"的引用,当然现在可以使用20世纪70年代的UCSD p-System源代码.

欢迎提出建议.

lisp 6502 logo-lang vm-implementation

12
推荐指数
3
解决办法
1031
查看次数

正则表达式的虚拟机

我阅读正则表达式匹配:虚拟机方法,现在我尝试解析正则表达式并从中创建虚拟机.标记器工作并创建其标记.在那一步之后,我从令牌流创建反向波兰表示法,所以最后我得到

a b c | |
Run Code Online (Sandbox Code Playgroud)

从正则表达式a|(b|c).那么,现在我卡住了一步:我想要一个阵列

0: split 1, 3
1: match 'a'
2: jump 7
3: split 4, 6
4: match 'b'
5: jump 7
6: match 'c'
7: noop
Run Code Online (Sandbox Code Playgroud)

从上面的流.我没有把它弄好......我使用输出数组和堆栈作为每个令牌的起始位置.首先,将3个值添加到输出(并且它是堆栈的起始位置).

output              stack
------------------- ------
0: match 'a'        0: 0
1: match 'b'        1: 1
2: match 'c'        2: 2
Run Code Online (Sandbox Code Playgroud)

随着|,我从堆栈弹出最后2个位置并插入splitjump在特定位置.根据当前堆栈长度和我添加的元素数量计算这些值.最后,我将最后一个元素的新起始位置添加到堆栈中(在这种情况下保持相同).

output              stack
------------------- ------
0: match 'a'        0: 0
1: split 2, 4       1: 1
2: match …
Run Code Online (Sandbox Code Playgroud)

regex vm-implementation

12
推荐指数
1
解决办法
645
查看次数

托管代码中的.NET内存管理比本机代码更快吗?

我原本以为在托管代码中内存分配是否比本机代码更快是明确的 - 但似乎存在一些争议.也许虚拟机下的内存管理更快,因为没有对操作系统的上下文交换调用,但后来我发现虚拟机本身需要定期调用操作系统以获得更多内存,并且它具有内存本身的管理开销而不是操作系统.

而不是像我一样制作未经证实的断言,请提供支持您职位的参考文献的链接.

.net memory clr performance vm-implementation

11
推荐指数
2
解决办法
983
查看次数

基于寄存器的虚拟机如何工作?

基于寄存器的虚拟机如何工作?我正在寻找基于寄存器的虚拟机如何工作的介绍.有人可以帮忙吗?

谢谢.

vm-implementation

11
推荐指数
1
解决办法
6230
查看次数