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

备案查询网站.net网站开发 平台

备案查询网站,.net网站开发 平台,5 还有网站的域,wordpress 上传工具在最近的一篇文章中#xff0c;我了解了Java 8和Scala如何实现Lambda表达式。 众所周知#xff0c;Java 8不仅引入了对Javac编译器的改进#xff0c;而且还引入了全新的解决方案-Nashorn。 这个新引擎旨在替代Java现有JavaScript解释器Rhino。 这为我们带来了JVM的前列我了解了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在运行时将其传递给该字符串作为交换它将向一个接受对象并返回一个对象的方法返回一个句柄。 只要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 Engine中编译Lambda表达式 。 翻译自: https://www.javacodegeeks.com/2014/02/java-8-compiling-lambda-expressions-in-the-new-nashorn-js-engine.html
http://www.yutouwan.com/news/265782/

相关文章:

  • 网站建设专属名词建立微信商城网站
  • 企业网站的建设论文深圳摇号申请注册
  • 电商网站建设优化旅游网站怎么做
  • 免费个人博客建站什么叫软文
  • 自己开发电商网站难吗网站开发与维护招聘
  • 网站建设需要建站公司沟通哪些中超最新积分榜
  • 网站开发市场成本网站评测的作用
  • 网站做302跳转的意义无锡网络推广运营公司
  • dw个人网站模板wordpress 媒体文件库
  • 网站建设费用低设计好黄骅市在哪里
  • 合肥网站开发培训医疗器械监督管理条例
  • 文学网站建设网站页脚需要放什么用
  • 网站建设重要新wordpress更新主题报错
  • wordpress慢seo推广灰色词
  • 成都专业的网站设计公司做期货的网站
  • 开发网站商城企业宣传视频模板素材
  • 淄博 建网站常州哪家网站建设公司专业
  • 泰州网站制作方案定制wordpress在线更新
  • 网站制作成功后怎么使用制定营销推广方案
  • 平阳企业网站建设辽宁网站建设哪里好找
  • 百度不收录网站吗北京建设工程继续教育网站
  • 外链网站是什么营销推广软文案例
  • 南通优化网站费用自由贸易区的建设网站
  • 产品推广营销seo整站优化费用
  • 网站开发要学的代码广告公司简称
  • 织梦网站图片怎么修改wordpress安装方法
  • 建设一个网站需要哪些人员参与外贸网站自建站
  • 江门网站推广技巧设计师必备的6个网站
  • 网站页面设计原则博客做资讯类网站
  • 网站权重分析广州短视频运营培训