Java和JavaScript都有很大的动机让代码运行得更快。在Java和Node.js中,动机就是让服务器端代码运行得更快。而在浏览器端,动机是获得更好的客户端应用程序性能。
甲骨文的JDK使用了HotSpot,这是一个具有多种字节代码编译策略的超级虚拟机。HotSpot经过高度优化,可以生成非常快的代码。
至于JavaScript,我们不禁在想:我们怎么能期望在浏览器中运行的JavaScript代码能够实现复杂的应用程序?基于浏览器JavaScript实现办公文档处理套件似乎是件不可能实现的事情?是骡子是马,拉出来溜溜就知道了。这篇文章是我用谷歌文档写的,它性能非常好。浏览器端JavaScript的性能每年都在飞涨。
Node.js直接受益于这一趋势,因为它使用的是Chrome的V8引擎。
下面是Peter Marshall的演讲视频链接,他是谷歌的一名工程师,主要负责V8引擎的性能增强工作。他在视频中描述了为什么V8引擎使用Turbofan虚拟机替换了Crankshaft虚拟机。
V8引擎中的高性能JavaScript:https://youtu.be/YqOhBezMx1o
在机器学习领域,数据科学家通常使用R语言或Python,因为他们十分依赖快速数值计算。但由于各种原因,JavaScript在这方面表现很差。不过,有人正在开发一种用于数值计算的标准JavaScript库。
JavaScript中的数值计算:https://youtu.be/1ORaKEzlnys
另一个视频演示了如何通过TensorFlow.js在JavaScript中使用TensorFlow。它提供了一个类似于TensorFlow Python的API,可以导入预训练模型。它运行在浏览器中,可用于分析实时视频,从中识别出经过训练的对象。
基于JavaScript的机器学习:https://youtu.be/YB-kfeNIPCE
在另一个演讲视频中,IBM的Chris Bailey讨论了Node.js的性能和可伸缩性问题,特别是在Docker/Kubernetes部署方面。他从一组基准测试开始,演示了Node.js在I/O吞吐量、应用程序启动时间和内存占用方面远远超过Spring Boot。此外,得益于V8引擎的改进,Node.js每次发布的新版在性能方面都有显著的提升。
Node.js的性能和高度可伸缩的微服务:https://youtu.be/Fbhhc4jtGW4
在上面的这个视频中,Bailey说我们不应该在Node.js中运行计算密集型的代码。因为Node.js采用了单线程模型,长时间运行计算密集型任务会导致事件阻塞。
如果JavaScript的改进还无法满足你的应用程序的要求,还有其他两种方法可以将本地代码直接集成到Node.js中。最直接的方法是使用Node.js本地代码模块。Node.js工具链中包含了node-gyp,可用于处理与本地代码模块的链接。下面的视频演示了如何集成Rust库和Node.js:
JavaScript与Rust集成,远比你想象得简单:https://youtu.be/Pfbw4YPrwf4
WebAssembly可以将其他语言编译为运行速度非常快的JavaScript子集。WebAssembly是一种可在JavaScript引擎内运行的可执行代码的可移植格式。下面的视频做了一个很好的概述,并演示了如何使用WebAssembly在Node.js中运行代码。
在NodeJS中使用WebAssembly:https://youtu.be/hYrg3GNn1As
富Internet应用程序(RIA)十年前,软件行业一直热议利用快速的JavaScript引擎实现富Internet应用程序,从而取代桌面应用程序。
这个故事实际上在二十多年前就已经开始了。Sun公司和Netscape公司达成了共识,在Netscape Navigator中使用Java小程序(Applet)。JavaScript语言在某种程度上是作为Java小程序的脚本语言而开发出来的。服务器端有Java Servlet,客户端有Java Applet,这样就可以在两端使用同样的一门编程语言。然而,由于各种原因,这种美好的愿望并没有实现。
十年前,JavaScript开始变得足够强大,可以实现复杂的应用程序。因此,RIA被认为是Java客户端应用程序的终结者。
今天,我们开始看到RIA的想法得以实现。服务器端的Node.js和两端都有的JavaScript让这一切成为可能。
当然,Java作为桌面应用程序平台的消亡并不是因为JavaScript RIA,而是因为Sun公司忽视了客户端技术。Sun公司把注意力放在要求快速服务器端性能的企业客户身上。当时我还在Sun公司任职,我亲眼看着这件事情发生。真正杀死Applet的是几年前在Java插件和Java Web Start中发现的一个安全漏洞。这个漏洞导致全球一致呼吁停止使用Java Applet和Java Web Start应用程序。