[Groovy] 程式設計教學:簡介

PUBLISHED ON DEC 23, 2018 — PROGRAMMING
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 的 DSL (domain-specific language),筆者會注意到 Groovy 也是從 Gradle 開始。

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

    • 運行在 Java 平台上
    • 動態型別語言,但可選擇性加入型別資訊
    • 可和 Java 函式庫互通
    • 語法上接近 Java
    • 吸收 Python、Ruby、Smalltalk 等語言的特性
    • 豐富的生態圈,包括但不限於
      • Gradle:Java 平台相當流行的流程自動化軟體
      • Grails:網頁程式框架
      • Griffon:桌面程式框架
      • Spock:測試框架
      • GPars:平行程式框架

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

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

    Groovy 在設計時,參考了一些 Python、Ruby、Perl、Smalltalk 等語言的特性,語法相對簡潔,類似腳本語言。其實,Groovy 有做為通用型腳本語言的潛力,尤其在 Windows 平台上。筆者在先前的文章中曾說過,由於 Windows 平台對 C 支援不佳,對於主流的腳本語言,包括 Python 及 Ruby 等,在 Windows 上有時會水土不服;而 Groovy 是基於 Java 平台,絕大部分的 Java 函式庫都是以 Java 實作,幾乎沒有 C 所造成的問題。但是 Groovy 目前學習資源較少,是最大的問題。

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

    • Groovy 的語法 (syntax) 是 Java 語法加上 Groovy 特有的語法而成,等於至少會順便看過一輪 Java 語法,但語意 (semantic) 上仍有一些細微的相異
    • 大部分的 Java 函式庫預設程式設計者使用 Java,範例和 API 文件都以 Java 使用者的角度撰寫,所以還是要會看基本的 Java 語法
    • Groovy 的工具鏈 (toolchain) 是沿用原先 Java 的工具,比起 Python 或 Ruby,Java 的工具較為複雜
    • Groovy 學習資源較少,且大部分的 Groovy 學習資源都是以讀者為 Java 程式設計者的前提去撰寫

    因此,筆者著手撰寫一些 Groovy 的學習資料,希望對讀者有所幫助。在下一篇文章中,我們會討論一些使用 Groovy 時的考量,讀者可以思考一下是否要將 Groovy 用於自已的專案中。

    TAGS: GROOVY, JAVA
    你或許對以下產品有興趣:
    © 2014-2019. Michael Chen
    All code in the website is licensed under Apache 2.0 unless otherwise mentioned.