大內高手專欄:

JLCA 3.0 簡介

作者:蔡學鏞

2004 年 2 月

我當 IT 圖書的兼職翻譯者,已經有好長的一段時間了。我覺得,在資訊產業當一個譯者需要有三種技能:
**第一:**英文能力
**第二:**中文能力
**第三:**專業能力

專業能力會影響對於文章的理解,所以專業能力不足的人,即使英文能力很好,可能無法很好地理解原文。中文寫作能力不好的人,即使英文能力和專業能力都很好,也無法很流暢地用中文表達出來。英文能力不好的人,即使中文能力和專業能力都很好,可能一開始就無法很好地理解原文。

如果你問起這三者何者較重要,我認為依序是:專業能力大於中文能力大於英文能力。英文的聽說讀寫不用樣樣精通,只要看得懂基本的英文句子就可以,反正隨時可以查字典。中文能力就比英文能力重要了,表達成中文句子時,需要信、雅、達。而專業能力又比中文能力重要一些,特別是在文章的技術門檻很高時。

而軟體的遷徙 (migration) 也和翻譯文章相彷彿。由於 IT 產業變動很快,技術改朝換代是常有的事。有時候我們想把舊技術換到新一代的技術 (例如 Visual Basic 到 Visual Basic .NET),有時候我們想把甲公司的技術換到乙公司的技術 (例如 Java 到 C#,或 Visual Basic 到 Java),這些都算是軟體的遷徙。不管你是從 Visual Basic 遷徙到 Java 或 Visual Basic .NET 或 C#、或者從 Java 遷徙到 C#,都必須具備三種能力:
**第一:**原始語言能力
**第二:**目標語言能力
**第三:**專業領域能力

我認為這三者的重要性也是:專業領域能力大於目標語言能力大於原始語言能力。原始語言不需要太精通,只要能看得懂原始語言的程式邏輯就可以,反正隨時可以查原始語言的 API 文件。目標語言能力就比原始語言能力重要了,而且還必須很熟悉目標語言的 API,這一點非常麻煩,要花很多力氣和時間。專業領域的能力是最重要的,該程式到底是涉及資料庫、圖學、Web Services… 等,技術人員必須先具備該領域的知識。所以,對於負責進行軟體遷徙的技術人原來說,首重目標語言能力和專業領域能力。

軟體遷徙的工作,如果需要技術人員一行一行地轉換,就太辛苦了。所幸,市場上有許多工具可以幫忙轉換,但是這樣的轉換工具並不能讓我們高枕無憂,他們通常具有下面的特色:

  • 通常能很完整的轉換程式語言的邏輯
  • 通常只能轉換一部份的 API
  • 通常不能轉換編程模型,與系統架構

也因此,軟體遷徙的難度頗高,必須審慎評估。甚至許多人為,重寫會更簡單。

Java 已經出現整整八年,許多公司也已經利用 Java 寫出許多程式碼。隨著 .NET 的出現,許多公司也開始進行技術評估,嘗試著導入 .NET。就算是深受 .NET 技術所吸引的公司,也不可能在一夕之間丟棄既有的 Java 程式,全部用 .NET 重寫。所幸,微軟提供一些工具,來幫助我們將 Java 轉到 .NET。這些工具包括了:

  1. **Visual J#:**如果是 JDK 1.1.4 或更早以前的 Java 程式,可以直接利用 Visual J#,來將 Java 的原始碼編譯成 .NET 的 MSIL。這樣的編譯,成功率可以達到近 100%。其實,Visual J# 也支援 Java 2 的某些特色。有些 Java 軟體在規劃時,可以盡量只使用 1.1.4 以前的 API,他們的目的正是打算以後可以輕易地跨到 .NET 平台上。
  2. **程式轉換工具:**如果你的 Java 程式用到 Java 2 的許多新 API,那麼你可以利用微軟提供的程式轉換工具 (例如 JLCA),來幫助將 Java 程式轉成 .NET 程式。這些工具通常可以將八九成的程式碼轉換成功,但是許多地方仍須手動調整。我們可以期待,未來版本的此類工具會更強大,轉換的成功率會更高。
  3. **程式合作工具:**既有的 Java 程式不可能一夕改寫成 .NET,而轉換工具也不是 100% 成功,那麼如果能讓既有的 Java 程式繼續運作,而鼓勵大家將新的程式改用 .NET 平台,並慢慢換掉舊的 Java 程式。這個時候,程式碼合作工具就很重要,負責架起 Java 舊系統和 .NET 新系統之間的溝通橋樑。例如:Microsoft .NET and J2EE Interoperability Toolkit,就是這樣的工具。

可能是因為我一直都對英譯中這類「機器翻譯」有興趣,所以,這三者中我最感興趣的是「程式轉換工具」。試想,如果能夠將 Java 程式的邏輯和 API 呼叫都轉換成 .NET,可以讓程式員省下多少時間。

Visual Studio .NET 整合了 JLCA (Java Language Conversion Assistant,Java 語言轉換助理) 這套工具,可以幫助我們進行 Java-To-.NET 的轉換。如果你使用過 Visual Studio .NET 2002 和 2003 版所內建的 JLCA 1.0 和 2.0,你可能會很失望,因為 JLCA 轉換後所產生的 C# 程式問題仍然太多。但是,今年 (2004) 年即將推出的 Visual Studio .NET 2004 (codename Whidbey) 內附的 JLCA 是 3.0 版,功能已經大幅地增強,讓人驚喜。JLCA 3.0 支援 JDK 1.3 (尚未支援 JDK 1.4)。且甚至可以對 JavaMail、JDBC、Swing、JMS、EJB 的 Java 程式進行轉換。

JLCA 的使用方式如下:

  1. 打開 Visual Studio .NET 的 IDE 介面,選擇從選單中選擇「檔案」->「開啟」->「轉換」,或者「File」->「Open」->「Convert」。如圖一所示:
    對 1
    圖 1

  2. 在圖二的對話盒中選擇 JLCA,並按下「確定」。
    對 2
    圖 2

  3. 進入 JLCA Wizard / 第 1 頁的畫面,如圖三所示。從此處你可以發現 ArtinSoft 這家公司的名字。事實上,JLCA 不是微軟研發的產品,而是 ArtinSoft 公司的產品,微軟取得 JLCA 的授權後,整合進 Visual Studio .NET。建議你去 ArtinSoft 的網站逛逛,網址在 www.Artinsoft.com
    對 3
    圖 3

  4. 前一個畫面按下「Next」之後,會進入 JLCA Wizard / 第 2 頁的畫面,如圖四所示。選擇「包含專案檔」的目錄,然後按下「Next」。
    對 4
    圖 4

  5. 在 JLCA Wizard / 第 3 頁的畫面 (如圖五所示) 填妥 Java 專案目錄的位置,再按下「Next」。
    對 5
    圖 5

  6. 在 JLCA Wizard / 第 4 頁的畫面 (如圖六所示) 填妥 C# 新專案的名稱,再選擇專案的屬性為「Windows Application、「Console Application」、「Class Library」、或者「Web Application」,最後按下「Next」。
    對 6
    圖 6

  7. 在JLCA Wizard / 第 5 頁的畫面 (如圖七所示) 填妥 C# 新專案的位置,再按下「Next」,就可以開始轉換。如果程式碼很多,轉換的時間可能會很久。
    對 7
    圖 7

    轉換完畢之後,可以看到一份轉換報告,如圖八所示。
    對 8
    圖 8

轉換報告是以樹狀結構的方式組織而成,內容包括了:

  • 新檔名:C# 的檔案名稱。
  • 原始檔名:Java 的檔案名稱。
  • 狀態:狀態可以是「已轉換」或「已轉換,但有問題」。「已轉換」表示轉換成功。「已轉換,但有問題」表示需要程式員手動修正程式碼,可以從轉換報告內容的超連結 (hyper-link) 來看更詳細的說明。
  • 錯誤:嚴重的錯誤。
  • 警告:不嚴重的警告。
  • 全部的問題:錯誤加上警告的數目。

一開始,你一定會被這一大堆轉換錯誤嚇了一跳。這些無法被 100% 正確轉換的地方雖然很多,但是 JLCA 3.0 提供了豐富的說明文件,可以幫助我們親自動手修改這些轉換不盡完美之處。別小看這些文件,相當豐富,幾乎是任何 Java API 都已經有對應的說明文件。

你可以打開某個檔案,看看程式碼被轉換成什麼模樣。正確轉換的地方,不會有任何的標示。轉換之後仍有問題的地方,會有特殊的標示,如下面三個例子所示:

例一:


//UPGRADE_NOTE: 欄位 'EnclosingInstance' 已經加入類別 'ClockPanel' 以存取其封入執行個體。 
'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1019_3"'   

標示「//UPGRADE_NOTE」的意思是,有進行轉換,且沒有錯誤,只是程式員需要注意此處的變化。這是最輕微的狀況。

例二:


//UPGRADE_TODO:  javax.swing.JApplet 已經轉換成具有不同行為的 'System.Windows.Forms.UserControl'。 
'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1073_javaxswingJApplet_3"'

標示「//UPGRADE_TODO」的意思是,有進行轉換,但是行為可能會有差異,程式員必須自行確認此轉換是否有誤。這是稍微嚴重的狀況。

例三:


//UPGRADE_ISSUE: 未轉換  'java.awt.Graphics2D.setRenderingHint'。 
'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1000
_javaawtGraphics2DsetRenderingHint_javaawtRenderingHintsKey_javalangObject_3"'  

標示「//UPGRADE_ISSUE」的意思是,JLCA 無法進行轉換,程式員必須自行轉換。這是最嚴重的狀況。

手動進行轉換,方法如下:

  1. 先開啟該專案
  2. 從選單中選擇「檢視」->「顯示工作」->「全部」,或「View」->「Show Tasks」->「All」。接著你會看到一個工作清單 (Task List)中列出許多問題。
  3. 用滑鼠點選清單內的某個項目,會立刻跳到對應的程式位置。
  4. 開始修改程式,有疑問的話,可以在有 //UPGRADE_XXX 註解中有底線的地方,按下 Ctrl 鍵,同時用滑鼠點擊,即可看到相關的說明。我認為 JLCA 的說明文件幫助很大。

JLCA 也會製造出一個 SupportClass.cs 的程式碼,以提供一些輔助用的類別。例如,Java 的 Thread 程式設計方式和 C# 不同,所以 SupportClass.cs 內會提供一些輔助的類別,來幫助 C# 用類似 Java 的語法設計 Thread。

我認為 SupportClass.cs 的作法會造成以後軟體維護的困擾 (因為 Programming Model 和 .NET不一致),最好能把它徹底移除,改用 .NET 慣用的作法。除此之外,被轉換出來的 C# 程式,也有許多地方需要進行調整。這些都需要 Refactoring 工具的幫忙。

目前 Visual Studio .NET 雖然不提供 Refactoring 工具,但是你可以向 3rd Party 廠商購買。告訴各位一個好消息,Visual Studio .NET 2004 即將支援 Refactoring (在 Whidbey Preview 版中已經具備 Refactoring)。

Visual Studio .NET 2004 預計會在 2004 年中時釋出,屆時大家可不要忘了試試 JLCA 3.0。

意見與支援

 您有任何問題、意見或建議嗎?您可以透過下列電子郵件與作者連絡:
 xy.cai@msa.hinet.net

更多資訊

想知道大內高手專欄的其他文章嗎?請至此專欄所有列表