当前位置: 首页 > news >正文

网站优化改动怎么做成都高端网站建设那家好

网站优化改动怎么做,成都高端网站建设那家好,网络营销推广引流方式,智通东莞人才网nashorn预编译在最近的一篇文章中#xff0c;我了解了Java 8和Scala如何实现Lambda表达式。 众所周知#xff0c;Java 8不仅引入了对Javac编译器的改进#xff0c;而且还引入了全新的解决方案-Nashorn。 这个新引擎旨在替代Java现有JavaScript解释器Rhino。 这为我们带来了… nashorn预编译 在最近的一篇文章中我了解了Java 8和Scala如何实现Lambda表达式。 众所周知Java 8不仅引入了对Javac编译器的改进而且还引入了全新的解决方案-Nashorn。 这个新引擎旨在替代Java现有JavaScript解释器Rhino。 这为我们带来了JVM的前列当谈到在速度与世界的V8引擎执行JavaScript在那里我希望我们会最终得到过去那种汽车地毯的事情 :)所以我认为这将是一个很好的时机也可以通过深入了解Nashorn看看它如何编译Lambda表达式尤其是与Java和Scala相比。 我们将要看的lambda表达式类似于我们用Java和Scala测试过的表达式。 这是代码 ScriptEngineManager manager new ScriptEngineManager(); ScriptEngine engine manager.getEngineByName(nashorn);String js;js var map Array.prototype.map \n; js var names [\john\, \jerry\, \bob\]\n; js var a map.call(names, function(name) { return name.length() })\n; js print(a);engine.eval(js); 您似乎觉得足够纯真。 但是请稍等... 进入字节码 我们的第一个挑战是获取JVM看到的实际字节码。 与Java和Scala的编译器具有持久性即将.class / jar文件生成到磁盘不同Nashorn会编译内存中的所有内容并将字节码直接传递给JVM。 幸运的是我们已经有了Java代理来进行救援。 我编写了一个简单的Java代理来捕获并保留生成的字节码。 从那里开始有一个简单的javap可以打印代码。 如果您还记得的话我很高兴看到新的Java 8编译器如何使用Java 7中引入的invokeDynamic指令链接到Lambda函数代码。 好吧与Nashorn一起他们真的参加了比赛。 现在一切都完全基于它。 看看下面。 读取字节码 invokeDynamic 。 就像我们都在同一页面上一样Java 7中添加了invokeDynamic指令以允许人们编写自己的动态语言来在运行时决定如何链接代码。 对于Java和Scala之类的静态语言编译器在编译时决定将调用哪种方法在JVM运行时的帮助下用于多态。 运行时链接是通过标准ClassLoader完成的以查找类。 甚至方法重载解析之类的事情都在编译时完成。 动态与静态链接 。 不幸的是对于本质上更具动态性的语言并且JS是一个很好的例子静态解析可能是不可能的。 当我们在Java中说obj.foo时obj类具有foo方法否则就没有。 在像JS这样的语言中它将取决于运行时obj引用的实际对象这是静态编译器的噩梦。 在这种情况下编译时的链接方法行不通。 但是invokeDynamic确实可以。 InvokeDynamic允许在运行时将链接推迟回该语言的编写者因此他们可以根据自己的语言语义指导JVM确定要调用哪种方法。 这是双赢的局面。 JVM获得了一种链接优化和执行的实际方法并且语言制造商可以控制其解析度。 动态链接是我们在Takipi中必须努力支持的工作 。 Nashorn如何链接 Nashorn确实有效地利用了这一点。 让我们看一下示例以了解其工作原理。 这是Lambda代码中的第一条invokeDynamic指令用于检索JS Array类的值– invokedynamic 0 dyn:getProp|getElem|getMethod:prototype:(Ljava/lang/Object;)Ljava/lang/Object; Nashorn要求JVM在运行时将其传递给该字符串作为交换它将返回一个方法的句柄该方法接受一个Object并返回一个。 只要JVM获取此类方法的句柄它就可以链接。 .class文件的特殊部分中指定了负责返回此句柄的方法也称为引导程序方法该文件中包含可用的引导程序方法列表。 您看到的0值是该方法在该表中的索引JVM将调用该索引来获取将链接到的方法句柄。 在我看来Nashorn的人们做了一件很酷的事情他们没有编写自己的库来解析和链接代码 而是继续集成了dynalink这个开源项目该项目旨在帮助动态语言基于统一平台链接代码。 这就是为什么您在每个字符串的开头看到“ dyn”前缀的原因。 实际流量 现在我们已经掌握了Nashorn所使用的方法现在让我们看一下实际流程。 为了简洁起见我删除了一些说明。 完整的代码可以在这里找到。 1.第一组指令将数组映射函数加载到脚本中。 //load JS array invokedynamic 0 dyn:getProp|getElem|getMethod:Array:(Ljava/lang/Object;)Ljava/lang/Object;//load its prototype element invokedynamic 0 dyn:getProp|getElem|getMethod:prototype:(Ljava/lang/Object;)Ljava/lang/Object;//load the map method invokedynamic 0 dyn:getProp|getElem|getMethod:map:(Ljava/lang/Object;)Ljava/lang/Object;//set it to the map local invokedynamic 0 #0:dyn:setProp|setElem:map:(Ljava/lang/Object;Ljava/lang/Object;)V 2.接下来我们分配名称数组 //allocate the names array as a JS object invokestatic jdk/nashorn/internal/objects/Global.allocate:([Ljava/lang/Object;)Ljdk/nashorn/internal/objects/NativeArray;//places it into names invokedynamic 0 #0:dyn:setProp|setElem:names:(Ljava/lang/Object;Ljava/lang/Object;)Vinvokedynamic 0 #0:dyn:getProp|getElem|getMethod:names:(Ljava/lang/Object;)Ljava/lang/Object; 3.查找并加载Lambda函数 //load the constants field for this script compiled and filled at runtime by Nashorn getstatic constants//refer to the 2nd entry, where Nashorn will place a handle to the lambda code iconst_2//get it from the constants array aaload//ensure it’s a JS function object checkcast class jdk/nashorn/internal/runtime/RecompilableScriptFunctionData 4.使用名称和Lambda调用map然后将结果放入 //call the map function, passing it names and the Lambda function from the stackinvokedynamic 0 #1:dyn:call:(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljdk/nashorn/internal/runtime/ScriptFunction ;)Ljava/lang/Object;//put the result in a invokedynamic 0 #0:dyn:setProp|setElem:a:(Ljava/lang/Object;Ljava/lang/Object;)V 5.找到打印功能并在打印机上调用 //load the print function invokedynamic 0 #0:dyn:getMethod|getProp|getElem:print:(Ljava/lang/Object;)Ljava/lang/Object;//load a invokedynamic 0 #0:dyn:getProp|getElem|getMethod:a:(Ljava/lang/Object;)Ljava/lang/Object;// call print on it invokedynamic 0 #2:dyn:call:(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; lambda函数本身被编译并作为私有函数放在与脚本相同的类中。 这与Java 8 lambda非常相似。 代码本身很简单。 我们加载字符串找到其长度函数并调用它。 //Load the name argument (var #1) aload_1//find its length() function invokedynamic 0 dyn:getMethod|getProp|getElem:length:(Ljava/lang/Object;)Ljava/lang/Object;//call length invokedynamic 0 dyn:call:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;//return the result areturn奖金回合–最终字节码 到目前为止我们一直在处理的代码实际上并不是JVM在运行时将执行的代码。 请记住每个invokeDynamic指令都将解析为物理字节码方法然后JVM将其编译为机器代码并执行。 为了查看JVM运行的实际字节码我使用了一个简单的技巧。 我在类中用一个简单的Java方法调用包装了对length的调用。 这使我可以放置一个断点并查看JVM执行以进入Lambda的最终调用堆栈。 这是代码– js var a map.call(names, function(name) { return Java.type(LambdaTest”).wrap(name.length()) }); 包好了– public static int wrap(String s) { return s.length(); } 现在让我们玩一个游戏。 该堆栈中有几帧 想一想。 如果您猜到少于100 –您欠我一杯啤酒。 完整的调用堆栈可以在这里找到。 之所以如此也是非常有趣的原因这是关于即将发布的全新帖子的一个故事。 参考 Java 8在Takipi博客上由我们的JCG合作伙伴 Iris Shoor 在New Nashorn JS引擎中编译Lambda表达式 。 翻译自: https://www.javacodegeeks.com/2014/02/java-8-compiling-lambda-expressions-in-the-new-nashorn-js-engine.htmlnashorn预编译
http://www.zqtcl.cn/news/75060/

相关文章:

  • 多个域名指向同一个网站 备案字体设计分析
  • 建设网站浩森宇特微信小程序跳转到网页
  • seo关键字优化软件深圳有实力的优化公司
  • 国外有什么优秀的网站推荐中国家居设计网
  • 免费制作logo的网站郑州中森网站建设
  • 网站排行南京建设高端网站
  • 做任务赚话费的网站wordpress柚子皮
  • 济南广运建设公司网站seo项目培训
  • 网站建设需要怎么做长春火车站停运了吗
  • 网站打开404错误怎么解决方法app推广营销公司
  • 网站代码大全做网站颜色黑色代码多少
  • 搭建网站平台如何做分录上海58同城招聘网最新招聘
  • 下载源码就能建网站吗第一ppt网ppt模板下载
  • 个人网站的设计与开发网站设计软件免费下载
  • 网站锚文本使用查询北京vi设计案例分析
  • 网站界面设计缺点工商做年报网站
  • 网站建设有哪三部wordpress图片居中
  • 杭州网站制怎样建移动网站
  • 长沙seo优化团购网站如何优化
  • 国外的ps网站百度搜索框 wordpress
  • 网站seo步骤金种子酒业网站建设
  • 网站建设安排怎么做网络彩票网站
  • 做网上水果网站的调查seo技术软件
  • 网站建设中的色彩搭配珠海营销网站建设
  • 网站上面的主导航条怎么做网站没有织梦后台
  • 页面排版布局广州建站优化公司
  • 郴州网站开发公司网页设计和网页美工
  • 个人做淘宝客网站要备案吗哪公司建设网站
  • 安徽省网站建设外卖网站设计
  • 模板网站没有源代码广州品牌策划有限公司