programming  

Oct 23, 2016 • Michael Chen

有時候,因為工作或興趣,會去接觸某些新的程式語言。學起第二個或以上的程式語言,比起初學第一個程式語言時,已經有些程式設計的基本概念,這時候要做的事情主要是學習新的語法、函式/物件庫、開發工具等。學了程式語言一陣子,就會發現,有時候我們是在用不同的工具解決相同的問題。例如,寫網頁程式時,後端語言的主要工作是橋接資料庫和網頁伺服器,而 Java、Python、Ruby、PHP、ASP.NET 等都各自有其解決方案。那麼,有沒有一個語言可以吃全部呢?其實,程式語言也可視為一種產品,不斷會有新的語言出來,使得數位世界更加分裂。

例如,你平常習慣用 Python 寫一些命令稿,將某些工作流程自動化。有一天,你的老闆也需要類似的程式,如果可以將你手邊的 Python 命令稿整理後寄給你老闆是最便利的,但是,如果你的老闆的電腦,沒有適當的 Python 環境的話,這些命令稿就無用武之地了。如果能用 C/C++ 撰寫程式碼並且進行靜態連結的話,你的老闆就不需要額外準備的環境了。但是,如果連平常的這些自動化流程都要重新用 C/C++ 寫也未免都太折磨人了。聽說,最近出現了 Go 這種程式語言,寫起來比 C/C++ 簡單,也可以將程式碼進行靜態連結,算是達到某種中庸,不過,得額外投注心力學習新的語言 (笑)。

在目前的網頁瀏覽器上,JavaScript 是唯一公認的語言,然而,JavaScript 的設計有許多的奇異的地方,難怪會有「JavaScript 優良部分」這種書來協助程式設計者克服 JavaScript 種種的陷阱。有些聰明的工程師就發明了 JavaScript 的轉譯器 (transpiler),先設計某個新的語言,再將該語言轉換成 JavaScript。說起來,這種方案還不少,包括 Babal、TypeScript、CoffeeScript、Dart 等不一而足。看起來,距離程式語言大一統的路是越來越遠了。由於這些轉譯器的語言不同,也很難相互利用對方的程式碼,可行的方法就是將其轉換成 JavaScript 後再給對方。但是,仍然得花心力維護兩套各自獨立的程式碼。類似的故事也發生在 CSS 轉譯器上。

程式碼,也就是程式語法,只是選擇程式語言的其中一環,而有許多其他的因素要考量,像是函式/物件庫的支援、框架的選擇、執行效率、資源使用量、目標平台、開發時間等,很難有一個滿足全部要點的程式語言。程式設計者的時間和心力有限,無法去追逐那麼多的程式語言。通常,只要掌握幾個常用的語言生態圈,能夠勝任自己的工作和任務就好。至於,其他的程式語言,就當成是一些新奇有趣的玩具,偶而寫寫,做做頭腦體操,但是不會全盤換掉你已有的工具。