來試試這瓶GPL,不管你是乾性髮質、油性髮質或根本沒有頭髮,洗頭時都可以使用GPL,讓你跟頭皮屑掰掰;泡沫誤入眼睛時,不會有刺激感,依然可以瞪大杏眼,張望自如;GPL同時還具有護髮潤絲的功能,讓秀髮閃閃發亮;用GPL取代沐浴乳和洗面乳,洗完之後皮膚保濕不緊繃,光滑有彈性;更棒的是,你還可以拿GPL當牙膏,專利的潔垢配方,不但可以去除牙菌斑、預防牙周病,連牙齒都美白了……再告訴你一個獨家小偏方:擠一小段GPL到馬桶、水槽裡,效果比「藍藍香」還要好。

看了上面這段廣告,如果你是個神智正常的人,應該會啼笑皆非。「GPL是什麼東東呀?這麼神奇!別把我當成容易上當的傻瓜」,但其實我們都曾經上當過。

GPL(General-Purpose Language,一般用途的語言)是指「可以用在許多開發領域,沒有特定用途」的語言。C、C++、Java、C#、Ruby、Python等都算是GPL。在適合使用GPL的地方使用GPL,當然沒問題;但是在不適合GPL的地方使用它,事情可能一樣可以完成,只是要花更多精力,不但事倍功半,而且會連帶引發潛在問題。

在特定的專業領域(例如GUI、資料庫、Web、統計)使用GPL,不見得很適合。如果在專業領域能改用專為該領域打造的SPL(Special-Purpose Language,特殊用途語言),程式會變得相當簡短,而且表達力更豐富、生產力更高、也更不容易有bug。許多人也將SPL稱為DSL(Domain-Specific Language),或小語言(little language)。

對於DSL,我們其實並不陌生。SQL就是一種DSL,讓我們和資料庫管理系統(DBMS)進行溝通。SQL有自己的語法,只能用來進行資料庫相關的動作,不能用來寫一般的程式,這就是相當典型的DSL。

除了SQL之外,「小語言」在Unix上有長遠的歷史,為Unix環境增添許多吸引力,例如Awk就是Unix使用者愛用的小語言。近幾年引起大家關注的RoR(Roby-on-Rails)也是一種DSL。RoR讓你不需要寫很多程式碼,就可以架設網站。

最近許多XML應用,也都是DSL的表現,例如微軟的XAML、Adobe的MXML。這些XML都是將GPL的物件模型直接對應到XML,並未發揮太多DSL的優點。而且由於採用「不適合人類編寫」的XML格式,因此最好搭配特別的設計工具(例如GUI設計工具)。我認為,這類XML格式的DSL,只是一種便宜行事的作法,廠商應該要想辦法設計出更好的DSL。

如何設計出DSL?不同的GPL對此有不同的作法,REBOL、Ruby、Common Lisp、Curl、PowerShell都號稱可以讓你設計自己的DSL,但是,它們對於DSL的支援程度,以及DSL的語法彈性,卻大大地不同。

如果某GPL允許開發者方便地自訂DSL,我們會說這種語言支援Meta-Programming。即使一個語言沒有支援Meta-Programming,它依然可以做出DSL,只是(1)會相當辛苦,要自己寫剖析器(Parser);或者(2)做出來的DSL,彈性相當差。例如:在C++/MFC時代,有所謂的事件發派巨集(Event Dispatch Macro),我也認為它是一種DSL,只是囿於C/C++的巨集威力有限,所以此「事件發派巨集」的彈性相當糟糕。

不過,也不要因此就對巨集留下不好的印象。Curl和Common Lisp等許多語言的巨集仍然具有很強的DSL功能,可不像C/C++的巨集這麼陽春。

除了巨集之外,使用外部的語言和工具來設計DSL,也是常見的做法。例如ANTLR讓我們用文字描述方式,定義自己的DSL,它會幫我們產生Parser。

或者,你也可以使用微軟推出的DSL工具,以繪圖的方式,描述DSL的語法。外部定義DSL的作法,或許可以產生不同GPL的剖析器。
如果DSL和GPL的資料和程式完全不能流通,那就沒什麼意思了!畢竟開發應用時,我們必須以GPL為主,特殊的地方才用DSL,兩者之間最好沒有隔閡。

所以,某GPL對於DSL的支援良好與否,我提供三個基本的判斷原則: (1)能否輕易地設計DSL;(2)能否設計出有彈性的DSL;(3)能否讓DSL和GPL使用上合為一體。在未來的編程環境,如果能夠具備良好的DSL支援,絕對是一大加分。

職場講究專業分工,不同才能的員工各司其事;語言也應該往專業分工的方向發展,別再讓通才語言做專才語言的工作,這才是未來軟體開發該走的路。

作者簡介:
蔡學鏞-技術顧問
清華大學資訊工程碩士,曾任華碩集團軟體工程師、元智大學資訊系講師、美商歐萊禮出版社技術編輯、臺灣微軟特約專欄作家。

熱門新聞

Advertisement