許多年以來,對于軟件項目,企業軟件開發的主流實踐一直都傾向于在單一的通用編程語言上進行標準化,從而使得Java和C#成為今天編程語言的主流選擇。隨著越來越多的目光開始投向DSL,也許我們的前腳已經踏在了一道新的門檻之上,向前望去,我們會發現在軟件項目中采用多種語言已經成為一個標準,但80年代和90年代初出現的問題不會重現。
Martin Fowler提出,也許我們正在邁進這樣的一個新時期:
[……]在這個時期內,我們將見證多種語言在同一個項目上的應用,人們就像現在選擇框架一樣,根據功能來選擇相應的語言。
Fowler稱:“像Hibernate、Struts和ADO這樣的大型框架,給人們在學習上帶來的挑戰,絕不亞于學習一門語言,即便你在單一一門宿主語言上使用這些框架編程也是如此。”此外,在它們的宿主語言中表述需求的難度可能會相當大,并可能引出笨拙難用的配置文件,“這些配置文件實際上就是使用XML寫的外部領域特定語言”。
在語言中嵌入DSL,而不是使用類庫,可能會是一個更為合適的解決方案。Martin給出了這樣的一個分析結論:“API就好比是在聲明一個詞匯表,而DSL則為其增加了相應的語法,使得人們能夠寫出條理清晰的句子。”因此,使用DSL而不是框架會使代碼豐富表現力,為人們帶來“更良好的抽象處理方式”,并使“閱讀我們寫出的代碼及對我們意圖的展示變得更加容易”。
Piers Cawley稱,DSL的主要特性并非其可讀性,而是“它們對去相應領域的高度專注”使得它們能夠更加明確地表義。Cawley為了闡述他的觀點舉了一個例子,說明DSL不僅僅能讓我們“寫出讀起來像領域專家說出來的話一樣的程序”,也可以很技術化,用來代表一個使用它們的語法進行操控的框架。
Neal Ford也相信,被他稱為多語言編程(Polyglot Programming)的勢頭正在興起。在軟件開發的這個新紀元中,日益明顯的主要特征就是嵌入更多的語言,使人們能夠“為所做的菜選擇一把恰到好處的刀,并且恰如其分地使用它”。他舉了一個例子,展示在Java編程語言中并行類庫的使用難度,并將其與Haskell作比。Haskell是一門函數式語言,“消除了變量所帶來的副作用”,并使“編寫線程安全的代碼”變得更容易。Ford強調說,Java和.NET平臺都存在Haskell語言的實現(Jaskell和Haskell.net)。
不再使用單一語言進行開發所帶來的風險之一可能讓80年代末90年代初所出現的問題又再次重現,當時語言就是完全獨立的平臺,既不能互操作也不能放在一起良好地使用。Martin Fowler指出,現在的情況有這樣的一個重要區別:
在80年代末期,人們很難讓各個語言之間緊密地互操作。這些年來,人們花了很大精力創建出可以讓不同語言緊密共存的環境。腳本語言在傳統上與C語言有著很密切的關系。在JVM和CLR平臺上也有人為互操作花費了大量精力。另外人們也在類庫上投入了很多人力物力,為的是讓語言忽視類庫的存在。
最終,要學習并使用多種語言,對于業界乃至開發人員都可能會變成一項重要資產。《Pragmatic Programmers》這本書里面就說到,由于這樣做會對人們對編程的思考方式產生影響,因此這樣能幫助人們發現解決問題的新途徑。
您是怎樣認為的呢?在下去的五年中,我們會開始混合使用語言,并像用類庫一樣頻繁地使用DSL嗎?