給 C++ 使用者的 Rust 簡介:物件導向篇

物件導向程式設計 (Object-Oriented Programming) 目前仍然是最主流的編程範式 (Programming Paradigm),因此 Rust 也提供了物件導向程式語言最核心的幾項功能:封裝、繼承、多型。然而,在 Rust 中定義成員函式的語法與 C++ 有段差距,它的物件模型與實現繼承的方法也明顯異於 C++ 或大多數主流的物件導向程式語言。在這篇文章中,我將會詳細說明在 Rust 中實現物件導向的方法。

繼續閱讀

分享到 評論

給 C++ 使用者的 Rust 簡介:智慧指標

在絕大多數的程式語言中,在 heap 上配置記憶體都是一項不可或缺的功能。由於存在 stack 上的物件有固定的生命週期,若要建立出像是二元樹 (binary tree) 或連結串列 (linked list) 之類的資料結構,就勢必要把物件配置在 heap 上。

在 Rust 中當然也可以在 heap 上配置物件,但為了正確管理記憶體資源,Rust 不允許你直接取得物件在 heap 上的裸指標 (raw pointer)。相反地,只要直接產生智慧指標 (smart pointer),Rust 就會在 heap 上配置適當的空間、初始化物件、並且把記憶體位址包裝在智慧指標內。

在這篇文章中,我將會介紹在 Rust 中不同的智慧指標,以及它們使用上與 C++ 的相同與相異之處。

繼續閱讀

分享到 評論

在 Windows 上使用 Git 與 YubiKey

大家總是會有在 Windows 上開發程式的需求,因此在 Windows 上使用 Git 也是常有的事。不過許多在 Linux 上理所當然存在的事物不能直接搬到 Windows,比如說支援 PKCS#11 與智慧卡驗證功能的 SSH client。因此如果你在 YubiKey 上儲存了私鑰,然後想拿它來存取遠端的 SSH Git server,就會遇上一些麻煩。

這邊趁著還有記憶的時候寫一下在 Windows 上的操作步驟。如果你不知道 YubiKey 是什麼,可以參考我之前寫的這篇文章

繼續閱讀

分享到 評論

給 C++ 使用者的 Rust 簡介:字串與陣列

在前面幾篇與 Rust 相關的文章中,我一直還沒提到的程式語言基本功能,就是字串與陣列了。若少了這兩項功能,很難做出什麼具備複雜功能的軟體。另一方面,為了達到記憶體安全,Rust 對參考型別設下了重重限制,讓你很難在物件中直接儲存指向另一個物件的參考。對此,Rust 也提供了智慧指標 (smart pointers),讓你可以方便地建立資料結構。

幸運的是,在字串、陣列與智慧指標的設計上,Rust 與 C++ 可說是驚人地相似。這篇文章將會從 C++ 的角度,帶你快速了解 Rust 所提供的功能。

繼續閱讀

分享到 評論

給 C++ 使用者的 Rust 簡介:參考型別與 Borrow Checker (2)

在上一篇文章中,我們看到了在 Rust 中使用參考的方法,以及 mutable / immutable borrow 的規則。在這篇文章中,我會說明 Rust 如何避免懸置參考造成的記憶體存取錯誤。

1
2
3
4
5
6
7
8
9
10
11
fn foo() -> &mut i32
{
let mut data = 10;
return &mut data;
}
fn main()
{
let ptr = foo();
*ptr = 20; // 應視為嚴重錯誤
}

在詳細說明這套規則之前,我想要先提出幾個案例進行思考:有些是我們想允許的功能,有些是我們想禁止的危險動作。在看過這些案例後,我們會比較容易理解為何 Rust 會設計出這套規則。

繼續閱讀

分享到 評論

給 C++ 使用者的 Rust 簡介:參考型別與 Borrow Checker (1)

大多數的程式語言,為了有效率地傳遞、修改物件內容,會提供指標或參考型別 (reference type)。若某個變數是參考型別,意味著它並不直接儲存物件的內容,而是儲存記憶體位址,該位址指向的記憶體區塊才是真正儲存物件內容的地方。

除了快速傳遞大型物件外,參考型別也在一些語言功能上扮演重要角色,比如說:

  • 表達像是 linked list 這樣的遞迴類別 (recursive data type)。
  • 在 OOP 中操作抽象物件時,由於具體型別未知,因此必需用「指向某抽象型別的參考」來進行操作。
  • 利用 copy on write 或是 flyweight 之類的共享資料節構減少記憶體浪費並提高執行效率。

作為追求執行效率的系統程式語言,Rust 也提供了參考型別,但是為了達成 memory safe 的目標,Rust 加上了一層嚴格的保護:borrow checker,讓它有著異常陡峭的學習曲線。本系列文章會試著從 borrow checker 的設計目標開始,解釋參考型別帶來的潛在危險,以及 borrow checker 如何幫我們檔下這些錯誤。

繼續閱讀

分享到 評論

給 C++ 使用者的 Rust 簡介

Rust 是最近受到廣泛注目的新語言。最早由 Mozilla 資助開發,後來因為 Dropbox 使用 Rust 改寫檔案系統服務[1]而聲明大噪。目前 Rust 是很活躍的開源專案,有超過一千名開發者共同開發,大約一至兩個月就會有一次 minor release。

設計程式語言最困難的地方在於選擇,沒有一個語言是上山下海無所不能的,而 Rust 也不例外。Rust 的目標是成為高效率、易於平行運算的系統程式語言,因此它選擇了以下的特性:

  • 靜態型別 (static-typed)
  • 區分 mutable 與 immutable,所有變數預設為 immutable,盡可能減少 mutable state
  • 使用 tagged union 與 pattern matching
  • 不使用動態垃圾回收 (garbage collection),而使用靜態的 RAII
  • 使用 Move semantics 避免複製物件
  • 使用 borrow checker 確保 memory safety 與 thread safety

因此,對於習慣主流程式語言的使用者來說,Rust 的學習曲線非常陡峭,光是要讓程式碼通過編譯就要花上不少時間。接下來這一系列的文章,是以 C++ 使用者為對象,介紹 Rust 的各種語言功能以及背後的設計目標,希望各位可以看得很愉快。

繼續閱讀

分享到 評論

使用 Yubikey 進行公鑰認證

Yubikey 4

最近入手了 Yubikey 4,這個東西除了具備 OTP 以及 U2F 二階段認證的功能外,還具備了 OpenPGP 智慧卡與 PIV 智慧卡的功能,可以儲存私鑰並用在任何需要 RSA 加解密的場合,比如說 SSH 登入或簽發憑證。以下將會介紹如何在 Linux 中使用 Yubikey 來登入系統。

繼續閱讀

分享到 評論

Weak Typing Explained

常常聽到有些人誤解了 weak typing 的意義,或是對 C 語言同時是 static typed 與 weak typed 感到疑惑,因此提出一些我自己的想法。

我們先從 type checker 說起吧。

繼續閱讀

分享到 評論

使用 FreeRADIUS 與 LDAP 架設 WPA Enterprise 無線網路

近來嘗試在公司架設 WPA-Enterprise 無線網路,並讓使用者利用 LDAP 帳號登入。由於過程高潮迭起,不做個筆記就太可惜了。

繼續閱讀

分享到 評論