軟體、程式語言與 runtime
一些初學者的問題
新轉職為軟體工程師的友人,問了我一些與程式語言相關的問題。
友人的原始提問:
今天突然跟朋友聊到一件事情,就是假設今天寫前端好了,或者說任何程式軟體,它可以同時跑兩個程式語言嗎?
例如 python 與 golang ,他們可以在同一個世界一起運行嗎?還是說基本上不行。假設別人說一個程式大部分是以 python 寫的,那麼是所有的程式碼都是用 python 寫出來的嗎?
因為好像有時候聽人家講這個是用 python 加 javascript 一起寫出來的,然後就會有很多問號(對於菜鳥來說) ,他們兩個要如何有交集然後各司其職呢?
回答:
程式語言會需要所謂的 runtime 來運行,有一些 runtime 就是真的只能執行一種程式語言。但是,像 jvm ,它執行的是 java byte code ,所以寫 Clojure 的程式碼,也可以呼叫 Java library 又或是 Scala library 來用。這樣子就是可以有兩種以上的語言同時執行在同一個 runtime 裡。此處的 runtime 對應原提問的『世界』
以一個軟體系統來講,它可能會有不只一個 runtime 。比方說,前端是一個 runtime ,後端又是一個 runtime 。那就至少可以在前端、後端各有一種程式語言。另外,像資料庫其實也是一個獨立的 runtime ,而 SQL 則是跑在資料庫的 runtime 之上。
原先的提問並沒有特別去區分 DSL (domain specific language) 與 GPL (general purpose language)。如果也把 DSL 納入考慮的話,像正規表示法 (regular expression)、HTML、CSS 這些都是 DSL,DSL 通常都可以透過函式庫來加以使用,也因此可以在同一個 runtime 裡運作。
友人接著問了進階的問題:
是說突然想到一件事情,這樣子來說的話,其實是不是在後端使用 docker 的話,就可以在每一個 docker 裡跑不同的 runtime,於是後端就同時使用兩個以上不同的程式語言?
這樣做有可能嗎?或者後端還是只能使用單一語言?
回答:
如果談論到 docker 與後端的問題的話:
很多系統最初開始架構時,也許是長成:後端只用一種程式語言,並且跑在一種獨立的 runtime 之上。
為了 deploy 比較方便,會把 runtime 用 docker 包裝起來。比方說,如果後端的語言是 golang 。嫌說要在 EC2 上直接安裝 golang 的 runtime 比較麻煩,就用 docker 包裝。
當系統長到某一個規模時,有時候會有一些特別的需求,所以把後端的一部分,用另一種程式語言來寫,比方說 Machine Learning。這種時候,後端就開始使用第二種程式語言。由於後端是提供 API 給前端,其實對於前端的使用者來說,由於看到的是 API 介面,也看不到裡頭的實作,其實到底後端用什麼語言來實作,用一種還是多種,前端的使用者並不在意。
嚴格來說,對於應用軟體開發工程師來說,重點通常不在於「一個系統可否同時使用多種語言,或是要怎樣才能同時使用多種程式語言?」需要想清楚的問題應該會是:
(a) 應用軟體為什麼要這樣子設計?這是為了爽、為了表現自己很利害?還是說,真的有什麼好處?
(b) 有哪些設計的選項?要達成特定的目的,常常有不同的作法。哪一種作法才是最佳的選項。
之前被問這些問題時,覺得好像也不特別有啟發性。後來,我轉念一想,唉,我自己也是寫程式寫了幾年之後,才想清楚,其實程式語言與 runtime 大不相同,不能混為一談的,也難怪對於初學者來說,這些觀念是如此地讓人感到混亂了。

