国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

四種Java腳本語言之評測

2019-11-18 11:51:59
字體:
來源:轉載
供稿:網友

  一、腳本解釋器概述
  
  
  在一些java應用的需求中,集成某種腳本語言的支持能夠帶來很大的方便。例如,用戶可能想要編寫腳本程序驅動應用、擴展應用,或為了簡化操作而編寫循環和其他流程控制邏輯。在這些情況下,一種理想的解決方案是在Java應用中提供對腳本語言解釋器的支持,讓腳本語言解釋器讀取用戶編寫的腳本并在應用提供的類上運行這些腳本。為了實現這個目標,你可以在Java應用所運行的JVM中,運行一個基于Java的腳本語言解釋器。
  
  
  一些支持庫,例如IBM的Bean Scripting Framework,能夠幫助你把不同的腳本語言集成到Java程序。這些支持框架能夠讓你的Java應用在不作大量修改的情況下,運行Tcl、Python和其他語言編寫的腳本。
  
  
  在Java應用中集成了腳本解釋器之后,用戶編寫的腳本能夠直接引用Java應用的類,就如這些腳本屬于Java程序的一部分一樣。這種思路既有優點也有缺點。其優點在于,假如你想要用腳本驅動的方式對應用進行回歸測試,或者想要通過腳本對應用進行低級調用,它能夠帶來很大的方便;其缺點在于,假如用戶的腳本直接操作Java程序的內部結構而不是經過認可的API,它可能影響Java程序的完整性和應用的安全。因此,應當仔細地規劃那些答應用戶針對其編寫腳本的API,并聲明程序的其余部分不答應用腳本操作。另外,你還可以對那些不想讓用戶針對其進行腳本編程的類和方法名稱進行模糊處理,只留出那些答應腳本編程的API類和方法名字。這樣,你就能夠有效地降低喜歡冒險的用戶直接用腳本操作受保護的類和方法的可能性。
  
  
  在Java程序中支持多種腳本語言有著非同平常的意義,但假如你正在編寫的是一個商業應用,則應當慎重考慮——盡管你為用戶提供了最完善的功能,但同時也帶來了最多的出錯機會。必須考慮到配置和治理問題,因為至少有一部分的腳本解釋器在定期地進行升級和更新,這樣你就必須花很大的力氣治理各個解釋器的哪些版本適合于Java應用的哪些版本。假如用戶為了解決舊腳本解釋器中存在的BUG,對其中某個腳本解釋器進行了升級,你的Java應用就會運行在一種未經完全測試的配置下。數天或數星期之后,用戶也許會發現由于腳本引擎升級而產生的問題,但他們很可能不會把腳本引擎升級的事情告訴你,這時你就很難再次重復試驗出用戶報告的錯誤了。
  
  
  另外,用戶很可能堅持認為你必須為Java應用支持的腳本解釋器提供補丁。一些腳本解釋器按照源代碼開放的模式及時進行維護和更新;對于這些腳本解釋器,可能有專家幫助你解決問題、修補解釋器,或在新的發行版中引入補丁。這是很重要的,因為腳本解釋器是一個很復雜的工具,包含大量的代碼,假如沒有專家的支持,對于自己修改腳本解釋器這一令人煩惱的任務,你很可能束手無策。
  
  
  為了避免出現這種問題,你應該對于每一種預備在Java應用中提供支持的腳本解釋器進行全面的測試。對于每一種解釋器,確保它能夠順利地處理絕大多數常見的使用情形,確保它即使在極端苛刻的條件下運行大量的腳本也不會出現大的內存漏洞,確保當你對Java程序和腳本解釋器進行嚴格的Beta測試時不會出現任何意外的情況。當然,這種前期測試需要投入時間和其他資源;但不管怎樣,測試投入總是物有所值的。 二、保持系統簡潔
  
  
  假如你必須在Java應用中提供腳本支持,首先必須選擇一個最符合應用要求和用戶基礎的腳本解釋器。選擇合適的解釋器能夠簡化集成解釋器的代碼,減少客戶支持方面的支出,以及提高應用的穩定性。最困難的問題在于:假如只能選用一種解釋器,應該選用哪一種呢?
  
  
  我比較了幾種腳本解釋器,開始時考慮的腳本語言包括Tcl、Python、Perl、Javascript和BeanShell。接著,在深入分析之前,我放棄了Perl。為什么呢?因為Perl沒有用Java寫的解釋器。假設你選擇了一個用本機代碼實現的腳本解釋器,例如Perl,則Java應用和腳本代碼之間的交互就不再直接進行;另外,對于每一個你想要支持的操作系統,都必須提供一個腳本解釋器的二進制代碼庫。由于許多開發者選擇Java是因為看中了它的跨平臺可移植性,為了保證Java應用有這種優點,所以最好選擇一種不依靠于本機代碼的解釋器。和Perl不同,Tcl、Python、JavaScript和BeanShell都有基于Java的解釋器,所以這些語言的代碼可以與Java應用在同一個JVM和進程之內運行。
  
  
  基于以上標準,參與本文評測的腳本解釋器包括:
  
  
  
  
  
  Jacl:Tcl的Java實現。
  
  
  Jython:Python的Java實現。
  
  
  Rhino:JavaScript的Java實現。
  
  
  BeanShell:一個用Java編寫的Java源代碼解釋器。
  
  
  
  
  限定了待比較的解釋器種類之后,接下來就可以從各個方面對它們進行比較了。
  
  
  三、評測之一:可用性
  
  
  第一個評測項目是可用性。這項評測分析了是否存在某種解釋器不可用的情形。用每一種語言各編寫一個簡單的測試程序,然后分別用相應的解釋器運行,結果發現,所有解釋器都通過了測試,每一種解釋器都能夠穩定地工作或能夠方便地與之交互。既然每一種解釋器都值得考慮,那么,有哪些因素可能使開發者偏愛其中一種呢?
  
  
  
  
  
  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循環:
   四種Java腳本語言之評測(圖一)
  表二:比較整數是否相等,1000000次:
   四種Java腳本語言之評測(圖二)
  表三:分配并初始化100000個元素的數組:
   四種Java腳本語言之評測(圖三)
  表四:分配并初始化500 X 500 個元素的數組:
   四種Java腳本語言之評測(圖四)
  表五:在JVM內初始化解釋器所需要的內存:
  四種Java腳本語言之評測(圖五)
  本項評測證實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) {

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拉孜县| 苗栗县| 曲阜市| 通化市| 锦屏县| 九龙坡区| 新河县| 广灵县| 兴文县| 盐亭县| 柘城县| 常山县| 怀仁县| 湄潭县| 东乡县| 莫力| 洛阳市| 奇台县| 灌南县| 绥阳县| 安新县| 岱山县| 商城县| 堆龙德庆县| 阿克苏市| 区。| 东乡| 彭阳县| 澄城县| 屯昌县| 墨竹工卡县| 三台县| 金溪县| 丰台区| 宜兰县| 东兰县| 河间市| 嘉禾县| 定襄县| 青阳县| 崇州市|