Uploaded avatar of iHiD

十二月的消遣

@iHiD
接近3年前
影片

前言

嘿,大家好。歡迎來到十二月。希望你一切都好。

我們剛度過超級忙碌的十月。我們不久前為社群解答推出了一項重大改進。現在我們會去除重複,讓類似的解答只顯示一次;我們新增了排序選項、依程式碼搜尋的功能,而如果你去看看 C#,就會發現我們還加上了依不同程式設計概念篩選的功能。你可以藉此搜尋使用位元移位、遞迴或其他任何你感興趣技巧的解答。我們會在社群週把這項功能推廣到其他學習軌道。

不過現在,我們先把焦點放在 #12in23 上。十一月是個有趣的月份,我們探索了組合語言;而這個月我們要挑戰一組非常多元的語言,分別是 ColdFusion、Groovy、Lua、VimScript 和 Wren。一如往常,Erik 會帶我們了解這些語言有趣又獨特的地方。

徽章

一如往常,只要在這些語言中完成任 5 個練習,就能獲得十二月多元探索徽章。我們也有全年徽章,我知道你們很多人正朝著它努力。為此,我們準備了 5 個精選練習要請你完成,分別是:

  • All Your Base:把以數字序列表示的數字轉換成另一個進位。
  • Flatten Array:把巢狀集合攤平成單一、非巢狀的集合。
  • Queen Attack:判斷棋盤上的兩個皇后是否能互相攻擊。
  • D&D Character:隨機產生《龍與地下城》的角色。
  • Run-Length Encoding:實作遊程編碼與解碼。

各語言概覽

ColdFusion

  • 由 Allaire 公司於 1995 年開發,該公司在 2001 年被 Macromedia 收購,接著又在 2005 年被 Adobe 收購。
  • 設計目標是成為快速開發網頁的平台
  • 執行於 Java 虛擬機器(JVM)上
  • 它有兩套獨立的語法,看起來不同,但語意上完全相同:
  • 較舊的標籤式標記語法,擴充了 HTML 以顯示動態內容。
  • 較新的類 ECMAScript 語法,可用於標籤式語法所在的任何地方,也能用在獨立的腳本檔中。目標是把商業邏輯從標記移到獨立的腳本檔。
  • CFScript 是一門執行於 JVM 上的通用語言,Exercism 就是這樣使用它的。實際上,它從未真正遠離自己的網頁伺服器根源。
  • ColdFusion 是付費產品,但 Lucee 基金會(一個總部在瑞士的非營利組織)仍在積極開發他們的開源 ColdFusion 伺服器,我們在 Exercism 學習軌道上用的就是他們的 Lucee Server。
  • 至今仍在積極開發中
  • 主要用於企業軟體;客戶包括 Apple、Adobe、General Motors 等

Groovy

  • 由 James Strachan 自 2003 年起開發。該專案於 2015 年由 Apache 接手。
  • 目標是在 JVM 上開發一門動態型別的語言(相對於 Java 的靜態型別),同時能減少樣板程式碼
  • 雖然大多數 Java 程式碼同時也是合法的 Groovy 程式碼,但兩者仍有許多差異(例如 Groovy 允許動態型別與進階超程式設計)。這門語言也深受 Python 和 Ruby 影響。
  • 用於腳本、建置工具(Gradle)、持續整合(Jenkins)、網頁應用程式(Grails)、測試(Spock)。Atlassian 工具有一套很受歡迎的第三方外掛,可讓你用 Groovy 寫腳本。

Lua

  • Lua 由 Roberto Lerusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 於 1993 年在巴西里約熱內盧天主教大學開發。
  • 名稱發音是 LOO-ah,在葡萄牙語中意思是「月亮」,也呼應了它部分靈感來源的 Sol 語言,Sol 在葡萄牙語中意為「太陽」
  • 主要設計來嵌入其他應用程式,著重速度、可攜性、可擴充性以及開發時的易用性。
  • 受到 Modula、CLU、C++、SNOBOL 和 AWK 的影響。就像 LISP 和 Scheme 有一個無所不在的單一資料結構機制(list)一樣,Lua 的對應機制就是它的 table。
  • 透過位元組碼直譯,通常在執行時進行,但也可以事先完成。
  • 主要用於腳本用途,例如 World of Warcraft、Dota 2 和 Crysis 這類遊戲,或 Adobe Lightroom 等應用程式以及部分 FreeBSD 系統軟體。也常被用來增加可擴充性,例如 Redis、Neovim 和 Nginx。

VimScript

  • VimScript(也叫 Vim Script,中間有空格,或 VimL,代表 Vim Language)是 Vim 文字編輯器所使用的腳本語言。
  • 衍生自 ex,那是 Vi 之前以行為單位的視覺化編輯器
  • 它不是通用語言,而是專門的語言,提供有效且最佳化的腳本環境,讓你透過外掛、設定、巨集和函式來擴充與自訂 Vim 的功能。
  • 雖然 Vim 主要是用 C 寫成的,Vimscript 讓使用者能透過高階腳本語言來自訂與擴充 Vim。
  • 用在,嗯,Vim 裡,但也用在 NeoVim 上,那是 Vim 的分支

Wren

  • 由 Bob Nystrom 於 2016 年開發,他是《Crafting Interpreters》一書的作者
  • 目標:小巧、簡單、快速。
  • 設計來嵌入其他應用程式。作者覺得現有的選擇(例如 Lua 和 TCL)不夠好,想要一門簡單、可嵌入,而且對具物件導向背景的人來說很自然的語言
  • 應用於:
    • TIC-80:一台用來製作、遊玩與分享迷你遊戲的幻想電腦(類似 PICO8)
    • DOME:跨平台的遊戲製作框架。
    • luxe:跨平台、快速開發的遊戲引擎。
    • Wren Console:一個 Wren 的 REPL 與 CLI,主要由長年投入 Exercism 的貢獻者 Josh Goebel 用 Wren 本身寫成,我們在 Wren 學習軌道上用的就是它

從程式設計的角度來看,它們有什麼不同?

ColdFusion

  • 動態型別
  • 多重典範,主要是物件導向,但函式導向的成分越來越多。

Groovy

  • 通常是動態型別,但也可以是靜態型別(以及漸進式型別)
  • 既能直譯也能編譯(從第 2 版開始)。也因為如此,它常用於腳本
  • 多重典範:主要是物件導向,但也包含指令式、函式導向和宣告式

Lua

  • 動態型別,通常採直譯,但可以預先編譯
  • 多重典範:程序式、物件導向(雖然有點不一樣)、函式導向與資料驅動

VimScript

  • 動態型別且採直譯
  • 多重典範:指令式、函式導向,以及簡單形式的物件導向程式設計

Wren

  • 動態型別,但靜態定義;這讓編譯器能非常快速。
  • 主要是物件導向語言,但也包含指令式與一點函式導向程式設計

這些語言有什麼過人之處?

ColdFusion

  • 伺服器管理與應用程式開發之間有極佳的分離。管理主控台負責設定資料庫連線與伺服器監控(以及其他任何事),應用程式開發者只需要資料來源的名稱(一個 CF 物件,具備必要的方法,並已預先連線到資料庫管理系統的適當部分),再加上對某個目錄的寫入權限,用來放置應用程式檔案。
  • 善用 JVM 與 Java 生態系的力量,包括能匯入任何 Java 函式庫並在 CF 中使用

Groovy

  • 通用:幾乎任何工作負載都能勝任,包括應用程式與網站。
  • 由於執行於 JVM 上,它的所有優點都適用:成熟、效能極高的虛擬機器,以及大量可用的函式庫。與 Java 的互通性也很好
  • 減輕人們對 Java 可能有的許多不滿,例如受檢例外、
  • null 安全性、冗長以及缺乏進階超程式設計
  • 現代語言:進階型別推斷、閉包、內建的正規表示式語法、自動產生 getter 和 setter
  • 絕佳的函式導向程式設計支援:閉包(像 Ruby 的區塊)、柯里化(部分應用)、惰性求值、不可變性等等

Lua

  • 通用:用於嵌入式系統、原型開發、腳本、遊戲、網頁與後端開發。
  • 簡單:語法相對少,讓這門語言容易學習。只有幾種原子資料型別,以及一個內建的複合資料型別:table。記憶體由垃圾回收管理
  • 可攜:直譯器是用 ANSI C 寫的,幾乎任何平台都有它的編譯器

VimScript

  • 簡單:輕量的語法,易學易用。
  • 互通性:輕鬆存取檔案、shell 與其他程式。不必離開 Vim 就能擁有外部工具的全部威力。
  • 表達力強:用少量的程式碼做很多事。寫出精簡且易讀性高的腳本。
  • 強大的正規表示式引擎:Vimscript 的正規表示式實作受到 Emacs Lisp 啟發,提供了強而有力的文字處理工具。

Wren

  • 小巧:虛擬機器的實作不到 4000 行程式碼
  • 典範:虛擬機器的實作註解寫得很用心,用 C 寫成,也不算難讀。是學習如何打造一門語言的好方式。標準函式庫大部分是用 Wren 本身實作的,所以你也能看到它是怎麼實作的。
  • 熟悉:語法讓你更快上手。如果你熟悉 Java 或 C++,會覺得非常親切。它允許依參數數量進行方法多載
  • 非常出色的文件:語言與標準函式庫的文件易讀、內容豐富,而且有大量範例。
  • 標準函式庫雖小,卻出乎意料地完整。

突出特色

ColdFusion

  • 開箱即用:內建大量功能:處理 PDF、ZIP、Excel、XML、JSON、建立 API、電子郵件、S3 整合、各種不同的資料庫……完全不需要安裝額外的套件。非常適合減少版本不相容的問題
  • 可擴充且安全,非常適合企業軟體
  • 簡單、直覺的程式設計,讓新手也能很快做出複雜的資料驅動網頁。與 DreamWeaver 的整合非常出色。

Groovy

  • 靈活的語法:可以省略點號與括號,這讓你能打造出非常漂亮的領域特定語言
  • 超程式設計:同時支援執行期與編譯期超程式設計。例如,@ToString 註解會在編譯期產生 ToString 的實作,而在執行期改變物件的超類別則可以做到猴子補丁。
  • 建構器:透過程式碼漂亮快速地處理與建構 JSON、XML、HTML。搭配 Swing 就能快速開發圖形化使用者介面。
  • Trait:Groovy 的 Trait 讓你以可重複使用的區塊組合行為與屬性。類似 Ruby 的 mixin。

Lua

  • 可嵌入:設計上易於嵌入。提供相對簡單的 C API,讓嵌入更容易。體積完全不是問題:完整的參考直譯器只有 247 kB!
  • 可擴充:基礎語言刻意保持相對精簡,但它允許你輕鬆擴充這門語言。這讓語言更容易學習、嵌入時更輕量,也更靈活
  • 快速:Lua 往往是最快的動態語言之一,尤其是在使用 LuaJit 直譯器時

VimScript

  • 可擴充性:Vimscript 讓你能為編輯器加上新功能
  • 可自訂:把編輯器調整成你喜歡的樣子(Vimscript 外掛本身主要就是用 Vimscript 寫的)
  • 事件驅動:根據特定事件或條件(例如開啟檔案或儲存緩衝區)自動執行程式碼。
  • 運用 Vim 的威力:內建存取 Vim 的功能與 API,讓腳本可以操作文字、緩衝區、視窗等等。

Wren

  • 快速:對動態語言來說效能極佳
  • 可嵌入:易於嵌入其他軟體。這門語言的作者以前是遊戲開發者,希望能為遊戲加上腳本功能。它的 C API 相當乾淨簡單。
  • 並行:透過 fiber 輕鬆實現並行與協程,fiber 是非常輕量的構造(類似 goroutine 或 Erlang 行程),而且彼此之間能輕鬆溝通

該選哪一個

  1. 如果你想打造網頁應用程式,ColdFusion 和 Groovy 是不錯的選擇
  2. 如果你對可嵌入的語言感興趣,Lua 和 Wren 是首選,但 Groovy 也值得一看
  3. 如果你想寫通用腳本,同樣這三門語言,Lua、Wren 和 Groovy,也很合適
  4. 如果你在 JVM 上工作,ColdFusion 和 Groovy 是很自然的選擇
  5. 如果你重視效能,Lua 和 Wren 很可能是你最好的選擇
  6. 如果你的主要編輯器是 Vim 或 NeoVim,VimScript 顯然是絕佳選擇
  7. 如果你有興趣了解或打造編譯器與虛擬機器,Wren 再適合不過了
  8. 如果你有物件導向的背景,Wren 大概是最容易上手的語言
  9. 如果你喜歡 LISP 那種單一而無所不在的資料結構設計,不妨試試 Lua
  10. 如果你想試試事件驅動程式設計,去看看 VimScript 吧
2023年12月01日 · 覺得有幫助嗎?