Uploaded avatar of ErikSchierboom

極簡九月!

@ErikSchierboom
大約3年前
影片

簡介

大家好!希望大家都過得不錯。

Exercism 的八月過得很精彩。我們把 Premium 和 Insiders 合併了,把自動化回饋直接加進編輯器,推出了 Track Trophies,還對網站做了好多大大小小的改進!如果你還沒去看看自己的 track、確認能拿到哪些獎盃,一定要去看看喔。我們也寄了一封電子郵件給所有拿到一個以上獎盃的人,記得留意一下。

八月期間,我們也在 #12in23 玩得很開心,探索大家平常拿來開發應用程式的各種語言。

這個月是 Slimline September,我們要探索的是語法通常非常精簡、簡潔的語言。具體來說,我們要看的是 8th(Forth 的後裔)、AWK、Bash、jq、Perl 和 Raku(以前叫做 Perl 6)。

徽章

要拿到 Slimline September 徽章,你需要在九月完成這些語言中任一語言的任五個練習。

另外還有貫穿整年的 12in23 徽章。要拿到它,你需要用該語言解出五個我們精選的練習。

  • Gigasecond:處理日期
  • Atbash Cipher:處理字串
  • Darts:處理數字和條件
  • Luhn:處理字串、條件和數字
  • Series:處理字串和序列

這些練習以及前幾個月的練習,都可以在 #12in23 頁面上找到。

各語言概觀

我們來深入探索一下,先看看每個語言的概觀。

8th

  • 由 Ron Aaron 開發。
  • 名字是對 Forth 語言的雙關,Forth 是它的主要靈感來源。不過和 Forth 有很多不同:
    • 強型別
    • 跨平台
    • 更佳的安全性(沒有直接的記憶體存取,也沒有內建的組譯器)
  • 同時提供免費版和商業版,後者功能更多。
  • 閉源,但購買企業授權後可以查看原始碼

AWK

  • AWK 是 1970 年代由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在貝爾實驗室開發出來的。這個名字是三位作者姓氏的縮寫。
  • 它是一種領域特定語言,專門用來處理文字,但也可以用在其他用途上。
  • AWK 是一種 Unix 過濾器,就像 sed 和 grep 一樣,適合用在管線中。
  • Single UNIX Specification 和 Linux Standard Base 規範都要求任何實作都必須包含它,這也是為什麼大多數 *nix 機器上都有。
  • AWK 語言有幾種不同的實作:
    • awk(原始 AWK 稱作 oawk):最初的實作
    • GNU AWK(gawk):1988 年推出,大幅修訂並擴充了這個語言
    • BWK AWK(又稱 nawk):1990 年代後期推出
    • mawk:快速的位元組碼直譯實作
  • 在許多 *nix 系統上,awk指令是連到gawk或nawk的符號連結

Bash

  • Bash 是 Brian Fox 開發的 Unix shell,在 1989 年釋出。
  • 設計目的是作為 Bourne shell 的免費替代品,如今已成為大多數 Linux 發行版的預設登入 shell。它是 Bourne shell 指令語法的超集,因此更容易轉換過來。
  • 在許多方面擴充了 Bourne shell:大括號展開、命令列補全、訊號處理等等。

jq

  • 由 Stephen Dolan 開發,2012 年釋出。
  • 設計目的是讓你輕鬆查詢、轉換和操作 JSON 文件(「JSON 版的 sed」)。
  • jq工具(實作了這個語言)最初是用 Haskell 實作的,後來被移植到 C。另外也有以 Go 和 Rust 為基礎的移植版本。

Perl

  • Perl 由 Larry Wall 在 1980 年代後期開發,並於 1987 年首次釋出。
  • 設計成通用的指令碼語言,讓報表處理變得更輕鬆。
  • 影響力非常大,尤其是它的正規表達式支援(這點我們之後再回來談)。

Raku

  • 由 Larry Wall(Perl 的創造者)設計,2015 年釋出。
  • 最初叫做 Perl 6,原本的用意是清理這個語言,移除一些被認為沒什麼用或讓人困惑的功能(有趣的是,Larry Wall 曾說:「在 Perl 6 裡,我們認為修正語言比修正使用者來得好。」)。後來 Perl 6 和 Perl 5 的原始碼並不相容,因此改名為 Raku。
  • 設計哲學的核心是讓寫程式變得愉快又有生產力,同時提供各式各樣的工具來應付各種不同的程式設計挑戰(通用目的)。
  • 由於 Raku 是一份規格,所以可以(而且確實)有多種實作。目前唯一還在積極開發的實作是 Rakudo,但也有一些較舊的實作,例如 Pugs(以 Haskell 撰寫)、v6-KindaPerl6 和 Niecza(以 CLR 為目標)。

這些語言用在哪裡?

8th

  • 很可惜,我們找不到它被用在什麼地方。

AWK

  • 用於資料擷取、報表,以及一般的指令碼編寫。

Bash

  • 主要用於系統管理,但也用來提供 CLI 工具,或是包裝其他工具。我們大量用它來批次處理 Exercism 的儲存庫。

jq

  • 用來查詢、轉換和操作 JSON 文件,通常以 shell 指令碼的形式出現。

Perl

  • 用於資料操作、檔案解析、網頁程式設計和系統管理工作。由於它強大的字串處理能力和豐富的模組生態系,在網際網路發展初期大受歡迎。

Raku

  • 用於文字處理、系統管理等等。

從程式設計的角度來看,這些語言有趣在哪裡?

大多數語言都是動態型別、直譯式的,這和它們的指令碼特性很契合。話雖如此,還是有一些例外,尤其是在支援的範式方面。

8th

  • 強型別
  • 多範式:程序式的,但更有趣的是堆疊式(以堆疊為基礎的執行模型)、反射式(能夠檢視並修改自身的結構和行為),以及串接式(所有運算式都是函式,把函式並置即代表函式合成)
  • 可編譯成原生碼,但也可以在 REPL 中直譯執行。

AWK

  • 動態型別,而且通常是直譯的(取決於你用的是哪種實作)。
  • 主要範式是資料驅動:你把程式描述成一組敘述,說明要比對的資料以及所需的處理,而不是明確地定義一連串要採取的步驟。AWK 也支援程序式程式設計。

Bash

  • 動態、直譯式語言
  • 支援命令式和程序式程式設計

jq

  • 動態、直譯式語言
  • 純函式語言(所有值都是不可變的),特別強調「管線」。用起來很有 Unix 的味道。

Perl

  • 動態型別、直譯式
  • 多範式,支援函式式、物件導向和命令式程式設計

Raku

  • 動態型別,但支援漸進式型別,可以在需要的地方加上靜態型別(Perl 是動態的)
  • 多範式語言:命令式、程序式、物件導向和函式式

這些語言為什麼這麼棒?

8th

  • 語法極少,讓這個語言更容易學習和理解。用 JSON 來描述資料(例如物件和陣列)。也支援其他容器,例如堆疊、佇列和堆積。
  • 沒有保留關鍵字。副程式叫做「word」,而且很容易定義新的 word。所有 word 都能在執行時重新定義,不管是內建的還是使用者自訂的。
  • 跨平台。能輕鬆為任何支援的平台產生執行檔。
  • 安全。內建安全功能來防止各種 bug(沒有直接的記憶體存取,執行環境不會連結動態函式庫)。

AWK

  • 語法簡單,AWK 程式的結構非常一致,因此很容易學習和閱讀 AWK 程式碼。它的資料結構也簡單又有彈性。
  • 表達力非常強,可以用很少的程式碼做很多事。非常適合一行指令。
  • 大多數 *nix 機器上都裝好了,代表你可以在很多地方派上用場(和 /bin/sh 一樣,是標準 Unix 中唯一的指令碼語言)。
  • 在管線和 shell 指令碼中運作得非常好,AWK 可以處理其他工具的輸出,反之亦然。

Bash

  • 能在大多數平台上使用。幾乎所有 *nix 機器都內建了它,包括 macOS。有了 Windows Subsystem for Linux (WSL),現在 Windows 系統也能使用 bash 了。
  • 可以當成 RE(P)L 來用,一行一行執行指令,或從檔案讀取並執行程式碼(也就是 shell 指令碼)。如果你用過 Linux 終端機,你很可能寫過 bash 程式碼,因為終端機通常就是一個 bash RE(P)L。
  • bash 和 shell 指令碼廣泛用於系統管理、devops 和電腦管理。
  • 極度多用途又靈活。
  • 強大的字串處理能力,包括非常直覺的字串內插。

jq

  • 處理 JSON 的語法簡單又簡短,很容易學習。
  • 允許自訂函式定義,以進行更複雜的操作。
  • 支援尾端遞迴最佳化,很適合用來遞迴處理資料。
  • jq 工具以單一執行檔的形式發布,大小只有 30 KB 左右。
  • yq工具包裝了jq,讓你能用同樣的語法操作 XML、TOML 和 YAML 檔案(它在底層會把這些資料型別轉成 JSON)。
  • C 和 Go 這兩種實作都支援嵌入其他應用程式。

Perl

  • 能在大多數平台上執行。很適合用來撰寫跨平台的指令碼。
  • 靈活性是 Perl 設計哲學的基石。它最有名的座右銘是:「做同一件事的方法不只一種」(TMTOWTDI)。可以視當下的任務選用不同的做法。
  • 社群強大,也留下許多具影響力的專案。許多指令碼、工具和應用程式都是用 Perl 開發的。它曾被形容為「把網際網路黏在一起的膠帶」。
  • 豐富的模組和函式庫生態系,可透過 Comprehensive Perl Archive Network (CPAN) 取得。

Raku

  • 規模龐大、複雜又強大,但它的設計讓你不需要一次學完。起步很容易,之後再慢慢深入更強大的功能就好。
  • 強大又可擴充的型別系統,包含漸進式型別。這表示你可以指定想要的型別檢查程度,在動態和靜態型別之間取得平衡。
  • 支援多重分派,讓你能在不使用繼承的情況下運用多型。
  • Unicode 在 Raku 裡是一等公民。它原生支援處理不同的字元編碼。
  • 提供進階的並行和平行處理功能。它內建支援非同步程式設計、反應式程式設計和平行執行。

它們有哪些突出的特色?

8th

  • 需要不一樣的思考方式。它獨特的範式組合和其他語言很不一樣,會挑戰你想出不同的方式來處理問題。
  • 以堆疊為基礎,加上逆波蘭表示法(RPN)的語法,讓程式執行的心理模型非常簡單。值會被放到堆疊上,大多數 word 都是根據對堆疊造成的效果來定義的。

AWK

  • 資料驅動的範式非常強大。它需要不同的思考方式:程式被定義成一組條件與動作的配對,文字會被切成記錄(通常一行一筆記錄),每筆記錄再切成欄位(例如 CSV 的欄位,或每個欄位一個單字)。一旦習慣了這種方式,你就會欣賞它的優雅和表達力,也會開始到處看到它的用武之地。
  • 非常適合處理文字。不管是解析文字、轉換文字還是產生報表,AWK 都能搞定。像是印出系統上每個使用者的 shell,或是把 CSV 的某一欄加總,你會驚訝地發現需要的程式碼竟然這麼少。

Bash

  • 非常適合自動化。shell 指令碼很擅長自動化重複性的工作。
  • bash 指令碼使用管線,讓你輕鬆把其他程式串接起來。要寫一個把某個指令的輸出導到另一個指令的指令碼,或是讓指令碼在任何一個執行的指令失敗時就失敗,都輕而易舉。
  • 強大。能輕鬆運用其他工具,讓 bash 成為威力無比的工具。

jq

  • 很適合輕鬆、乾淨地擷取和操作 JSON 資料(現在我們有超多這種資料)。已經成為轉換 JSON 資料的實質標準工具。你甚至可以用 jq 產生 JSON 資料。
  • 支援串流資料,這表示你可以處理「無限」的資料而不會有記憶體問題。
  • 它對管線的重視,對任何熟悉串流的人(例如用過 Unix 工具的人)來說都很容易上手。這也讓 jq 程式碼相當容易理解。

Perl

  • 以簡潔和表達力著稱。你需要很少的程式碼就能做很多事。
  • 特別適合處理文字,很大一部分要歸功於它強大的正規表達式支援。尤其是 Perl 5 引入了許多新功能(例如反向參照、具名擷取群組和惰性量詞)。Philip Hazel 打造了 PCRE(Perl Compatible Regular Expressions),這是一個實作與 Perl 5 相容的正規表達式引擎的 C 函式庫。即使是沒有以 PCRE 為基礎的語言,也常常把自家的正規表達式支援設計成與 PCRE 相容(因此沿用 Perl 5 的語法)。

Raku

  • 支援會自動執行緒化的 junction,讓平行處理容易得多。
  • 支援惰性求值,讓你能處理無限的陣列和序列,而不會碰到記憶體問題。在處理大型資料集,或是處理涉及無限資料流的演算法時,特別有用。
  • 非常適合文字處理,提供更簡單、更好讀、更強大的正規表達式語法。
  • 內建支援用文法定義自訂的領域特定語言(DSL)。這讓你可以為特定的資料格式或語言建立解析器,更容易處理複雜的文字資料。

該試哪一個?

  1. 如果你主要使用 Unix 系統或做 devops,Bash 是非常值得學的語言。學 AWK、Perl 或 Raku 也很有幫助,而且前兩者通常已經預裝在許多系統上。
  2. 如果你在處理 JSON(或 XML/YAML/TOML),jq 是顯而易見的選擇。
  3. 如果你想處理文字,AWK、Perl 和 Raku 是顯而易見的選擇。
  4. 如果你想試點不一樣的,8th 是很棒的選擇。
2023年09月01日 · 覺得有幫助嗎?