《Rust編程之道》學習筆記一

来源:https://www.cnblogs.com/QiaoPengjun/archive/2023/08/12/17625003.html
-Advertisement-
Play Games

# 《Rust編程之道》學習筆記一 ## 序 ### Rust語言的主要特點 - 系統級語言 - 無GC - 基於LLVM - 記憶體安全 - 強類型+靜態類型 - 混合編程範式 - 零成本抽象 - 線程安全 ### 程式員的快樂 何謂快樂?真正的快樂不僅僅是寫代碼時的“酸爽”,更應該是代碼部署到生產 ...


《Rust編程之道》學習筆記一

Rust語言的主要特點

  • 系統級語言
  • 無GC
  • 基於LLVM
  • 記憶體安全
  • 強類型+靜態類型
  • 混合編程範式
  • 零成本抽象
  • 線程安全

程式員的快樂

何謂快樂?真正的快樂不僅僅是寫代碼時的“酸爽”,更應該是代碼部署到生產環境之後的“安穩”。

程式的三大定律

  • 程式必須正確
  • 程式必須可維護,但不能違反第一條定律
  • 程式必須高效,但不能違反前兩條定律

程式的正確性

  • 程式滿足了實際的問題需求
  • 滿足了自身的程式規約

如何保證程式的正確性

  • 通過對程式的各種測試、斷言和錯誤處理機制,來保證其滿足實際的問題需求。
  • 通過較為成熟的類型理論,來保證程式自身的規約正確。

Rust語言對程式的三定律支持的恰到好處。

目前Rust被陸續應用在區塊鏈、游戲、WebAssembly 技術、機器學習,分散式資料庫、網路服務基礎設施、Web框架、操作系統和嵌入式等領域。

前言

Rust 學習曲線陡的根本原因在於 Rust 語言融合了多種語言特性和多種編程範式。

從Rust 的設計哲學出發,牢牢把握它的設計一致性,就可以把它的所有特性都串起來,從而達到掌握它的目的。

《Rust 編程之道》特點

  • 從設計哲學出發,探索 Rust 語言的內在一致性。
    • 設計哲學是一門優秀編程語言報錯語言一致性的關鍵所在。
    • 設計哲學是語言特性和語法要素設計的誘因和準則。
  • 從源碼分析入手,探索 Rust 地道的編程風格。
  • 從工程角度著手,探索 Rust 對健壯性的支持。
  • 從底層原理開始,探索 Rust 記憶體安全的本質。

章節概述

第一章 新時代的語言

第二章 語言精要

第三章 類型系統

第四章 記憶體管理

第五章 所有權系統

第六章 函數、閉包和迭代器

第七章 結構化編程

第八章 字元串與集合類型

第九章 構建健壯的程式

第十章 模塊化編程

第十一章 安全併發

第十二章 元編程

第十三章 超越安全的邊界

第 1 章 新時代的語言

不謀全局者,不足謀一域。

一門好的語言是有內涵哲學的語言,它表裡如一,有所想,有所為。

兩個難題

  • 很難編寫記憶體安全的代碼。
  • 很難編寫線程安全的代碼。

Ada 語言

2006 年,自稱 “職業編程語言工程師” 的 Graydon Hoare(簡稱為 GH),開始開發一門名為 Rust 的編程語言。

什麼是 “職業編程語言工程師”?用 GH 自己的話說,職業編程語言工程師的日常工作就是給其他語言開發編譯器和工具集,但並未參與這些語言本身的設計。

GH 對 Rust 語言的期望

  • 必須是更加安全、不易崩潰的,尤其在操作記憶體時,這一點更為重要。
  • 不需要有垃圾回收這樣的系統,不能為了記憶體安全而引入性能負擔。
  • 不是一門僅僅擁有一個主要特性的語言,而應該擁有一系列的廣泛特性,這些特性之間又不乏一致性。這些特性可以很好地相互協作,從而使該語言更容易編寫、維護和調試,讓程式員寫出更安全、更高效的代碼。

Rust 是一門同時追求安全、併發和性能的現代系統級編程語言。

設計哲學

  • 記憶體安全
  • 零成本抽象
  • 實用性

有些事現在不做,一輩子都沒機會再做了。 -- 練習曲[2006]

“程式即類型證明”

類型系統的好處

  • 允許編譯器偵測無意義甚至無效的代碼,暴露程式中隱含的錯誤。
  • 可以為編譯器提供有意義的類型信息,幫助優化代碼。
  • 可以增強代碼的可讀性,更直白地闡述開發者的意圖。
  • 提供了一定程度的高級抽象,提升開發效率。

簡單來說,類型安全是指類型系統可以保證程式的行為是意義明確、不出錯的。

未定義行為(Undefined Behavior):發生了語言規範規定之外的行為。

Rust語言如果想保證記憶體安全,首先要做的就是保證類型安全。

類型安全的語言:OCaml、Haskell

類型系統的作用是定義編程語言中值和表達式的類型,將它們歸類,賦予它們不同的行為,指導它們如何相互作用。

記憶體安全

什麼是記憶體安全?簡單來說,就是不會出現記憶體訪問錯誤。

只有當程式訪問未定義記憶體的時候才會產生記憶體錯誤。

一般來說,發生以下幾種情況就會產生記憶體錯誤:

  • 引用空指針
  • 使用未初始化記憶體
  • 釋放後使用,也就是使用懸垂指針
  • 緩衝區溢出,比如數組越界
  • 非法釋放已經釋放過的指針或未分配的指針,也就是重覆釋放

Rust 語言安全記憶體管理模型

  • 所有權系統
    • 每個被分配的記憶體都有一個獨占其所有權的指針
    • 只有當該指針被銷毀時,其對應的記憶體才能隨之被釋放
    • RAII 機制
  • 借用和生命周期
    • 每個變數都有其生命周期,一旦超出生命周期,變數就會被自動釋放
    • 如果是借用,則可以通過標記生命周期參數供編譯器檢查的方式,防止出現懸垂指針,也就是釋放後使用的情況。

Rust 從 Haskell 的類型系統借鑒了以下特性:

  • 沒有空指針
  • 預設不可變
  • 表達式
  • 高階函數
  • 代數數據類型
  • 模式匹配
  • 泛型
  • Trait 和關聯類型
  • 本地類型推導

Rust 獨有的特性

  • 仿射類型(Affine Type),該類型用來表達 Rust所有權中的 Move 語義
  • 借用、生命周期

Rust 編譯器可以在編譯期對類型進行檢查,看其是否滿足安全記憶體模型,在編譯器就能發現記憶體不安全問題,有效地阻止未定義行為的發生。

Rust 編譯器會通過靜態檢查分析,在編譯器就檢查出多線程併發代碼中所有的數據競爭問題。

零成本抽象

Rust 的抽象並不會存在運行時性能開銷,這一切都是在編譯期完成的。

Rust 中零成本抽象的基石就是泛型和Trait。

實用性

如何評價一門編程語言的實用性?

  • 實踐性
  • 有益性
  • 穩定性

日常開發中一般有三類非正常情況:失敗、錯誤和異常。

Rust 語言針對這三類非正常情況分別提供了專門的處理方式,讓開發者可以分情況去選擇。

  • 對於失敗的情況,可以使用斷言工具。
  • 對於錯誤,Rust 提供了基於返回值的分層錯誤處理方式,比如 Option 可以用來處理可能存在空值的情況,而 Result 就專門用來處理可以被合理解決並需要傳播的錯誤。
  • 對於異常,Rust 將其看作無法被合理解決的問題,提供了線程恐慌機制,在發生異常的時候,線程可以安全地退出。

Safe Rust 表示開發者將信任編譯器能夠在編譯時保證安全,而 Unsafe Rust 表示讓編譯器信任開發者有能力保證安全。

Rust 代碼是以包(crate)為編譯和分發單位的

學習Rust

  • 保持初學者心態
  • 先學習概念再動手實踐
  • 把編譯器當作朋友

2015年,Rust發佈1.0版本

2018年,Rust團隊推出了新的大版本(edition)計劃

Rust 2015 版本

Rust 2018 版本

Rust 2021 版本

Rust的編譯器可以方便地管理版本的相容性

Rust 團隊維護三個發行分支:穩定版(Stable)、測試版(Beta)和開發版(Nightly)。

其中穩定版和測試版每6周發佈一次。

標記為不穩定(Unstable)和特性開關(Feature Gate)的語言特性或標準庫特性只能在開發版中使用。

Rust 編譯器是一個編譯前端,它的工作是對代碼進行詞法分析、語法分析、類型檢查、生成中間代碼、進行獨立於目標機器的優化等工作。

使用 LLVM 作為編譯器後端代碼生成框架,則可以利用 LLVM 相容多個目標機器的特性,實現跨平臺編譯和優化等工作。

在用戶使用Rust時,大多數時候無須考慮各個目標機器平臺的特有性質,基本上可以做到一次編寫,到處運行。

Rust 源碼經過分詞和解析,生成AST(抽象語法樹)。

然後把 AST 進一步簡化處理為 HIR(High-level IR),目的是讓編譯器更方便地做類型檢查。

HIR 會進一步被編譯為 MIR(Middle IR),這是一種中間表示。

最終,MIR 會被翻譯為 LLVM IR,然後被 LLVM 的處理編譯為能在各個平臺上運行的目標機器碼。

本文來自博客園,作者:尋月隱君,轉載請註明原文鏈接:https://www.cnblogs.com/QiaoPengjun/p/17625003.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著 Web 應用的複雜性不斷增加,性能優化成為了開發人員必須面對的挑戰之一。Vue 路由懶載入是一項關鍵技術,它可以幫助我們提高 Web 應用的載入速度,從而提升用戶體驗。 在本篇技術博文中,我們將深入探討 Vue 路由懶載入的背景、原理以及使用方法。我們還將分享一些優化和進階技巧,幫助開發人員... ...
  • 倉庫地址:https://gitee.com/JSTGitee/element-jst-admin 登錄 首頁 表格 前言 該方案作為一套多功能的後臺框架模板,適用於絕大部分的後臺管理系統開發。基於 Vue2,使用 vue-cli2 腳手架,引用 Element ui 組件庫,方便開發快速簡潔好看的 ...
  • 這是一個講解DDD落地的文章系列,作者是《實現領域驅動設計》的譯者滕雲。本文章系列以一個真實的並已成功上線的軟體項目——碼如雲(https://www.mryqr.com)為例,系統性地講解DDD在落地實施過程中的各種典型實踐,以及在面臨實際業務場景時的諸多取捨。 本系列包含以下文章: DDD入門( ...
  • ## 轉載放在最前 [一文帶你瞭解,虛擬記憶體、記憶體分頁、分段、段頁式記憶體管理](https://zhuanlan.zhihu.com/p/451736494)[[Golang三關-典藏版]一站式Golang記憶體洗髓經 | Go 技術論壇](https://learnku.com/articles/6 ...
  • 垃圾收集器 HotSpot虛擬機包含的所有收集器如圖3-5所示。圖3-5展示了7種作用於不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用。 新生代收集器:Serial、ParNew、Parallel Scavenge,新生代收集器均採用複製演算法 老年代收集器:Serial Old ...
  • 基本環境準備(第一節)2023年8月9日16:37 1.安裝Node.js;Windows 上安裝 Node.js你可以採用以下兩種方式來安裝。1、Windows 安裝包(.msi)本文實例以 v0.10.26 版本為例,其他版本類似, 安裝步驟: 步驟 1 : 雙擊下載後的安裝包 v0.10.26 ...
  • 在一個需要用到flag作為信號控制代碼中一些代碼片段是否運行的,比如"--flag True"或者"--flag False"。 但是古怪的是無法傳入False,無論傳入True還是False,程式裡面都是True的參數,所以這個flag並沒有生效,也就失去了意義。 參考代碼: ```python ...
  • 在本篇文章中,會先介紹 Python 中對象的基礎概念,之後會提到對象的深淺拷貝以及區別。在閱讀後,應該掌握如下的內容: - 理解變數、引用和對象的關係 - 理解 Python 對象中 identity,type 和 value 的概念 - 什麼是 mutable 和 immutable 對象?以及 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...