之一:可用性 第一个评测项目是可用性。 这项评测分析了是否存在某种解释器不可用的情形。 用每一 种
语言各编写一个简单的测试
程序,然后分别用相应的解释器运 行,结果发现,所有解释 器都通过了测试, 每一种解释器都能够稳定地工作或能够方便地与之交互。 既然每一种解释 器都值得考虑,那么,有哪些因素可能使开发者 偏爱其中一种呢? Jacl: 如果你想要在 Tk 脚本代码中创建用户界面元素, 请访问 Swank project, 它把 Java 的 Swing 部件封装到了 Tk 里面。发行版不包含 Jacl 脚本的调试器。 Jython:支持用 Python 语法编写的脚本。Python 利用缩进层次表示代码块的结构,而 不是象其他许多语言一样用花括号或开始-结束符号表示控制流程。至于这种改变究竟是好 事还是坏事,这就要看你和用户的习惯了。发行版不包含 Jython 脚本的调试器。 Rhino: 许多程序员总是把 JavaScript 和 Web 页面编程关联起来, 但这个版本的 JavaScript 不需要在浏览器中运行。在使用过程中,我没有发现任何问题。它的发行版带有一个简单但 实用的脚本调试器。 BeanShell:Java 程序员很快会对这个源代码解释器产生一种亲切的感觉。BeanShell 的
文档写得很不错,但开发组很小。然 而,只有当 BeanShell 的开发者改变了他们的兴趣, 却又没有其他人填补他们转换兴趣后留下的空白时, 开发组太小才会成为一个问题。 它的发 行版不包含 BeanShell 脚本调试器。 评测之二:性能 第二个评测项目是性能。这项测试是要分析各个脚本解释器执行一些简单程序的速度。 本次测试没有要求解释器排序大型数组,也没有执行复杂的数学 计算,而是执行了一些简 单的、常见的操作,例如循环、整数比较,以及分配和初始化大型数组和二维数组。测试程 序都很简单,且这些操作都是每一个商业应用或 多或少要用到的。另外,本项测试还分析 了每一个解释器初始化和执行简单脚本所需要的内存。 为一致起见,测试程序的每一种脚本语言的版本都尽量地相似。测试在一台 Toshiba Tecra 8100 笔记本上进行,CPU 是 700-MHz 的 Pentium III 处理器,RAM 是 256 MB。调用
JVM 时,堆栈大小使用默认值。 为了便于理解和比较脚本程序的执行速度,本项评测还在 Java 1.3.1 下运行了类似功能 的 Java 程序,又在 Tcl 本机解释器内运行了为 Jacl 脚本解释器编写的 Tcl 脚本。因此,在下 面的表格中,你还可以看到这两次测试的结果。 表一:从 1 到 1000000 计数的 for 循环: [IMG]/imgfiles/2002.9.3.17.33.2.1.jpg [/IMG] 表二:比较整数是否相等,1000000 次: [IMG]/imgfiles/2002.9.3.17.35.50.2.jpg [/IMG] 表三:分配并初始化 100000 个元素的数组: [IMG]/imgfiles/2002.9.3.17.38.7.3.jpg [/IMG] 表四:分配并初始化 500 X 500 个元素的数组: [IMG]/imgfiles/2002.9.3.1
7.39.35.4.jpg [/IMG] 表五:在 JVM 内初始化解释器所需要的内存 [IMG]/imgfiles/2002.9.3.17.41.41.5.jpg [/IMG] 本项评测证明 Jython 具有最好的性能,与其他解释器拉开了相当可观的差距,Rhino 第 二,BeanShell 稍慢,而 Jacl 垫底。然 而,对于你来说,这些性能数据到底能够产生多大的 影响,这与你想要用脚本语言完成的任务密切相关。如果脚本函数中包含大量的迭代操作, 那么 Jacl 或 BeanShell 可能是令人难以接受的。如果脚本程序重复执行代码的机会很少,那 么这些解释器在速度上的相对差异就不那么重要了。值得指出的 是,Jython 看来没有为声 明二维数组提供内建的直接支持,但这个问题可以通过一个“数组的数组”结构解决。 评测之三:集成的难易程度 本项评测包含两个任务。 第一个任务是比较对各种脚本语言解释器进行实例化时需要多 少代码;第二个任务是编写一个完成如下操作的脚本:实例化一 个 Java JFrame,放入一个 JTree,调整大小并显示出 JFrame。尽管这些任务都很简单,但由此我们可以看出开始使用 一个解释器要做多少
工作, 还可以看 出为解释器编写的脚本代码在调用 Java 类时到底是什 么样子。 ■ Jacl 要把 Jacl 集成到 Java 应用,首先要把 Jacl 的 Jar 文件加入到 Java 的 CLASSPATH,然 后在执行脚本之前,创建 Jacl 解释器的实例。下面是创建 Jacl 解释器实例的代码: import tcl.lang.*; public class SimpleEmbedded { public static void main(String args[]) { try { Interp interp = new Interp(); } catch (Exception e) { } } 下面的 Jacl 脚本代码显示了如何创建一个 JTree,把它放入 JFrame,调整大小并显示 JFrame: package require java set env(TCL_CLASSPATH) set mid [java::new javax.swing.JTree] set f [java::new javax.swing.JFrame]
$f setSize 200 200 set layout [java::new java.awt.BorderLayout] $f setLayout $layout $f add $mid