导读:一个标准的网络项目包括在网络框架下的服务器编程语言、客户端的JavaScript代码和带查询语言的数据库(如SQL)等等。要掌握、装配和整合的技术真是不少。难怪很多开发者在他们输出“Hello world”之前就已经厌倦了。很多工具开发者都意识到这样是行不通的,他们开始寻求更全面地整合其中的一些方面(Google的Web Toolkit就是此类努力的成果)。在动态编程和敏捷开发主导的领域, Node.js和Opa是两种现代典型的全面Web解决方案。两者都具有事件驱动的特性使得它们非常适合编写实时网络应用。让我们来仔细分析比较一下这两种技术的区别吧。
1.Node.js vs Opa:网络框架终极PK
Opa和Node.js:区别在哪儿?
Node.js是建立在Google V8 JavaScript引擎之上的网络服务器框架。它是事件驱动的,采用异步输入输出来最小化其成本并最大化其可扩展性。Ryan Dahl在2009年开始研发它,尽管目前有整个团体在贡献力量,但它仍是团队的主要力量。Node.js让开发者能够用客户端使用的语言JavaScript在服务器端编码,目前由一家叫做Joyent公司提供赞助。
Opa是一个开发网络应用的平台。它既是编程语言,同时也是将所有特性高度整合起来的runtime engine。它用的异步模型和Node.js类似,但却采用了全新的静态类型、编译方式和函数语言,是专门为Web设计的。它的开发工作始于2007年,由MLstate公司赞助。
这两种技术有一些共同点:它们都是开源的;编写“Hello world”这个网络应用只需几行代码(实际上在Opa中只要一行);都致力于Web而不是泛型编程;语法很相近,标准库也非常有可比性。
同样的特性,同样的用例,难道Node.js和Opa就真的相似吗?其实不是的,这篇文章将带领大家挖掘这两者之间“不小”的差别。
Opa vs Node.js:网络聊天测试程序
为了说明和比较这两种语言,我们用一个实例,它也正成为一个网络框架或语言的标准测试程序,那就是Web聊天。它非常合适,因为它包含了大量的客户机——服务器通信。
下面我们分别展示用Node.js和Opa编写的聊天程序的截屏,前者是由Node.js作者Ryan Dahl亲自编写,后者是Opa开发者Frederic Ye编写。Node.js chat app是展示这种语言的典型的例子,而Opa chat app则是纯粹为做比较而写的。
Opa vs Node.js:生产效率
开发者生产效率是选择一种语言非常重要的考虑因素。如果你能快速开发的话,你就能做一些改革创新了。你可以很快创造出原型并保持对市场和用户需求的快速反应。
用SLOC(软件代码行数)作为标准比较生产效率有很多弊端,但它可以粗略估计出编写一个程序需要花多少精力。我们不看生硬的数字,而是展示出这两个程序源代码的全景图(去掉注释之后的)。其中Node.js写的程序我们只展示了client.js和server.js,剩余的文件可以参考标准库。左为Opa编写,右为Node.js编写。
很明显,Opa要简洁得多,这归功于它比Node.js更贴近于自然语言。例如,Opa分布模型提供的是分布对话的原语,这使得在客户机之间或客户机与服务器之间建立异步通信变得非常简单。
Opa vs Node.js:构建用户界面
Node.js和Opa都用(X)HTML和CSS来构建用户界面。当然,两者都可以在那层之上构建库和抽象物,但它们都不强制这样,允许直接、完全控制标记。
Node.js对HTML没有任何特殊支持,仅仅是字符串之间的连接(就像这个)。这种方法存在一些问题。首先开发人员无法验证其正确性,如未封闭的标签、错字,只有在测试时才会被发现。但更重要的是,这可能暗藏着严重的安全隐患。由于HTML被作为字符串处理,这就要求开发者非常小心,不允许XSS的侵入。
另一方面,Opa中的HTML是一种数据类型(不是基本类型,被当做语言标准库的一部分来开发),对语法有特殊支持并使开发者更容易编写。尽管表面上看起来它只是很符合审美,但它的内涵却远不止这些。实质上,上述的问题都已经被解决了:不合语法的语句会被编译器检测出,语言本身提供了内置保护以防止XSS通过规避HTML中的某些值侵入。
下面,我们展示一下从两种语言中截取的相同片段。
Opa vs Node.js:服务器/客户机端的区分和通信
由于Opa和Node.js都能同时用在客户机和服务器端的编程,看看它们怎样处理客户机和服务器之间的通讯应该是一件非常有趣的事情。
Node.js提供了一种直接的方法。服务器和客户机的区分在源代码阶段就已经确定了,一些文件包含在用户端的网页上,另一些在服务器上被Node解释。因此,聊天程序同时包含了server.js和client.js这两个文件。
在Opa中,客户机和服务器端的代码之间没有明确的区分。开发者只管写程序代码就行,Opa编译器会分辨出哪部分代码发给客户机,哪部分发给服务器。当然,开发者可以通过预设函数来影响这一结果。因而,在客户机和服务器之间交换代码就像增加或更改一些指令那样简单。这就是为什么Opa的聊天程序只包含一个文件:main.opa(本例中,为了清楚,所有的函数都加上了注释)。
由于Opa提供了这样的位置透明度,它的通信就建立在一个更高的抽象层次。开发人员所要做的就是依据呼叫方和被叫方的位置来简单调用函数和Opa编译器,并把它们当做本地函数调用或远程过程调用来实施。