﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-乐在其中-随笔分类-VM/Engine</title><link>http://www.blogjava.net/charles/category/40578.html</link><description>以JEE为主攻，以Flex为点缀，以Eclipse RCP为乐趣</description><language>zh-cn</language><lastBuildDate>Wed, 01 Jul 2009 12:40:33 GMT</lastBuildDate><pubDate>Wed, 01 Jul 2009 12:40:33 GMT</pubDate><ttl>60</ttl><item><title>What Tamarin really means ?(zz)</title><link>http://www.blogjava.net/charles/archive/2009/07/01/285012.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 01 Jul 2009 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/07/01/285012.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/285012.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/07/01/285012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/285012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/285012.html</trackback:ping><description><![CDATA[<p>Adobe 开放 AVM2 source 加入 Tamarin 计画的新闻已经出来两天，在各大forum与blogs里都引起热烈讨论，毕竟能让 javascrīpt 跑的比现在快 10倍，确实是件大事啊。 <p>但很有趣的是虽然官方已提供了详细的 FAQ 回答常见的问题，但仍然有许多误解存在，也因此我特别针对这些问题请教了 Gordon Smith (from Adobe Flex team) 两人一阵 email 往返后，大概已得出最佳化的答案，下面我试者将学到的资讯整理出来。 <p>＊Actionscrīpt 3 与 Javascrīpt 2 的差别 <p>AS3 与 JS2 都是依循 Ecmacript 4 规格所实作出来的语言，它们的 core language 是完全一样的。 <p>Core language 包含: sealed classes, interfaces, namespaces, method closures, exceptions, strong typing, E4X 等，所以像 Array, String, int 等也都包含在内。 <p>但在 core language 之上，就会依它执行的环境不同，而加上不同的 extension。 <p>AS3: 在 <a href="http://www.51js.com/"><u><strong>flash</strong></u></a> player 里执行，因此会加上 flash所需的 DOM (Document Object Model) 例如 Sprite, MovieClip, Socket等。 <p>JS2: 在 Browser 里执行，就会加上 Browser 相关的 DOM, 例如 Document, Form等。 <p>＊Tamarin 是什么？ <p>Tamarin 是由 AVM2 延伸而来，它只负责执行 Ecmacript 4 core language 的部份。 <p>因此 Mozilla Foundation 拿到 Tamarin engine 后，第一件要做的事就是在上面实作 Browser 相关的 DOM，例如 Form 要怎么生成、Document 物件要如何存取。 <p>Adobe 要做的事则是在上面实作 Flash 相关的 DOM, 例如 Sprite 要如何画出来？Video 要怎么串流与播放？Audio 的载入与音量控制等。(很显然的，这部份工作已经做完，不然你手上的 flash player 9 是打那儿来的？) <p>＊Adobe 与 Tamarin 往后的关系 <p>如果日后，Mozilla 的 developer community 针对 Tamarin 做了某些最佳化，例如有神童出现把 E4X 的执行效率提高了100倍(例如他写了一个 routine/library 可以让 xml 的 processing time 缩短为原本的1/100)，这些改变一旦被加入 Tamarin 的 codebase，Adobe 也就可以共享成果。 <p>因此每当 Tamarin 有重大升级或改版时，Flash Player 就可能也跟者推出新版，因为它内部的 core language scrīpt engine 也需要升级才能整合 Tamarin 的改变。 <p>＊这代表 Adobe 也将 Flash Player open source了吗？ <p>不。 <p>Flash Player = Tamarin + Flash-specific DOM <p>而这次开放出去的只有核心的 Tamarin engine，因此跟 open source flash player 完全没关系。 <p>实际上做为一个 universal platform，最好也不要有太多的 branch/fork，所以在可见的将来也不太可能见到官方做这件事。 <p>＊将来 Firefox 不再需要 flash player 了吗？ <p>不，从上面可知，Firefox + Tamarin 只是取得了一个快速的 Ecmascrīpt 4 core language engine, 但它并没有内含 flash DOM，所以用 Flash 开发的程式(swf)还是要乖乖在 flash player 里跑。 <p>不然，adobe 还投入人力开发 64bit 与 linux player，难不成是做心酸的吗？ <p>＊Tamarin 可以用在其它地方吗？ <p>可以。 <p>以 Dreamweaver 为例，它有内建 javascrīpt engine，可以让user写一些巨集之类的指令，自动化做某些事。 <p>目前它是用 javascrīpt 1.5 语法，底层则是内建了 SpiderMonkey engine，然后在这之上，加入了 Dreamweaver 独有的 DOM, 例如 MenuCommand, EditorWindow，让user可以用 js1.5 去控制 Dreamweaver 的某些行为。 <p>将来，Dreamweaver 可以选择改用 Tamarin 取代掉 SpiderMonkey 做为内建的 scrīpt engine, 这样user就可以写 OO 式的 JS2 巨集。 <p>这就是一个不同的应用实例，而实际上 Fireworks, Flash, Acrobat 等也都有这样的能力，知名的 Red5 目前用 Rhino 将来也可以考虑改用 Tamarin，毕竟有个10倍速的免钱 scrīpt engine，何乐不为呢？ <p>＊Tamarin 对 Flex developer 的影响 <p>这部份就很有趣，简单来说，影响都是正面的，只是要把时间放长来看，正面的效应大概要一到两年后才会出现，但最多三年(2009)后就可以看出这步棋下的完全正确，而且可能是决定性的一步。<br>以上文字来自：<a href="http://ria.richtechmedia.com/">http://ria.richtechmedia.com/</a></p><img src ="http://www.blogjava.net/charles/aggbug/285012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-07-01 19:41 <a href="http://www.blogjava.net/charles/archive/2009/07/01/285012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简记V8与SquirrleFish/Tamarin的对比点(zz)</title><link>http://www.blogjava.net/charles/archive/2009/07/01/285011.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 01 Jul 2009 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/charles/archive/2009/07/01/285011.html</guid><wfw:comment>http://www.blogjava.net/charles/comments/285011.html</wfw:comment><comments>http://www.blogjava.net/charles/archive/2009/07/01/285011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/charles/comments/commentRss/285011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/charles/services/trackbacks/285011.html</trackback:ping><description><![CDATA[<h5><a href="http://rednaxelafx.javaeye.com/blog/236291">简记V8与SquirrleFish/Tamarin的对比点</a></h5> <p>刚才还是忍不住到V8的官网读了些文档，想看看到底它的技术特点是什么。 <br>V8官网：<a href="http://code.google.com/p/v8/">Google V8 JavaScript Engine</a><br>设计概念的文档：<a href="http://code.google.com/apis/v8/design.html">Design Elements</a><br>有人初试V8的经过：<a href="http://d.hatena.ne.jp/amachang/20080903/1220405193">http://d.hatena.ne.jp/amachang/20080903/1220405193</a><br>V8是BSD许可证的，比较自由，方便用在各种项目中。 <br>它是一个相当快的JavaScript实现。根据其设计概念的文档，它的高性能主要来自：  <ul> <li>快速的属性访问  <li>动态机器码生成  <li>高效的垃圾收集</li></ul>其中前两点应该是紧密相关联的。在JavaScript引擎的实现中，V8特别就特别在“隐藏类”（hidden class）的使用。Hidden class的概念可以到那篇文档去看，解释得比较生动。简单来说，对于某个对象，每次属性的数量（或类型？这个得回头仔细研究下）发生改变时，虚拟机就会新创建一个对应的隐藏类，记录下其中各个属性的相对偏移量，并将原本的隐藏类与新的隐藏类之间建立一个关联。当再次有同一类型的对象创建时则不会重复创建隐藏类，而能复用前面已经出现的隐藏类。 <br>其它JavaScript引擎（以及许多其它脚本语言的实现）一般使用某种形式的关联容器来储存所有变量；通常叫字典，也会被称为映射表或者关联数组，典型的实现方式是哈希表或者红黑树等。对象中的成员变量（下面将称为“属性”）一般也是这样与某个对象关联在一起的。访问某个对象的某个属性时就需要动态查询这样的关联容器，是不可忽视的开销。 <br>V8则不使用关联容器来储存属性，而是采用更接近于静态编译的类的形式，将对象中每个属性的相对偏移量记下来，在生成机器码时直接把偏移量写到指令中。这样，访问某个对象的某个属性就只需要很少量的指令就能完成，比起关联容器的方式高效许多。 <br>V8使用动态机器码生成，先把要执行的JavaScript代码直接编译为机器码，而不使用字节码也不通过解释的方式来执行。这样在执行一些被大量重读执行的代码时效果会特别好。与之相对，Apple Webkit的JavaScriptCore/<a href="http://webkit.org/blog/189/announcing-squirrelfish">SquirrelFish</a>是先将JavaScript编译到字节码，然后以纯解释的方式执行字节码；Mozilla/Adobe的<a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>则是先将JavaScript编译到字节码，然后以即时编译（JIT）的方式执行。SquirrelFish与Tamarin的字节码设计思路又不一样：前者是基于寄存器的，而后者是基于栈的。一般认为基于寄存器形式的字节码比较快，而基于栈形式的字节码比较小，总之也是各有特点。 <br>与“隐藏类”相关的是，V8会预先猜测某段代码中的对象对应的隐藏类，如果命中的话就能直接用已经生成到机器码里的偏移量；如果没有命中，则使用实际的隐藏类中的信息来修改已生成的机器码。这样，如果多次执行中对象的“实际类型”都与猜测一样，执行速度就可以非常的快。 <br>Mozilla的新JavaScript执行引擎，TraceMonkey则通过别的方式来提高执行速度。通过记录代码执行的路径，当发现某条执行路径回到了某个早先经过的节点，就发现了一个“trace”；然后对trace花时间做重点优化，编译为高效的机器码。与HotSpot JVM不同的是，trace不是以函数（或者说方法）为单位的，可以在更小的范围内做精确的优化，减少不必要的优化开销。 <br>在垃圾收集器方面，V8采用的是一个两代的分代式准确垃圾收集器。相对的，JavaScriptCore的GC继承自KJS，没记错的话是一个没有分代的准确M&amp;S式（mark-and-sweep）垃圾收集器；Tamarin使用的则是Adobe提供的<a href="http://developer.mozilla.org/En/MMgc">MMgc</a>，主要算法是“延迟的引用计数”（DRC，Deffered Reference Counting），外加增量式保守M&amp;S的垃圾收集器。这三种实现方式各有特点，实际效果要比较起来恐怕比较难。准确式的垃圾收集器必须知道堆的位置和布局，所以难以做成通用的；保守式收集器则可以做得很通用，著名的<a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm GC</a>是个典型的例子。但保守式收集器有潜在的内存泄漏的危险，因为可能会把并不是对象指针的数据识别为指针，使本来应该已经可以释放的空间无法被释放。 <br>=========================================================================== <br>V8中使用了下列第三方库：  <p>引用 <p>&nbsp; - Jscre, located under third_party/jscre.&nbsp; This code is copyrighted <br>&nbsp;&nbsp;&nbsp; by the University of Cambridge and Apple Inc. and released under a <br>&nbsp;&nbsp;&nbsp; 2-clause BSD license. <br>&nbsp; - Dtoa, located under third_party/dtoa.&nbsp; This code is copyrighted by <br>&nbsp;&nbsp;&nbsp; David M. Gay and released under an MIT license. <br>&nbsp; - Strongtalk assembler, the basis of the files assembler-arm-inl.h, <br>&nbsp;&nbsp;&nbsp; assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, <br>&nbsp;&nbsp;&nbsp; assembler-ia32.cc, assembler-ia32.h, assembler.cc and assembler.h. <br>&nbsp;&nbsp;&nbsp; This code is copyrighted by Sun Microsystems Inc. and released <br>&nbsp;&nbsp;&nbsp; under a 3-clause BSD license. <p>Jscre我没怎么听说过，不知道跟PCRE（Perl Compatible Regular Expressions）的关系是怎样的。在Jscre源码的目录里看到了"pcre"的字样，不过详细情况还是以后再看看好了。Apple Webkit里的JavaScriptCore应该是直接用了PCRE的吧？还是说我看漏了…… <br>=========================================================================== <br>今天Mozilla方面也没忘记对Chrome/V8的发布作出反应。Brendan Eich，JavaScript的创始者，在其blog上发表了一篇相关评论： <br><a href="http://weblogs.mozillazine.org/roadmap/archives/2008/09/tracemonkey_update.html">Brendan Eich: TraceMonkey Update</a> <p>Brendan Eich 写道 <p><img title="点击查看原始大小图片" height="430" src="http://rednaxelafx.javaeye.com/upload/picture/pic/21171/c2cbf917-ce6a-356e-ad25-3ae36907ec8b.png" width="700"> <p>（向右多的是TraceMonkey比较快，向左多的是V8比较快） <br>可以看到在Brendan做的SunSpider测试中，TraceMonkey在递归密集的程序中速度会比V8慢许多，而在正则表达式等方面则比V8快。据Brendan称，TraceMonkey的开发时间还不长，递归方面的trace还没多少进度，所以在这部分是比较慢的。但下一步将会解决这个问题。  <img src ="http://www.blogjava.net/charles/aggbug/285011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/charles/" target="_blank">suprasoft Inc,.</a> 2009-07-01 19:38 <a href="http://www.blogjava.net/charles/archive/2009/07/01/285011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>