Java与Node.js的较量--一场史诗之战

纵观整个计算机发展史,1995是疯狂的一年:这一年Java语言诞生,紧跟其后的是JavaScript。后者虽然含有java二字,实际和java并不沾亲带故。Java属于静态编程语言,需要编译;而JavaScript只是一个简单的解释性脚本语言,属于动态语言。

如果经历过早期java发展,我们不难忘记它曾经的空前巅峰:铺天盖地的推广,超大规模的JavaOne会议。很多人都认定,这种新型的编程语言必将不惜一切代价称霸计算机领域。然后这一预测最终证实只是部分准确。而今,安卓应用、企业级服务器应用程序和类似蓝光光盘的嵌入式空间中,java仍然保持着统治地位。 纵使java有着极为广泛的实现领域,但桌面应用程序和浏览器编程却始终是它的弱点。Java创立的基于html的小应用程序,还有基于java的开发工具,都是开发人员极力推崇的。但复杂的场景或实际需求,往往会打破这种固有的组合。值得庆幸的是,早期服务器端开发成为了java扬眉吐气的领域。

同时,先前被很多程序员误解为Java好姐妹的JavaScript也开始在自己擅长的领域一展雄风。不得不承认,曾有一段时期,HTML和Web大张旗鼓发展的时候,JavaScript像一个小博格人一样,随波逐流。但AJAX的出现,彻底改变了这一现状。

接着,Node.js的横空出世,吸引了业内众多开发者的追捧。与Java或其他编程语言相比,基于JavaScript的Node.js平台在服务器端的表现更为出色——快!更快!Web端动态化发展,对数据请求次数和响应速度的要求,Node.js均可以满足。

放在20年前,这些都是不可想象的。如今等待这对双J兄弟的是一场硬战,输赢将决定谁会坐上编程界头把交椅。一方是在工程应用和体系结构领域根基牢固的静态编程语言;另一方是更加轻量级简易化的动态编程语言。老派编译性语言Java会坚守住自己的阵地吗?高速灵活的Node.js会为JS清除霸权道路上的一切障碍吗?

Java的优势:坚如磐石的应用基础

提到这点,我放佛都听到了开发者魔性的笑声。是的,Java自身存在着一些小的缺陷和bug,但相对而言,它绝对是编程界的直布罗陀巨岩(haha,乃们能听出我对其顶礼膜拜的夸赞吧)。Node.js如要达到这个境界,估计还要再努力上几年。不仅如此,事实上,当初Sun开发java虚拟机所做的回归测试数量级,JavaScript预达到这个水准,没个几十年根本做不到。 如果你启动了一个java虚拟机,那么恭喜你,您获得了一个掌控企业版服务器的资深管理者20年的经验值!如果你毅然决定要是用JavaScript,这将意味着,您可能遇到了一个脾气坏难相处的工作伙伴:这家伙时而能与你友善相处;时而又要拿出自己那套做人准则(JS标准)bibi,向你发起被动侵犯性的攻击。

Node的优势:无处不在的可应用性

正是由于Node.js的出现,JS终于在网络服务平台找到自己的归属位置。Node采用异步编程达到处理并发事件的效果。虽然它的可靠性还有待提高,但其在业内表现已经堪称不俗。传统的web编程,Java实现后台服务,JS完成前端功能;而Node.js可以让JS一人轻松搞定客服端和服务器,特别是当我们想把逻辑层从服务器移植到浏览器层面时,Node简直就是熠熠生辉。或者矫情的老板又想让我们把逻辑层移回服务端,反反复复,不管怎么个玩法,总之Node.js让代码移植更加简化。

Java能赢在何处:更优秀的IDE

Eclipse,NetBeans和IntelliJ,集调试、编译和服务为一体,这是Java开发人员公认的三大顶尖IDE。他们发展至今,潜心专注用户体验,拥有坚实的相关配套插件。而node.js开发人员可以在命令行下编写代码,或者使用文本编辑器。也有一部分人会选择Eclipse和Visual Studio,这二者也是支持node开发的。Node.js在全球范围内掀起的热浪,势必会孕育出一些新的工具和资源。比如IBM团队开发的Node-Red,它允许用户通过组合各部件来编写应用程序。然而,这种新的开源IDE,若要达到Eclipse的水准,尚有一大段距离。再比如前端开发神器WebStorm,这是jetbrains公司旗下一款JS开发工具,可支持多命令行开发。

当然,仅从代码的编辑和简单开发功能出发,这些新型的轻量级工具绰绰有余。但,如果你希望在执行源代码时,IDE可以给开发者更多的指引(好比一场开胸手术中,手握手术刀的大夫希望得到更多的协助),强悍的java开发平台可以直接秒杀那些虾兵虾将——无处不在的java!

Node能赢在何处:简化进程

诸如Ant和Maven此类复杂的软件构建工具,对java编程带来的改变意义非凡。然后,始终存在一个问题。比如,开发者在xml中写出的代码,其规范和语法在其他编译环境下得不到支持。的确,可以使用嵌套标签来展示分支,但java与xml之间恼人的互转问题,仍不好解决。

Java:远程调试

能够远程监控服务器集群性能,一直是java引以为豪的。JVM本身的一些特点,加之性能测试工具的辅助,使得程序可以轻松探测出服务端瓶颈和失败。Java堆栈企业版上可以运行极为复杂尖端的服务器,而使用这些服务器的公司可以在遥测过程中获得最好的用户体验。上述提到的监测调试功能,发展至今已相当成熟,我们在部署服务时会深受其益。

Node.JS:直访数据库

类似CouchDB这种新型数据库,可以通过编写JS脚本直接对其进行访问。Node.js和CouchDB语句可以混合使用,不存在互转问题,头疼的语法差异也可以抛在脑后。

同样的情况,许多java程序开发人员在工作中也需要写一些sql语句,此时就要使用java编写的数据库(比如Derby),到这一步你以为就万事大吉,那么只能说:你想多了!开发人员写好的sql语句,需要进一步经过Derby解析,方可加载在java程序中编译执行。所以,java确实是一门不错的语言,但其语法无法与sql互转,导致开发团队需要明确分工:你来写java,我来写sql。

Java:丰富的资源库

javat提供了一套庞大的工具包集合,这些资源在日常开发中发挥着极为重要的作用。例如,全文检索引擎Lucene和计算机视觉库OpenCV,是最典型的两个开源项目,他们在一些重要的基础工程中扮演着中流砥柱的角色。目前也有用javaScript开发的一些开源共享工具库,其中也有让人眼前一亮的函数和方法,但与Java这套成熟的资源库相比,这一环节java胜出。

Node:JSON

当数据库反馈出结果后,java程序将其转换为一个个java对象。这一环节,开发人员会采用POLP或者Hibernate等映射框架来处理数据,期间的配置和转化耗时是非常大的。最终,java程序才会接受这些java对象。

其实大部分web服务端和数据库,返回的数据类型是以JSON形式封装的(这是JS自带的一种数据交换格式)。这种数据格式被广泛应用于Java开发中,那么问题显而易见喽,开发者需要使用众多JSON解析器或库函数来进行数据的再处理。而JSON是JavaScript原生格式,这意味着在JS中处理JSON数据不需要任何特殊的API或工具包,用户可以简单粗暴直接使用。

Java:坚固的引擎

究竟有多少复杂组件基础开发包是基于java强大的数学函数库,一百个,一万个,这个已经很难去量化了。当初Sun为研发java这套实用工具类,也是消耗了大量的时间和人力。现在被广泛使用的有大数处理BigIntegre,精细复杂的IO库,基于Gregorian和Julian的开源时间/时间库。

在处理简单任务方面,JavaScript的表现还算差强人意,但其实现机理却混乱不堪。一个最常见的例子,JavaScript中定义的函数方法当返回结果是“无”时,可以有三种表现方式:undefined, NaN,以及 null。那么哪一种结果是正确的?其实这三者都是JS语言的数据类型,作用是为了保证程序的严谨性和逻辑性。乍一看,这种怪异的语法在程序运行中一般是不会出错,但与java那些个高大上的库函数一比,又被秒成渣。

Node.JS:速度

node.js速度棒棒嗒,用过的人多说好。数据一来一往,就像闪电一般。它不会作死去盲目设置带有死锁风险的单线程;也不存在内部自检环节,因为这有可能会降低执行速度。总而言之,手起键落,node已然在执行你的代码了。

当然,这种优势下暗藏隐患。代码尽量要写的简单,这样Node.js可以保你事事顺利。一旦某段复杂的代码死锁,整个服务会挂掉。可以这样理解,操作系统开发人员抓耳挠腮费死劲建立起来的系统自保机制,是可以容忍部分程序错误的。但Node.js完全瞧不上这套保护网。这也是node活该的地方。

Java:多线程

执行速度快,固然好。但健壮优良的代码,会更胜一筹。这一轮,java赢得无可置疑。

Java框架开发的web服务器是多线程的。纵使多线程会占用大量时间和内存,但这种内耗是值得的。因为,一个线程死锁,至少还有其他线程扛着;即便一个线程需要长时间占用cpu,至少其他线程不会饥饿等待。

以上情形放到Node.js下,结局惨不忍睹:一个线程慢下来,所有一切慢下来。所以,Node.js仅适用于单线程。

无数程序猿挥洒汗与泪,花费几十年心血,致力于建立一个处理并发事件的智能操作系统。Node在此点上却无法与时具进,玩起了倒退到上个世纪60年代的单线程。

Node:续航能力

祖辈对我们耳提面命:节俭是美德,要做不浪费不索取的好孩子。看着硅谷那帮傻缺用自己的行为在诠释“创新”和“颠覆”,我们确实痛心疾首。但回头静心一想,去其糟粕才是一件意义非凡的啊。Java仍可宝刀未老,先辈们撰写的骨灰级Java老代码无处不在。诚然,Java也在孜孜不倦提供着新的IO接口,但那些已与时代脱轨的老接口将何去何从?小型应用程序和基础实用类也将面临这种抉择。

双赢的局面?混合编程

服务器姓J还是姓JS,这个讨论还会持续很长时间。有一种中庸的方法,可以避开这些喋喋不休的争论—Java和JS的混合编程,将Java类转换为与浏览器兼容的JS。GWT框架把这事做的就很漂亮,很多知名网站就采用了此方法。

嘿嘿,其实还有另外一条小路可以走:像Rhino这种使用Java语言编写的JS的开源实现,程序猿可以直接把Java代码植入其中。如果你够牛逼,还可以在当前比较火的googleV8引擎上捣鼓这个事情。

总之,不要打打杀杀,和谐共处是王道!

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2015-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LET

CPU简介

34190
来自专栏企鹅号快讯

老鸟程序员才知道的40个小技巧

▲ 40条真言,希望对进阶中的程序朋友有所帮助。 1、重构是程序员的主力技能。 2、工作日志能提升脑容量。 3、先用profiler调查,才有脸谈优化。 4、注...

19680
来自专栏编程一生

IO和socket编程

13930
来自专栏北京马哥教育

SDN有哪些开源项目?

SDN 之所以能够发展的如此之快,其中开源社区的贡献不容忽视。随着SDN 各类社区的不断发展状大,开源项目也在不断增多,从控制器到交换机再到网络虚拟化,开源...

42180
来自专栏一个会写诗的程序员的博客

20+个很棒的Android开源项目

20+个很棒的Android开源项目 本文摘自文章: 20+ Awesome Open-Source Android Apps To Boost Your D...

15120
来自专栏IT进修之路

原 IT懒开发【精】

18530
来自专栏SDNLAB

SDN实战团分享(二十五):博科SDN控制器BSC介绍

首先 BSC与 ODL 的本质一样,同样的内核软件,同样的架构。我们下面看这张图说明一下BSC控制器和ODL控制器的关系: ? 下面蓝色的部分就是ODL的实质,...

36870
来自专栏云加头条

智能云上手指南:如何接入腾讯云的自然语言处理能力?

本文将为广大云开发者介绍如何介入腾讯开放的自然语言处理能力,即文智自然语言处理。

84900
来自专栏企鹅号快讯

什么样的密码才是安全的?

什么样的密码才是安全的?相信这样的老生常谈你已经听腻了:密码设置得长一些,混合数字字母符号,避免任何可能容易联系到你本身的密码。但现实是在街头调查中大多数人并没...

20560
来自专栏Python专栏

从《红色警戒:复兴》论MongoDB设计模式的重要性

18540

扫码关注云+社区

领取腾讯云代金券