我原本以为在托管代码中内存分配是否比本机代码更快是明确的 - 但似乎存在一些争议.也许虚拟机下的内存管理更快,因为没有对操作系统的上下文交换调用,但后来我发现虚拟机本身需要定期调用操作系统以获得更多内存,并且它具有内存本身的管理开销而不是操作系统.
而不是像我一样制作未经证实的断言,请提供支持您职位的参考文献的链接.
基于寄存器的虚拟机如何工作?我正在寻找基于寄存器的虚拟机如何工作的介绍.有人可以帮忙吗?
谢谢.
我最近阅读了关于托管语言是否比本机语言(特别是C#vs C++)更慢(或更快)的讨论.一位参与讨论的人说,托管语言的JIT编译器能够对使用指针的语言中无法实现的引用进行优化.
我想知道的是什么样的优化可以在引用而不是指针上?
请注意,讨论是关于执行速度,而不是内存使用情况.
compiler-construction jit pointers reference vm-implementation
JVM(尤其是HotSpot VM)因其在运行时可以应用的大量优化而闻名.
有没有办法查看某段代码,看看JVM实际上对它做了什么?
java compiler-construction optimization jvm vm-implementation
我真的开始学习Smalltalk了.现在我正在使用Squeak,但是有没有办法在Smalltalk中开发而不使用VM,但是像IDE一样?
我没有做太多的编程在许多语言,但我知道在C(++),你必须声明一个变量类型(int,char,等).
在PHP中,您当然不必这样做.你可以$str = "something";稍后再开始,$str = array("something" => "smells");她很高兴.
PHP如何编译?它如何知道变量类型将是什么?它甚至关心吗?
这个问题与我正在做的任何事情无关.我只是好奇.
编辑.
我需要澄清一下这个问题.
在C中,如果我说:
int y;
Run Code Online (Sandbox Code Playgroud)
它保留x个字节数y.如果y溢出,坏消息.
PHP没有这种性质(至少我认为它没有).
$i = "a number";
$i = 8;
$i = 1000000000000000000;
Run Code Online (Sandbox Code Playgroud)
它与语言完全相同.它怎么知道保留多少?或者我将苹果与橘子比较?如果我说错了,你有什么好主题我能读懂以便更好地理解吗?
希望这个问题不会太复杂或模糊.我知道我想要的是什么,所以手指交叉我可以在文本中得到这个.
我正在寻找一种语法与我自己的规范,所以我想我需要自己创建一个.我花了最近几天阅读有关编译器,词法分析器,解析器,汇编语言,虚拟机等的内容,而且我正在努力根据我实现目标所需的内容进行排序(文件附在底部一些规格).从本质上讲,我对于我需要使用哪些工具才能前进而感到非常困惑.
一点背景:所用的语言有望用于实现多人,基于文本的MUD服务器.因此,它需要简单的内置功能来创建/维护客户端TCP/IP连接,非阻塞IO,通过SQL或类似的数据库访问.我也对安全感兴趣,因为我不希望为这种语言编写的代码能够在没有专业软件的情况下被公众窃取和使用.这可能意味着它应该编译为目标代码
那么,创建符合这些规范的语言的最佳选择是什么?
我的结论如下.这只是我最好的教育猜测,所以如果你认为我正朝着错误的方向前进,那么请对我提出质疑.我大多只是把它包括在内,看看当专家们发表意见时我是多么的困惑.
为了代码安全,我应该想要一种编译并在虚拟机中运行的语言.如果我这样做,我将有很多工作要做,不是吗?在较低级别编写虚拟机,汇编语言,然后在更高级别的代码库上编写自己处理IO,套接字等,而不是使用现有模块?
我只是很困惑.
我不确定我是否有意义.
如果有人能够平息我的大脑,我真诚地感激它!或者,如果我离开课程并且有更简单的方法,请告诉我!
compiler-construction parsing language-design mud vm-implementation
我参加了大学的编译课程,虽然也做了很多工作,但它非常有用,而且非常有趣.由于我们有一个语言规范要实现,我没有学到很多东西的是语言设计.我现在正在考虑创造一种简单的玩具语言,这样我就可以玩游戏并尝试不同的语言设计原则.
我还没有决定的一件事是我希望我的编译器输出什么语言或格式.理想情况下,我想输出一个易于使用的虚拟机的字节码,并且还具有一些调试功能(例如,能够在任何时候暂停执行并查看堆栈.)我没有找到一个触发的但是,我很喜欢.为了让您了解我正在寻找的东西,以下是我考虑过的一些选项,以及我看到它们的优点和缺点:
我可以输出文本x86汇编语言,然后调用像NASM或FASM这样的汇编程序.这将为我提供一些编译实际硬件的经验,因为我以前的编译器工作是在VM上完成的.我可以使用gdb调试生成的程序,尽管它可能不如使用具有调试支持的VM那么容易.这方面的主要缺点是我对x86汇编的经验有限,而作为CISC指令集,它有点令人生畏.
我可以为像JVM或Lua虚拟机这样的流行虚拟机输出字节码.这些的优点和缺点可能会根据我选择的特定VM而有所不同,但总的来说,我在这里看到的缺点是可能需要学习字节码,这可能对我未来的项目的适用性有限.我也不确定哪种VM最适合我的需求.
我可以使用我的编译器课程中使用的相同VM,这是专门为此目的在我的大学设计的.我已经熟悉它的设计和指令集,它具有不错的调试功能,所以这是一个巨大的优势.然而,它的能力非常有限,我觉得如果我尝试做任何事情,即使是适度进步,我也会很快遇到这些限制.
我可以使用LLVM并输出LLVM中间表示. LLVM IR看起来非常强大,熟悉它对我来说绝对有用.另一方面,我真的不知道使用和调试是多么容易,所以我非常感谢在该领域有经验的人的建议.
我可以设计和实现自己的虚拟机. 这有一个巨大而明显的缺点:我基本上将我的项目转变为两个项目,大大降低了我实际完成任务的可能性.但是,它仍然有点吸引人,因为它允许我创建一个对我想要的语言功能具有"一流"支持的VM - 例如,Lua VM拥有对表的一流支持,这使得它很容易在Lua字节码中使用它们.
总而言之,我正在寻找一个我可以定位的VM或汇编程序,它相对容易学习和使用,并且易于调试.由于这是一个爱好项目,理想情况下我也希望尽量减少花费大量时间学习一些我永远不会再使用的工具或语言的机会.我希望从这个练习中获得的主要内容是对语言设计复杂性的第一手理解,所以任何有助于相对快速实现的东西都会很棒.
compiler-construction assembly language-design vm-implementation
我正在开发一个简单的虚拟机,我正处于一个十字路口.
我最初的目标是使用字节长指令,因此使用一个小循环和一个快速计算的goto调度.
然而,事实证明现实无法进一步发展 - 256远远不足以涵盖有符号和无符号8,16,32和64位整数,浮点数和双精度数,指针运算,寻址的不同组合.一种选择是不实现字节和短路,但目标是制作支持完整C子集以及向量操作的VM,因为它们几乎无处不在,尽管在不同的实现中.
所以我切换到16位指令,所以现在我还能够添加可移植的SIMD内在函数和更多编译的常用例程,这些例程通过不被解释来真正节省性能.还有全局地址的缓存,最初被编译为基址指针偏移,第一次编译地址时它只是覆盖偏移量和指令,以便下次它是直接跳转,代价是该集合中的额外指令.通过指令每次使用全局.
由于我不处于剖析阶段,我处于两难境地,额外的指令是否值得更灵活,是否存在更多指令,因此没有复制来回指令可以弥补增加的调度循环大小?请记住,每条指令只是一些汇编指令,例如:
.globl __Z20assign_i8u_reg8_imm8v
.def __Z20assign_i8u_reg8_imm8v; .scl 2; .type 32; .endef
__Z20assign_i8u_reg8_imm8v:
LFB13:
.cfi_startproc
movl _ip, %eax
movb 3(%eax), %cl
movzbl 2(%eax), %eax
movl _sp, %edx
movb %cl, (%edx,%eax)
addl $4, _ip
ret
.cfi_endproc
LFE13:
.p2align 2,,3
.globl __Z18assign_i8u_reg_regv
.def __Z18assign_i8u_reg_regv; .scl 2; .type 32; .endef
__Z18assign_i8u_reg_regv:
LFB14:
.cfi_startproc
movl _ip, %edx
movl _sp, %eax
movzbl 3(%edx), %ecx
movb (%ecx,%eax), %cl
movzbl 2(%edx), %edx
movb %cl, (%eax,%edx)
addl $4, _ip
ret
.cfi_endproc
LFE14:
.p2align 2,,3 …Run Code Online (Sandbox Code Playgroud) 在Java中,字符数据类型char用2个字节表示.n字符数组char[]用2n+24字节表示.
通常,存在24用于存储n对象数组的字节开销(至少如果对象是基本类型).
为什么我们需要这些额外的24个字节?它们是如何使用的?
编辑(2015年7月2日).它带给我的注意,在回答这个问题是提供了一个评论这里的程序员StackExchange.