軟體開發持續向高階語言演進:組合語言→C→C++→Java。動態腳本語言近年在大型系統滲透加速。Ruby on Rails 爆發式增長證明動態語言在 Web 開發的生產力優勢。對 Java 開發者,JRuby 提供在 JVM 上運行 Ruby、重用 Java 類別庫、漸進式引入動態特性的路徑。
| 維度 | Java | Ruby |
|---|---|---|
| 型別系統 | 靜態強型別 | 動態強型別(鴨子型別) |
| 執行模型 | 編譯為位元碼,JVM 執行 | 解釋執行(近期支援 JIT/位元碼) |
| 程式範式 | 物件導向、命令式 | 多範式:OO、函數式、元程式 |
| 類別結構 | 封閉、編譯期固定 | 開放類別、執行期可修改 |
| 工具支援 | IDE 完善(重構、靜態分析) | 工具受限於動態特性 |
消除冗長型別宣告與轉型:
// Java
XMLPersistence persistence = (XMLPersistence) manager.getPersistence();
// Ruby
persistence = manager.persistence
但犧牲編譯期靜態檢查與 IDE 智能感知。單元測試可捕捉多數型別錯誤。
Ruby 區塊與 each 替代 Java 迭代器樣板碼:
[1,2,3,4,5].each { |n| print n*n, " " } # 輸出: 1 4 9 16 25
資源管理區塊封裝(檔案、交易)無需匿名內部類與 try/finally:
File.open("out.txt", "a") { |f| f.write("Hello") } # 自動關閉
開放類別運行期擴充內建類別:
class String
def blank?; !(self =~ /\S/); end
end
class Fixnum
def odd?; self % 2; end
end
" ".blank? # true
23.odd? # 1 (true)
require "java"
# 方式 1:單一類別別名解決命名衝突
include_class("java.lang.String") { |pkg, name| "J" + name }
s = JString.new("hello")
# 方式 2:模組命名空間隔離
module JavaLang
include_package "java.lang"
end
s = JavaLang::String.new("hello")
BSFManager.registerScriptingEngine("ruby",
"org.jruby.javasupport.bsf.JRubyEngine", ["rb"])
manager = BSFManager.new
manager.declareBean("myUrl", java.net.URL.new("https://jruby.org"), java.net.URL.java_class)
result = manager.eval("ruby", "(java)", 1, 1,
"if $myUrl.defaultPort < 1024 then 'System port' else 'User port' end")
JRuby 將與 Jython、Rhino、Groovy 共構 JVM 多語言生態。掌握動態腳本技術將成核心競爭力。即使不直接使用,理解函數式與元程式概念亦能回饋 Java 設計品質。動態語言不會取代 Java,但會重新定義「為工作選擇最佳工具」的邊界。