NodeJS带来的原生异步并发与事件驱动编程模型得到认可,但是因为其单线程缘故,不能简单方便地从事密集计算,而java优势是多线程并发,Java 8又引入了Lambda表达式,使得Java多线程并发在处理高CPU负载的计算上既强大又方便,那么我们是否对于Javascript中那些密集计算,比如对集合中的map操作,或聚合操作reduce使用Java实现呢?

答案是可以的,利用Java8的Javascript引擎 Nashorn。比如我们可以将Js如下的lambda在JVM中实现:

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.;

Nashorn是用来替代原来Java中的Javacript解释器Rhino, 执行JS速度大大提升,能够使用V8s环境,下面看看如何编译lambda表达式。

不同于Java 和Scala 编译器,是将文件编译成持久文件,如.class文件等,Nashorn是在内存中编译,然后将字节码直接传递到JVM,Java 8使用invokerDynamic来连接Lambda函数代码。

invokerDynamic是在Java 7中加入允许程序员写动态语言,然后决定在运行时如何连接这些代码。

对于Java和Scala语言,编译器是在编译时间决定哪个方法被调用,运行时是通过标准的ClassLoader来寻找相应的类,即使像方法过载解决也是编译时间实现的。

对于动态语言,如js,静态的解决办法就不适用了,当我们在Java中说obj.foo()时,其实是obj有一个类的方法为foo(),而JS运行时是依赖被obj引用的实际对象,这对于静态语言是一个梦魇,因为编译和运行是分开的,编译时连接到这个对象但是却没有运行。但是invokeDynamic可以做到。

invokeDynamic能够推迟这种联动到运行时间,这样在运行时它能指导JVM调用哪个方法。静态语言和动态语言在这点上是双赢的。JVM得到要连接的实际方法,然后优化执行。

Nashorn也是这样高效地实现连接,下面看个例子可以了解如何工作的,下面是返回JS数组值:

invokedynamic 0 "dyn:getProp|getElem|getMethod:prototype":(Ljava/lang/Object;)Ljava/lang/Object;

Nashorn要求JVM在运行传递给它这个字符串,作为交换,它会返回一个方法的一个处理器,用于接收对象和返回一个,只要JVM得到这个方法的一个处理器,它就能连接。

java8 nashorn_使用Java8的Nashorn弥补Node.js密集计算的缺陷相关推荐

  1. [转]为什么我要用 Node.js? 案例逐一介绍

    原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...

  2. 如何更好的利用Node.js的性能极限

    通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...

  3. node.js学习总结

    NodeJS介绍 1.概述: Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎 进行了封装,它主要用于创建快速的.可扩展的网 ...

  4. 为什么 Deno 没有众望所归?超越 Node.js 还要做些什么?

    作者 | 韩亦乐       责编 | 欧阳姝黎 译者序 正文开始 Deno 是一个旨在改进甚至替代 Node 的 JavaScript / TypeScript 运行时.它拥有众多的功能和广泛的关注 ...

  5. 为什么我要用 Node.js? 案例逐一介绍

    介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端, ...

  6. Node.js基础总结

    一.Node.js简介 什么是Node.js js 属于一种脚本性语言,然而脚本语言运行需要一个解析器来解析,对于我们原来写的 js 代码大部分都是运行在网页上,所以浏览器本身就担当了解析器的角色.而 ...

  7. php和nodejs和java的区别_讨论PHP和Node.js开发之间有什么区别

    在很长一段时刻内,决定在Node.js和PHP之间进行挑选是一件很费事的工作,但关于后端程序员来说,这一直很费事,但它从未影响过开发人员.可是工作很快就发生了改变,现在开发人员有必要挑选其中之一.No ...

  8. java8特性快速对list集合的筛选过滤和计算

    java8特性快速对list集合的筛选过滤和计算 一.准备工作 1.创建一个Student对象 package com.shiro.test.java8特性;import java.io.Serial ...

  9. 【全文】狼叔:如何正确的学习Node.js

    说明 2017-12-14 我发了一篇文章<没用过Node.js,就别瞎逼逼>是因为有人在知乎上黑Node.js.那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇 ...

最新文章

  1. java实现layui分页,MVC下实现LayUI分页的Demo
  2. k8s集群dns问题解决办法
  3. 数据结构与算法-- 二叉树中和为某一值的路径
  4. java校招面试题_java校招面试编程题及答案.docx
  5. 自兴人工智能---认识python语言的基础数据类型和操作
  6. 分享40佳非常有创意的社交网络图标集
  7. oracle ogg 12c mysql_Oracle GoldenGate 下载
  8. 腾讯朋友、钉钉等被微信违规公示点名;谷歌更新安卓修复数百万台芯片漏洞;微软终止支持.NET Core 3.0 | 极客头条...
  9. (7)zabbix资产清单inventory管理
  10. bin文件python读取
  11. matlab极坐标图刻度,[转载]如何在Matlab极坐标polar绘图上增加刻度单位
  12. 众测、专属、渗透测试捡破烂小tips
  13. Asus Prime B360M-A+i5-8400+RX 570 黑苹果efi引导文件
  14. mongodb 复制集部署(主从升级版)
  15. 婚姻对女人很重要,但远远不是我们的全部
  16. friends101. The One Where Monica Gets a New Roommate (The Pilot)
  17. 时光不负有心人,自己努力,自己肯定
  18. Python中 whl包、tar.gz包的区别
  19. 【逆天应用】如何用Python实现检测和识别车牌号?(详细教程)
  20. 计算机的典型应用及事例,计算机网络典型应用案例精选

热门文章

  1. Ubuntu 20.04 下安装 OpenCV 3.4.11 并测试使用
  2. 微信小程序分享朋友圈关键代码
  3. 达人评测 r7 5700g对比i7 11700k选哪个
  4. Python基础知识判断正误
  5. Monte Calro Tree Search (MCTS)
  6. 安装webpack一直提示要安装webpack-cli
  7. 数据泄密事件频发 但密码仍有生命力
  8. 【JAVA线上实习】【SSM框架学习】利用SSM框架完成增删改查-----查
  9. java实现上传图片代码_Java图片上传实现代码
  10. Java | IP工具类(获取访问者的ip地址 查询IP地址)