我正在设计一种编译语言,编译成中间字节码.但是,我在设计字节码结构时遇到了很多麻烦.有没有人对如何用二进制表示程序有任何指示?或者,是否有任何资源(最好是免费的)如何做到这一点?我发现的最接近的是Lua解释器的字节码的描述.
编辑:更多信息:我正在实现我自己的垃圾收集方案,该方案针对不可变性和并发性进行了大量优化.为了提高效率,我需要一些独特的字节码指令,允许程序与垃圾收集方案进行交互.
我一直在开发一个Smalltalk变种,只是为了它的乐趣,我想知道当涉及到后端时,什么是stackoverflowers的选择.这些是我目前的考虑因素:
.NET,JVM:这两个VM主要用于静态类型语言,我认为很难定位像smalltalk这样的动态语言.
Python(作为源代码):似乎是最简单的方法.另外,如果我可以发出Python字节码会更好,但它没有被很好地记录为其他VM的AFAIK(需要挖掘Python的源代码以获取详细信息!).
自制翻译:不可能,因为它没有乐趣:-)
LLVM,NekoVM,Parrot是我正在检查的其他选项.你对此有何看法?
compiler-construction interpreter smalltalk vm-implementation
这个问题起初可能听起来很愚蠢,但可能根本就没有.
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.
我读过一些关于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) 我已经看到了一些性能关键的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
我正在寻找可以在8位微处理器上运行的推荐虚拟机并支持动态语言.我想要一个VM解决方案,因为我认为在代码密度,可移植性和拥有更小的解释器的能力方面的好处,为更大的程序留下更多空间.
我的目标是在6502微处理器之类的东西上运行一个完整的LOGO解释器,遵循"Apple II的LOGO"语法.
我已经看过对PyMite,Java"微版"的引用,当然现在可以使用20世纪70年代的UCSD p-System源代码.
欢迎提出建议.
我阅读正则表达式匹配:虚拟机方法,现在我尝试解析正则表达式并从中创建虚拟机.标记器工作并创建其标记.在那一步之后,我从令牌流创建反向波兰表示法,所以最后我得到
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个位置并插入split并jump在特定位置.根据当前堆栈长度和我添加的元素数量计算这些值.最后,我将最后一个元素的新起始位置添加到堆栈中(在这种情况下保持相同).
output stack
------------------- ------
0: match 'a' 0: 0
1: split 2, 4 1: 1
2: match …Run Code Online (Sandbox Code Playgroud) 我原本以为在托管代码中内存分配是否比本机代码更快是明确的 - 但似乎存在一些争议.也许虚拟机下的内存管理更快,因为没有对操作系统的上下文交换调用,但后来我发现虚拟机本身需要定期调用操作系统以获得更多内存,并且它具有内存本身的管理开销而不是操作系统.
而不是像我一样制作未经证实的断言,请提供支持您职位的参考文献的链接.
基于寄存器的虚拟机如何工作?我正在寻找基于寄存器的虚拟机如何工作的介绍.有人可以帮忙吗?
谢谢.
bytecode ×2
optimization ×2
.net ×1
6502 ×1
asm.js ×1
clr ×1
definition ×1
interpreter ×1
java ×1
javascript ×1
jvm ×1
lisp ×1
logo-lang ×1
memory ×1
performance ×1
regex ×1
ruby ×1
smalltalk ×1
terminology ×1
v8 ×1