位元詩人 [Groovy] 程式設計教學:簡介

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

說明

Groovy 是一個運行在 Java 平台之上的動態型別 (dynamically-typed)、通用型 (general-purpose) 程式語言,但可視需求自行加入型別的標註。

目前 Groovy 是 Apache 基金會底下的一個開放原始碼 (open-source) 計畫,以 Apache License v2 授權發行。大體上來說,可以放心地將 Groovy 用在商業軟體上,不強迫開發者公開程式碼。實際上,也有不少商業公司使用 Groovy。

雖然 Groovy 在台灣能見度不算高,但 Groovy 其實在 Java 生態圈中仍有一定地位,像是用在 Java 及 Android 專案管理的 Gradle 就是一個基於 Groovy 的領域專用語言。另外一個常見的用途是使用 Spock 為 Java 專案寫測試程式。

Groovy 的特性

根據 Groovy 官網及其他相關資料,可以 Groovy 有以下特性:

  • Java 平台
    • 運行在 Java 平台上
    • 可和 Java 函式庫互通
    • 語法上和 Java 相容
  • 語法特性
    • 動態型態語言,但可選擇性加入型態標註
    • 吸收 PythonRuby、Smalltalk 等語言的特性
    • 撰寫領域特定語言 (domain-specific language)
    • 元程式設計 (metaprogramming)
    • 函數式程式設計 (functional programming)
  • 豐富的生態圈,包括但不限於

Groovy 的優缺點

Groovy 不僅可運行在 Java 平台上。更重要地,Groovy 可以直接沿用 Java 函式庫,減少程式設計者重造輪子的時間和心力。其實,Groovy 也可以用來寫 Java 函式庫,供其他 Java 程式使用,但因為效能的考量,實際上較少這樣做。

從 Groovy 上知名的專案來看,包括網頁程式 (Grails)、桌面程式 (Griffon)、工作流程自動化 (Gradle)、測試框架 (Spock) 等,大部分都是比較不需效能的部分。使用 Groovy 的好處,在於 Groovy 可以和 Java 共存,對於不需要效能的部分用 Groovy 節省開發時間。

Groovy 在設計時,參考了一些 Python、Ruby、Perl、Smalltalk 等語言的特性,語法相對簡潔,類似腳本語言。Groovy 有做為通用型腳本語言的潛力,尤其在 Windows 平台上。

由於 Windows 平台對 C 支援不佳,大部分基於 C 語言的腳本語言,包括 Perl、Python、Ruby,在 Windows 上有時會水土不服。而 Groovy 是基於 Java 平台,絕大部分的 Java 函式庫都是以 Java 實作,幾乎沒有 C 所造成的問題。

但是 Groovy 目前學習資源較少,所以較少程式設計者將 Groovy 當成主力腳本語言。絕大部分 Groovy 使用者都是學會 Java 後,把 Groovy 當成第二語言。

Groovy 易學嗎?

雖然 Groovy 號稱簡單易學,但筆者認為其實 Groovy 並不是那麼容易,因為:

  • Groovy 的語法 (syntax) 是 Java 語法加上 Groovy 特有的語法而成,等於要先學完 Java 語法
  • 大部分的 Java 函式庫預設程式設計者使用 Java,範例和 API 文件都以 Java 使用者的角度撰寫,所以還是要閱讀 Java 程式碼
  • Groovy 的工具鏈 (toolchain) 是沿用原先 Java 的。Java 的工具鍵較為複雜
  • Groovy 學習資源較少,且大部分的 Groovy 學習資源都是以讀者為 Java 程式設計者的前提去撰寫

總之,學習 Groovy 不會省掉學習 Java 的時間。Groovy 是在學完 Java 後,想要用更簡單的程式碼完成相同的任務才去學的語言。

為什麼要學 Groovy?

承上節,如果去查一些語言排名網站,可以發現 Groovy 不是最熱門的語言,為什麼還要學習 Groovy 呢?

即使程式設計者以 Groovy 撰寫程式碼,仍然是用 Java 函式庫完成各項任務。使用 Groovy 是為了簡化語法,用更快的時間完成相同的任務。

許多程式設計者學習 Groovy 是為了 Gradle,這是目前 Java 平台主流的編譯自動化工具。先前 Java 生態圈使用 AntMaven,這兩套都以 XML 為基礎。比起程式語言,XML 相對不易使用。故 Gradle 改以 Groovy 為基礎所開發的領域專用語言。

由於網頁程式和桌面程式是做為使用者介面,往往不會是效能瓶頸的部分,將這些使用者介面的部分使用 Groovy 開發,而僅在需要效能的部分改用 Java。除了一開始學習 Groovy 的時間成本外,這樣的模式反而更節省開發時間。

由於現行主流 Java IDE 的支援,Groovy 程式碼可以和 Java 程式碼混在同一個專案,通常核心功能仍是用 Java 開發,但是測試程式和效能無關,就可以轉用 Groovy 撰寫。結合不同程式語言的長處,省下開發所費的心力。

對於撰寫應用程式來說,靜態型別語言較為合適,因為可以透過語法和型別檢查提前找出錯誤。然而,對於文字處理 (text processing)、資料分析 (data analysis)、工作流程自動化 (workflow automation) 等任務,靜態型別反而帶來過多的限制。這時候,Groovy 可以做為 Java 生態圈的動態型別語言方案。

Groovy 的效能

先前 Groovy 因速度過慢而遭人詬病,不過,在 2.0 版後,Groovy 的速度已經改善不少。透過一些最佳化的方法,Groovy 程式的速度僅為 Java 程式的三倍慢左右,對大部分的情境來說,其實也夠用了。

如同本文先前所提到的各種情境,必要的時候,還是可以用 Java 撰寫核心功能,再由 Groovy 呼叫。所以,不太需要擔心這點。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。