簡介
大家好!希望你們大家都過得不錯。
這一年過得很快,我們來到了思維轉變的五月,這大概是我最期待的一個月,主要是因為裡面有 Prolog!
希望你們喜歡分析的四月。超多人都參加了,我覺得這是目前為止最成功的月份之一。我四月時也跟 Simon Peyton Jones 聊過,那是一場遲來的函式的二月訪談。那真的很精彩,我強烈建議你回去看看,就算只是為了那句優美的話也值得:「當命令式程式設計的石灰岩被侵蝕殆盡,底下就會顯露函式程式設計的花崗岩。」
總之,進入思維轉變的五月吧!一如往常,Erik 和我會快速介紹這些月份的主題,以及我們將要探索的各種語言。
所以這個月我們總共有高達六種語言:Ballerina、Pharo、Prolog、Red、Tcl(Tickle)和 Unison。這些語言每一個都跟比較「主流」的語言很不一樣,所以我們建議你多試幾種,感受一下它們之間的差異。我特別推薦 Prolog,因為它是我這輩子寫起來最享受的語言之一。Erik 也對 Unison 非常興奮,所以那也是另一個值得一試的好選擇。
徽章
想拿到思維轉變的五月徽章,你需要在五月期間,用其中一種語言完成任意五個練習。
另外還有全年的 12in23 徽章。想拿到它,你需要在該語言中解出五個我們精選的練習。如果你是在五月之後才看到這段,你可以在這一年的任何時間完成這部分,所以你並沒有錯過。挑選這些練習並不容易,因為這些語言全都截然不同,所以我們選了一些比較通用的練習,它們解起來有趣,探索不同解法的過程也很有意思。
- 縮寫:把一個詞組轉換成它的縮寫
- 不重複字母詞:檢查一個詞組中是否有重複的字母
- 羅馬數字:將十進位數字轉換成羅馬數字
- 雨滴:把數字轉換成雨滴的聲音
- 太空時代:計算某人在太陽系各行星上的年齡會是多少
這些練習以及前幾個月的練習,都可以在 #12in23 頁面上找到。
總覽
讓我們深入探索,逐一看看每種語言的概況。
Prolog:
- 不同的思考方式。一個程式被定義為一組關聯。你接著用合一(模式比對)「查詢」關聯資料庫來找出答案。非常適合規則式系統
- 語法極少,只有一種資料型態(詞項)和一種語言結構元素(子句)。子句完全由詞項構成,可以定義事實或規則。
- 非常宣告式。你比較不用擔心東西是怎麼被計算出來的,而更關注應該計算什麼。在許多情況下,這代表更少的程式碼
- 專為查詢大型搜尋空間而設計。支援不同的搜尋策略(深度優先、廣度優先),並支援自動剪枝
Unison
- Unison 程式碼中沒有版本衝突!一個 Unison 函式知道它相依項目的雜湊,所以它能找到自己所需的正確版本程式碼。
- Unison 支援在本機開發 UI 和託管的儲存庫中即時瀏覽程式碼,所以你隨時可以點進去查看你所相依的函式庫原始碼。
- Abilities 是以純函式的方式管理「效果」(例如 IO)的一種方法
Pharo
- 語法極少,整套語法一張明信片就能寫得下(只有 6 個保留字!)。訊息語法模仿自然語言,有主詞、動詞和補語(between: 1 and: 2 +)。語意也很單純(例如簡單到不行的優先順序規則)。這讓它更容易學習和閱讀。
- 一旦度過最初的學習曲線,生產力會非常高。原因有很多,包括單純的語意和極少的語法,還有之後會提到的 Pharo 一些突出功能。
- 在大多數平台上都能執行(Windows、macOS、Linux + ARM 支援),跑在快速的虛擬機器上(OpenSmalltalk)
- 不只是 Smalltalk 的一種實作,而且仍在積極開發中(最新的 Smalltalk 版本是 1980 年的 Smalltalk 80)
- 友善的社群
Tcl(發音為「tickle」)
- 語法極少,只有 12 條規則,一張紙就能寫得下。語意也相對直接。讓程式容易閱讀和學習。
- 透過協程實現簡單的並行,讓非同步程式碼可以寫得像同步程式碼一樣
- 內建事件迴圈,可用於網路程式設計和非同步檔案 I/O
- 成熟,但仍持續演進
Ballerina
- 以語言整合查詢,為 JSON、XML 和表格式資料提供型別安全、宣告式處理的第一級支援
- 靈活的型別,以結構型別(鴨子型別)為主。封閉型別是進行子型別化的一種方式,而開放型別則能優雅地處理傳送過多資料的情況。在 HTTP 資源中使用時,內建資料綁定和驗證
- 內建對常見整合模式和連接器的支援,包括分散式交易、補償和斷路器
- 每個 Ballerina 程式都能被任何 Open Telemetry 工具自動觀測,讓你完整掌控並看清程式碼的行為和效能。
- 透過 strands 實現出色的並行,它們是輕量級執行緒。非阻塞的 IO 呼叫很簡單。編譯器可以協助檢查 worker 之間的傳送和接收呼叫,避免死鎖。不可變性對網路應用也很有幫助
- 透過聯集型別進行明確的錯誤處理,並用
check語法糖協助處理
Red
- 輕量。整個工具鏈大約 1.5 MB 的下載量,單一執行檔。
- 可攜。易於跨平台編譯。產生沒有相依項目的小型執行檔。記憶體佔用低。
- Red 有自己的元語言和自己的資料格式(就像 LISP)。程式可以轉換/讀取程式碼。
- 反應式:物件可以互相連結,以減少程式的大小和複雜度(想想 Excel 試算表)
這些語言用在哪裡?
Prolog:
- 人工智慧(IBM 的 Watson)
- (自然)語言處理
- 用於知識庫的分散式資料庫(TerminusDB)
- 甚至用於指定 Java 虛擬機器的型別規則
Unison
- 用於撰寫分散式系統
- 一般網路服務
- 批次運算工作
Pharo
- 用於互動式工具
- 應用於差異極大的領域:線上交易平台和投資管理的雲端工具
- 國防產業的使用者介面和互動原型設計
- 活動規劃的網路應用程式
- 用於 API、資料和系統探索的可塑開發環境工具
Tcl
- 用作黏合程式碼或嵌入式
- 用於 CISCO 路由器的圖形使用者介面
- 各種製造系統
- NASA 曾在許多場合使用過它
- 其他大公司還包括 Pixar、Boeing、Intel、NBC 等等。
- Tk 這個視窗工具組,已被 perl/python/ruby 等其他「腳本」語言採用。
- Expect,一個用來自動化互動式 CLI 應用程式的工具
Ballerina
- 用於雲端原生應用程式
- MOSIP 採用,這是一個基礎身分識別平台,協助政府和其他組織以符合成本效益的方式建置數位和基礎身分識別系統。
從程式設計的角度來看,這些語言有什麼有趣的地方?
Prolog:
- 邏輯程式設計語言(最早的一批之一),自成一種典範(就像物件導向和函式程式設計)
- 動態型別
Unison
- 純函式語言
- 靜態型別
Pharo
- 物件導向語言,但在 Smalltalk 的意義上。跟「一般」的物件導向語言不同:沒有建構子、沒有型別宣告、沒有介面、沒有基本型別。
- 動態型別
Tcl
- 多典範:支援物件導向、命令式和函式風格
- 動態型別
Ballerina
- 多典範:物件導向、函式和宣告式
- 靜態型別
Red
- 多典範:命令式、函式、物件導向、符號式、反應式
- 靜態型別
它們有哪些突出的功能?
Prolog:
- 靈活。許多內建述詞可以在多個方向上運作。讓你能用同樣的語法查詢和建立資料。有些在其他語言中很困難的問題,在這裡輕而易舉
- DCG 就像內建的解析器組合子,非常適合解析、生成、補全和檢查序列
- CLP 是一種用限制條件來定義程式的高效率方式
Unison
- 程式碼不是文字,而是(不可變的)資料。程式碼儲存在資料庫中,並透過 Unison Codebase Manager 存取和更新。文字檔只是把程式碼放進資料庫的一種方式。不可變的資料也代表測試結果可以被快取,而且型別檢查也只需要做一次
- 定義是透過雜湊來參照,而不是透過名稱。這叫做「內容定址」的程式碼。一個定義的語法樹決定了它的雜湊。沒有版本衝突,重新命名輕而易舉。
- Unison 文件是語言中的第一級實體,而且永遠與它們所描述的函式保持同步。你可以在文件中嵌入即時範例,並確保你的範例程式碼能編譯。
- 非常適合雲端運算:不需要建置,函式可以即時散布,而且為 Unison 服務間通訊撰寫編碼器和解碼器的時間也更少。
Pharo
- 直接的執行模型:一切都是物件,而執行完全透過訊息進行(訊息本身也是物件)。甚至控制流程也是透過訊息完成。這個模型雖然簡單,卻非常強大。跟其他物件導向語言相當不同。
- 你的程式碼存在於 Pharo image 中,而不是文字檔裡。Pharo image 包含應用程式的完整狀態,可以在 Pharo 虛擬機器中執行。當你儲存工作時,Pharo 會把環境的完整狀態存成一個 image 檔。這個檔案包含所有物件、它們之間的關係,以及執行環境。image 檔可以與他人分享,也可以載入到不同的機器或平台上。這讓開發者能輕鬆地合作專案,或散布用 Pharo 建置的應用程式
- 即時又沉浸,透過 Pharo 專屬的整合開發環境,在執行時獲得立即回饋。你可以即時執行和修改程式,甚至在它還在執行時這麼做!強大的除錯器支援重新啟動方法,以及即時修復 bug
Tcl
- 直接的型別系統:一切都是字串。「一切都是字串」是 Tcl 過去實作的方式。現在,在底層有一套穩健的型別系統,其中 Tcl 實體(不管是字串、浮點數、陣列還是字典)都有專屬型別的表示法,也有字串的表示法。這大幅提升了 Tcl 程式碼的效能,因為它再也不需要在字串之間來回轉換。
- 「一切都以命令的形式執行」。沒有內建命令。Tcl 隨附一套命令的「標準函式庫」,包括 if 和 while 等等。新增控制流程命令非常簡單,例如 until 迴圈。覆寫 Tcl 命令也很容易。
- 由於輕巧、語意簡單,而且是以 C 函式庫實作,因此容易嵌入
Ballerina
- 雲端原生。內建從 JSON 到使用者自訂型別的轉換。建立(微)服務的語法超級輕巧。內建服務的並行執行。開箱即支援 HTTP(1 和 2)、graphql 和 gRPC
- 自動產生構件,將你的程式碼部署到不同的雲端。這些構件可以是 Dockerfile、Docker image、Kubernetes YAML 檔,或無伺服器函式。
- 內建將程式碼視覺化為循序圖的功能。非常適合將程式碼流程視覺化。甚至能將 HTTP 呼叫視覺化
Red
- 非常適合建置/解析領域特定語言/「方言」(Rebol 術語)。內建幾種方言:
- Red/System:一種編譯成原生碼的 C 層級系統程式設計語言
- Parse:強大的 PEG 解析器
- VID:簡單的圖形使用者介面版面配置建立方言
- Draw:向量 2D 繪圖方言
- Rich-text:富文字描述方言
- 輕鬆建立圖形使用者介面。完全跨平台且原生。支援雙向綁定、即時更新、事件,並提供對作業系統功能的存取
五月期間該試哪一種(或哪幾種)?
它們本身都是很有意思的語言,所以任何一種你都說得通。
- 如果你對雲端運算有興趣,Ballerina 和 Unison 是很棒的選擇。Tcl 也有很出色的並行功能
- 如果你熟悉物件導向程式設計,但想看看不同的做法,試試 Pharo
- 如果你想體驗用一種不是以文字檔為基礎的語言寫程式是什麼感覺,可以試試 Pharo 和它獨特又強大的整合開發環境,或搭配 Unison Codebase Manager 的 Unison。
- 如果你喜歡極簡主義,Tcl、Prolog、Pharo 和 Red 的語法都相當少,語意也相對簡單
- 如果你想看看有趣的典範融合,Ballerina、Tcl 和 Red 都支援不同的典範
- 如果你想試試一些比較不尋常的典範,試試 Prolog 的邏輯程式設計、Red 的反應式程式設計,以及 Ballerina 的宣告式程式設計
- 如果你喜歡函式程式設計,去看看 Unison,特別是它的 Abilities。
- 如果你對超程式設計有興趣,Tcl、Prolog、Pharo 和 Red 都有很棒的支援
當然,如果你有時間,我會建議你試個幾種!它們都非常獨特。用其中幾種精選語言解同一個練習,看看實作方式有多不一樣。