一、Jacl 与Jython历史与由来
在一些Java应用的需求中,集成某种脚本语言的支持能够带来很大的方便。例如,用户可能想要编写脚本程序驱动应用、扩展应用,或为了简化操作而编写循环和其他流程控制逻辑。在这些情况下,一种理想的解决方案是在Java应用中提供对脚本语言解释器的支持,让脚本语言解释器读取用户编写的脚本并在应用提供的类上运行这些脚本。为了实现这个目标,你可以在Java应用所运行的JVM中,运行一个基于Java的脚本语言解释器。Jacl与Jython便是Java脚本语言。Jacl为Tcl的Java实现,Jython为Python的Java实现。 (其他的脚本语言:Rhino:JavaScript的Java实现。 BeanShell:一个用Java编写的Java源代码解释器。)
二、Jacl与Jython性能比较
1)Jacl与Jython性能之可用性比较:
Jacl:如果你想要在Tk脚本代码中创建用户界面元素,请访问Swank project,它把Java的Swing部件封装到了Tk里面。发行版不包含Jacl脚本的调试器。
Jython:支持用Python语法编写的脚本。Python利用缩进层次表示代码块的结构,而不是象其他许多语言一样用花括号或开始-结束符号表示控制流程。
2)Jacl与Jython性能之运行测试:
为一致起见,测试程序的每一种脚本语言的版本都尽量地相似。测试在一台Toshiba Tecra 8100笔记本上进行,CPU是700-MHz的Pentium III处理器,RAM是256 MB。调用JVM时,堆栈大小使用默认值。
表格一:从1到1000000计数的for循环:
解释器类型 | 时间 |
Jacl | 140 秒 |
Jython | 1.2 秒 |
表格二:比较整数是否相等,1000000次:
解释器类型 | 时间 |
Jacl | 300 秒 |
Jython | 4 秒 |
表格三:分配并初始化100000个元素的数组:
解释器类型 | 时间 |
Jacl | 25 秒 |
Jython | 1 秒 |
表格四:分配并初始化500 X 500 个元素的数组:
解释器类型 | 时间 |
Jacl | 45 秒 |
Jython | 1秒 |
表格五:在JVM内初始化解释器所需要的内存:
解释器类型 | 时间 |
Jacl | 大约1M |
Jython | 大约4M |
本项评测证明Jython性能最好,Jacl性能可能是令人难以接受的。如果脚本程序重复执行代码的机会很少,那么这些解释器在速度上的相对差异就不那么重要了。值得指出的是,Jython看来没有为声明二维数组提供内建的直接支持,但这个问题可以通过一个“数组的数组”结构解决。
3)Jacl与Jython性能之集成的难易程度(测试)
本项评测包含两个任务。第一个任务是比较对各种脚本语言解释器进行实例化时需要多少代码;第二个任务是编写一个完成如下操作的脚本:实例化一个Java JFrame,放入一个JTree,调整大小并显示出JFrame。尽管这些任务都很简单,但由此我们可以看出开始使用一个解释器要做多少工作,还可以看出为解释器编写的脚本代码在调用Java类时到底是什么样子。
Jacl性能测试
要把Jacl集成到Java应用,首先要把Jacl的Jar文件加入到Java的CLASSPATH,然后在执行脚本之前,创建Jacl解释器的实例。下面是创建Jacl解释器实例的代码:
Jacl代码清单:
下面的Jacl脚本代码显示了如何创建一个JTree,把它放入JFrame,调整大小并显示JFrame:
- import tcl.lang.*;
- public class SimpleEmbedded {
- public static void main(String args[]) {
- try {
- Interp interp = new Interp();
- } catch (Exception e) {
- }
- }
Jacl代码清单
- 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
- $f show
Jython性能测试
要把Jython集成到Java应用,首先要把Jython的Jar文件加入到Java的CLASSPATH,然后在执行脚本之前,创建一个Jython解释器的实例。完成这个任务的Jython代码很简单:
Jython代码清单:
下面的Jython脚本代码显示了如何创建JTree,把它放入JFrame,然后显示出JFrame。下面的代码不包含调整大小的操作:
- import org.python.util.PythonInterpreter;
- import org.python.core.*;
- public class SimpleEmbedded {
- public static void main(String []args) throws PyException {
- PythonInterpreter interp = new PythonInterpreter();
- }
- }
Jython代码清单
- from pawt import swing
- import java, sys
- frame = swing.JFrame('Jython example', visible=1)
- tree = swing.JTree()
- frame.contentPane.add(tree)
- frame.pack()
从上面的说明可以看出,在Java应用中集成任何一种解释器都是很容易的。同时,只要你掌握了脚本语言的语法,就能够高效地编写出脚本程序。
Jacl与jython性能测评总结:
与其他解释器相比,Jacl的发展速度看起来特别慢,但如果你必须使用Tcl脚本,使用Jacl解释器仍旧是值得的。Jython性能比较强大,是速度最快的一种。唯一真正令人担心的是Jyphon的流程控制语法,不过,你可能会在乎这些语法上的差异,也可能不会在乎。就象Jacl一样,由于需要学习的新知识比较多,用Jython编写脚本可能需要比JavaScript和BeanShell更长的学习时间。如果你想要用Python编写比较复杂的脚本,就应该买一本书。Python是一种广受欢迎的编程语言,因此可供选择的书籍也相当多。
【编辑推荐】