Uploaded avatar of iHiD

物件導向十月

@iHiD
接近3年前
影片

簡介

嗨,大家好。希望你最近一切都好。九月對我們來說是忙碌的一個月,我們在網站上推出了許多新的改進與功能,主要都圍繞著改善引導機制以及相關流程。結果,現在收到的導師請求數量是四週前的兩倍,這真是太棒了。如果你還沒試過讓導師審查你的程式碼,一定要試試看,這是學習的絕佳方式。如果你想幫助別人,佇列裡還有很多請求在等著你伸出援手。你可以在 Contribute 選單裡的 Mentoring 連結註冊成為導師!我們也做了一次大型資料庫更新,把 MySQL 5.6 升級到 MySQL 8,我把它錄了下來,放在 Insiders 區塊,所以如果你是 Insider 而且還沒看過,記得去瞧瞧喔!

好,接著來談 #12in23。九月是個很有意思的月份,我們探索了簡潔、精煉的語言。這個月我們要換個方向,來看看一些大得多的巨獸。我們把焦點放在物件導向語言,特別是 C#、Crystal、Java、Pharo、Ruby 和 PowerShell。我們已經分別在五月和八月談過 Pharo 和 Java,所以這支影片不會再介紹它們,但如果你對這兩種語言的入門介紹有興趣,歡迎去看看前幾個月的影片。不過在這支影片裡,我們要來探索 C#、Crystal、Ruby 和 PowerShell,一如往常,Erik 會帶我們了解這些語言有趣又獨特的地方。

徽章

一如往常,只要在這些語言中完成任 5 個練習,就能獲得物件導向十月徽章。我們也有全年徽章,我知道很多人正朝著它努力。為此,我們準備了 5 個精選練習讓你完成,這些練習都很適合用 OOP 的方式來解。它們是:

  • 二元搜尋樹:在二元樹中插入與搜尋數字
  • 環形緩衝區:實作一個頭尾相連的資料結構
  • 時鐘:實作一個能處理時間、但不含日期的時鐘
  • 矩陣:回傳以字串表示的矩陣的列與行
  • 簡單密碼:實作一個替換式密碼

各語言概觀

C#

  • 由 Anders Hejlsberg 於 2000 年在 Microsoft 開發
  • 這門語言與虛擬機器都有官方規格。2002 年成為 ECMA 正式標準,2003 年成為 ISO 標準
  • 編譯器、.NET Framework(標準函式庫)和 Visual Studio(編輯器)最初都是閉源的,但編譯器和 .NET Framework 在 2014 年開源了
  • 雖然和 Java(早幾年推出)有許多相同的語法,C# 並不是 Java 的一對一翻版(例如支援屬性、實值型別,以及沒有受檢例外)
  • 會編譯成位元組碼,自 .NET 7 起也支援編譯成機器碼(仍在持續改進)
  • 被大量軟體採用,從網站到嵌入式系統,從應用程式(Xamarin)到遊戲(Unity)都有

Crystal

  • Crystal 由 Ary Borenszweig(他在 Exercism 上有帳號)、Juan Wajnerman 和 Brian Cardiff 開發(原本叫做 Joy,但三天後就改名為 Crystal 了 :))
  • 設計目標是兼具 Ruby 的優雅與生產力,以及現代編譯式語言的速度、效率與型別安全
  • 由 Manas 組織開發的開源語言
  • 1.0 版於 2021 年發布
  • 使用 LLVM 編譯成機器碼(就像 Rust)
  • 編譯器最初用 Ruby 撰寫,後來改為自我編譯的版本
  • 卡車公司 Nikola、Manas 等都在使用,主要用於網站,也用於雲端服務、命令列應用程式和腳本

PowerShell

  • 由 Jeffrey Snover 在 Microsoft 帶領的團隊打造,最初於 2006 年發布
  • 開發的起因是 Intel,他們想把自家的 KornShell 腳本從 Sun RISC 搬到另一個平台,以協助自家 CPU 的開發。最後 Intel 選擇了別的平台,但 Microsoft 仍繼續開發他們的新 shell:PowerShell,因為它有機會改善 Windows 系統管理(當時的系統管理並不特別好用,經常得靠 GUI)
  • 語法靈感來自 KornShell,也來自 PHP、Perl 等
  • 第一版只能在 .NET Framework 上執行,也就是只能在 Windows 上跑。但 PowerShell 6.0(2018 年發布)能在 .NET Core 上執行,而 .NET Core 是跨平台且開源的
  • 主要用於系統管理,也用來提供 CLI 工具或其他工具的包裝。我們大量用它來批次處理 Exercism 的儲存庫

Ruby

  • 由 Yukihiro Matsumoto(又名 Matz)開發,於 1995 年首次發布
  • Matz 想用一門真正物件導向的腳本語言,但不喜歡現有的選擇(例如 Perl 和 Python),於是打造了一門新語言:Ruby
  • Matz 形容 Ruby 的核心是一門簡單的 Lisp 語言,物件系統類似 Smalltalk,區塊受到高階函式的啟發,並具有像 Perl 那樣實用的功能
  • 通常由翻譯員執行,但也能即時編譯成機器碼
  • 除了官方翻譯員之外,還有其他實作,例如 JRuby(在 JVM 上執行)、Rubinius(使用 LLVM),以及 YJIT,一個隨官方安裝套件一起發布的即時編譯器
  • 主要用於網站(透過 Ruby on Rails),例如 GitHub、Stripe、Shopify 等族繁不及備載(包括 Exercism 和 Exercism 論壇!)。Ruby 也常用於自動化

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

它們全都是物件導向語言,只是實作方式不盡相同(例如 Crystal 和 Ruby 用 Smalltalk 的訊息傳遞模型來呼叫方法)。

C#

  • 強型別且靜態型別
  • 也支援指令式與宣告式範式,而且越來越偏向函式式

Crystal

  • 強型別且靜態型別(和 Ruby 不同)
  • 也支援函式式與指令式程式設計

PowerShell

  • 強型別
  • 也支援指令式、函式式程式設計,以及以管線為基礎的程式設計

Ruby

  • 動態型別
  • 也支援函式式與指令式程式設計

話雖如此,這些語言首先都是物件導向語言。

這些語言有哪些過人之處?

C#

  • 幾乎在任何地方都能執行,包括透過 Xamarin 開發的應用程式。最初只能在 Windows 上執行,因而催生了 Mono,一個免費、開源且跨平台的 C# 編譯器與執行環境實作。2015 年推出了 .NET Core,完全跨平台且開源
  • 通用:幾乎能用於任何工作負載,包括應用程式、網站和遊戲
  • 表達力強:用相對少量的 C# 程式碼就能做很多事。尤其 LINQ 能大幅提升生產力,用起來也很有意思
  • 工具支援極佳,無論是 IDE 還是建置系統之類的工具。Visual Studio 只能在 Windows 上用,但 JetBrains Rider 和 VS Code 都是跨平台的
  • .NET Compiler Platform(常被稱為 Roslyn)是解析、轉換與產生 C# 程式碼的絕佳方式(我們在 C# 的測試執行器、分析器和表示器裡大量使用它)
  • 文件詳盡、深入且寫得很好
  • 社群龐大:有許多資源可用,包括部落格、論壇等等

Crystal

  • 語法優雅易讀,讓 Crystal 程式碼好讀又好寫
  • 表達力強。和 Ruby 一樣,Crystal 非常有表達力,用少量程式碼就能做很多事。這部分要歸功於優秀又完整的標準函式庫
  • 快速。靜態型別讓它能透過 LLVM 編譯成高效率的機器碼,並藉由垃圾回收器簡化記憶體管理
  • 出色的物件導向實作。一切都是物件,包括類別,以及數字和布林值等基本型別
  • 開箱即用,標準函式庫龐大,內建格式化工具、樣板引擎、測試框架等等
  • 互通性。能輕鬆與 C 函式庫互通
  • 跨平台:可在 Linux、macOS 和 Windows 上執行,不過 Windows 還不是一等公民

PowerShell

  • 強大:PowerShell 是系統管理員的強大工具。它能和許多其他系統良好整合,例如 Windows 作業系統(元件、服務與設定),以及其他 Microsoft 產品如 Exchange、SharePoint、Azure 等。它也能與許多其他技術互動,例如 REST API、資料庫、Web 服務等等
  • 隨處可得:PowerShell 在每個現代 Windows 作業系統上都已預先安裝,也能安裝在任何可執行 .NET 的系統上(包括 macOS、Linux 和許多 Unix 系統)
  • 安全性:PowerShell 內建保護腳本、並依據已簽署的腳本與執行原則限制執行的功能。這對確保自動化流程的安全至關重要
  • GUI:你可以結合 Windows Forms 或 Windows Presentation Foundation 等框架,為 PowerShell 腳本設計並打造圖形介面,讓它更易於使用
  • 管線:類似 Unix 系統上的 Bash,PowerShell 讓你能把 cmdlet 串接起來,將一個 cmdlet 的輸出當作另一個的輸入,以完成複雜的操作與任務

Ruby

  • 語法優雅易讀,讓 Ruby 程式碼好讀又好寫
  • 表達力強。Ruby 是非常有表達力的語言,用少量程式碼就能做很多事。這部分要歸功於優秀又完整的標準函式庫
  • 生態系龐大,有數量驚人的可用函式庫(gems)
  • 出色的物件導向實作。一切都是物件,包括類別,以及數字和布林值等基本型別
  • 務實。Ruby 和它大多數的函式庫都非常務實,專注於解決真實世界的問題
  • 互通性。能輕鬆與 C 函式庫互通,這在效能格外重要時經常派上用場。舉例來說,Nokogiri gem 包裝 C 函式庫來負責吃重的工作,讓你能以高效能的方式處理 XML
  • 創新源源不絕。例如 Stripe 打造了 Sorbet,一個 Ruby 的型別檢查器;Shopify 開發了 YJIT,一個 Ruby 的即時編譯器(已納入 Ruby 3.1 以上版本);WASM 支援也正在開發中

亮眼特色

C#

  • 效能優異,對一門受控語言來說尤其如此。語言與執行環境都有大量提升效能的功能,例如 Span<t> 型別和對 CPU 內建指令的存取(如 AVX 指令)。CLR 是個成熟、穩定且效能極高的虛擬機器,並持續在改進</t>
  • 生態系龐大,有數量驚人的可用函式庫。這些函式庫和 C# 一樣成熟、穩定且功能完整
  • 現代且持續演進:語言和執行環境仍在演進,語言更新非常頻繁,變得越來越現代。例子包括:
  • async/await,讓並行處理更簡單
  • span<t>,帶來高效率的記憶體使用</t>
  • 可為 null 的參考型別(修正了那個十億美元的錯誤)
  • 執行環境也定期更新,例如 .NET AOT 可直接編譯成機器碼
  • 替代方案比許多其他語言或生態系少。大多數情況下,用 Microsoft 提供的預設方案就夠了,這通常也包含 IDE。有人可能會說這也算缺點,但它其實很棒,尤其是在剛開始學一門語言的時候

Crystal

  • 兩者兼得。全域型別推論與聯合型別的組合,讓 Crystal 感覺像動態型別語言,通常不太需要指定型別,卻同時擁有靜態型別語言的效能與額外的安全保證(包括編譯時期的 nil 檢查)
  • 超程式設計。Crystal 不像 Ruby 那樣在執行時期做動態超程式設計,而是有在編譯時期執行的巨集。巨集作用於 AST 節點並產生程式碼,定義和使用都相當容易。Embedded Crystal(ECR)是內建的樣板引擎,用巨集把 Crystal 程式碼嵌入其他文字中
  • 出色的並行能力。它採用類似 Go 的並行模型,使用纖程(輕量的執行單位),並透過通道互相溝通,讓並行變得簡單易用
  • 高生產力又有趣。Ruby 以針對生產力與開發者幸福感而設計聞名,語法優雅易讀,使用體驗極佳。由於 Crystal 的語法和設計與 Ruby 非常相似,這點也適用於 Crystal(有趣的是,不少 Ruby 程式碼本身就是合法的 Crystal 程式碼)

PowerShell

  • cmdlet:PowerShell 以 cmdlet(唸作「command-let」)作為積木。它們是小型、以任務為導向的命令,包裝現有的功能,為系統管理員提供一致(例如用 Get-Help 顯示任何 cmdlet 的說明)、對系統管理員友善的介面。各種「後端」都有對應的 cmdlet,例如所有 .NET 類別、Windows Management Instrumentation、Azure 等等。cmdlet 可以用任何 .NET 語言定義,而且定義方式非常宣告式,參數、參數驗證、需求(required true/false)、替代(switch)名稱等等都能輕鬆定義
  • 物件導向:PowerShell 裡幾乎所有東西都是帶有各種屬性的物件。檔案、處理程序、登錄機碼,甚至字串和數字這類簡單的資料型態,全都當作物件處理,這樣的方式簡化了你處理與互動不同類型資料和服務的方式。用過 .NET 的人一定會覺得很熟悉
  • 遠端管理:它支援 Windows 伺服器與系統的遠端管理,甚至能管理 Azure、AWS 和 GCP 上的雲端資源,這對管理大規模的自動化與部署至關重要
  • 可擴充:它有很棒的內建模組系統,也讓你建立自訂的 cmdlet、函式和模組,還能與其他程式語言和函式庫搭配,依需求進一步擴充它的能力

Ruby

  • 高生產力又有趣。Ruby 以針對生產力與開發者幸福感而設計聞名。這雖然難以量化,但用過 Ruby 的人的熱情已經說明了一切
  • 超程式設計。Ruby 極具動態性,允許在執行時期做超程式設計。無論是對現有的類別做猴子補丁、動態新增或呼叫方法,Ruby 都能滿足你
  • Ruby on Rails 是打造網站的絕佳全功能框架。開箱即用,內含樣板、快取、ActiveRecord(透過物件與資料庫互動的方式)、資料庫遷移、scaffolding、WebSockets 等等

該選哪一個

  • 如果你熟悉物件導向程式設計,但想看點不一樣的做法,試試 Pharo
  • 如果你懂 Java 或 C#,但已經一陣子沒碰了,不妨再試一次。這兩門語言都進化了很多,去看看那些閃亮的新功能吧!
  • 如果你正在找工作,C# 和 Java(以及程度較小的 Ruby)也是很好的選擇,因為它們是雇主最常要求的語言之一
  • 如果你懂 Ruby,試試 Crystal,看看一門靜態型別的 Ruby 會是什麼樣子、感覺如何
  • 如果你喜歡動態語言,卻又想要優異的效能,去看看 Crystal
  • 如果你懂 Bash 或 Windows 批次檔,試試 PowerShell,體驗一下 shell 腳本的另一種、物件導向的做法
  • 如果你對腳本語言情有獨鍾,Ruby、Crystal 和 PowerShell 都是不錯的選擇
  • 如果你想玩點超程式設計,Pharo、Crystal 和 Ruby 都很適合(C# 也逐漸加入一些超程式設計功能)
  • 如果你想體驗用一門不靠文字檔的語言寫程式是什麼感覺,試試 Pharo 和它獨特又強大的 IDE
  • 如果你喜歡打造網站,Ruby 和它的 Ruby on Rails 框架值得一試
2023年10月01日 · 覺得有幫助嗎?