這是一部注重編碼能力訓(xùn)練的實(shí)戰(zhàn)性著作,既能幫助讀者扎實(shí)掌握Rust的主要語(yǔ)法知識(shí)并具備實(shí)戰(zhàn)能力,又能指導(dǎo)讀者快速?gòu)某鯇W(xué)者晉級(jí)為高手。
全書(shū)秉持學(xué)以致用的原則:一方面,沒(méi)有事無(wú)巨細(xì)地羅列Rust的每一個(gè)語(yǔ)法知識(shí)點(diǎn),但是常用知識(shí)點(diǎn)和重要知識(shí)點(diǎn)悉數(shù)囊括;一方面,將各種常見(jiàn)數(shù)據(jù)結(jié)構(gòu)和算法與Rust編程實(shí)戰(zhàn)相結(jié)合,同時(shí)精選39道LeetCode高頻算法面試題,幫助讀者快速語(yǔ)法知識(shí)固化為實(shí)戰(zhàn)能力。
全書(shū)共15章,分為3個(gè)部分:
第1部分(第1~11章) Rust編程必備語(yǔ)法
非常有針對(duì)性地講解了Rust的常用語(yǔ)法,由淺入深,循序漸進(jìn),能幫助讀者快速掌握Rust的必備語(yǔ)法知識(shí)并具備基本的編程能力
第二部分(第12~13章) Rust編碼能力訓(xùn)練
將數(shù)組、棧、隊(duì)列、哈希表、鏈表、樹(shù)等實(shí)用的數(shù)據(jù)結(jié)構(gòu)和遞歸、分治、回溯、二分查找、深度優(yōu)先搜索、廣度優(yōu)先搜索、排序、動(dòng)態(tài)規(guī)劃等常用算法與Rust編程實(shí)戰(zhàn)結(jié)合,并精選39道LeetCode高頻算法面試真題,幫助讀者將語(yǔ)法知識(shí)轉(zhuǎn)化為編程實(shí)戰(zhàn)能力。
第三部分(第14~15章) Rust綜合進(jìn)階實(shí)戰(zhàn)
以排序算法為主題,圍繞功能拓展和性能拓展兩條主線,結(jié)合工程管理、泛型、trait系統(tǒng)、高階函數(shù)、閉包、迭代器、單元測(cè)試、多線程并發(fā)和異步并發(fā)等重要的語(yǔ)法知識(shí)點(diǎn)進(jìn)行綜合實(shí)戰(zhàn)訓(xùn)練,進(jìn)一步在實(shí)戰(zhàn)中提升編程水平。
適讀人群 :本書(shū)內(nèi)容的安排由淺入深,即使沒(méi)有任何 Rust 編程經(jīng)驗(yàn)的開(kāi)發(fā)者也可以學(xué)習(xí)參考。本書(shū)適用于以下幾類(lèi)讀者:?有高級(jí)語(yǔ)言(如 Java、Python、Go、C++ 等)編程經(jīng)驗(yàn)的開(kāi)發(fā)者;?計(jì) (1)作者資深:10余年開(kāi)發(fā)經(jīng)驗(yàn),Rust技術(shù)專(zhuān)家、區(qū)塊鏈技術(shù)專(zhuān)家,Web3meta Labs創(chuàng)始人兼CTO、Polkadot(波卡)技術(shù)大使。
(2)針對(duì)性強(qiáng):針對(duì)性講解Rust常用語(yǔ)法和重點(diǎn)知識(shí),助讀者快速掌握Rust編程必備能力。
(3)深入淺出:大幅降低Rust學(xué)習(xí)門(mén)檻,即使沒(méi)有任何 Rust 編程經(jīng)驗(yàn)的讀者也能快速上手。
(4)學(xué)以致用:將各種常見(jiàn)數(shù)據(jù)結(jié)構(gòu)和算法與Rust編程實(shí)戰(zhàn)相結(jié)合,幫助讀者將語(yǔ)法知識(shí)固化為實(shí)戰(zhàn)能力。
(5)注重實(shí)戰(zhàn):以編碼能力訓(xùn)練為核心,圍繞并發(fā)編程等高階知識(shí)進(jìn)行綜合訓(xùn)練,幫助讀者快速在實(shí)戰(zhàn)中實(shí)現(xiàn)提升。
【為什么要寫(xiě)這本書(shū)】
雖然對(duì)Rust語(yǔ)言早有耳聞,但真正接觸Rust還緣于筆者在“一塊+”區(qū)塊鏈技術(shù)社區(qū)參加的陳錫亮老師主講的“Substrate快速入門(mén)與開(kāi)發(fā)實(shí)戰(zhàn)”課程。Substrate是一個(gè)開(kāi)源的區(qū)塊鏈開(kāi)發(fā)框架,由Parity團(tuán)隊(duì)使用Rust語(yǔ)言編寫(xiě)。想學(xué)好Substrate,毋庸置疑得先學(xué)好Rust。因此筆者深入研讀了最權(quán)威的官方教程The Rust Programming Language、以代碼展示方式講解語(yǔ)法的Rust by Example以及深入底層系統(tǒng)介紹Rust設(shè)計(jì)哲學(xué)的《Rust編程之道》等著作。雖有10年以上編程經(jīng)驗(yàn),熟悉Java、Python、Go等語(yǔ)言,但在學(xué)習(xí)Rust編程的過(guò)程中,筆者依然有嚴(yán)重的挫折感。挫折感的來(lái)源有以下三點(diǎn)。
一是初學(xué)者對(duì)Rust語(yǔ)言中一些特有的語(yǔ)法和符號(hào)需要一個(gè)適應(yīng)過(guò)程。
二是Rust編譯器內(nèi)建各種安全檢查規(guī)則,加上獨(dú)有的所有權(quán)系統(tǒng),在編寫(xiě)稍微復(fù)雜的程序時(shí),幾乎難以做到一次編譯就成功通過(guò),需要經(jīng)歷反復(fù)的修改與編譯調(diào)試。
三是Rust編程中關(guān)于引用、智能指針的使用,以及在編寫(xiě)Unsafe Rust過(guò)程中如何保證內(nèi)存安全很復(fù)雜,對(duì)Java、Python、Go等語(yǔ)言的開(kāi)發(fā)者也是較大的挑戰(zhàn)。
另外,縱觀市面上Rust圖書(shū)的共同點(diǎn),大多側(cè)重于對(duì)Rust設(shè)計(jì)思想的介紹、對(duì)語(yǔ)法使用以及實(shí)現(xiàn)原理的詳細(xì)講解,缺乏有效的編程實(shí)戰(zhàn)教程。
因此,經(jīng)過(guò)一段時(shí)間的深入思考,筆者決定撰寫(xiě)本書(shū),并嘗試將不限語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)和算法與Rust編程實(shí)戰(zhàn)進(jìn)行結(jié)合,讓讀者可以憑借以往的編程基礎(chǔ)使用Rust語(yǔ)言進(jìn)行實(shí)戰(zhàn),在實(shí)戰(zhàn)中鞏固各知識(shí)點(diǎn),提升Rust編程能力。學(xué)以致用是貫穿本書(shū)的理念。
【讀者對(duì)象】
本書(shū)內(nèi)容由淺入深,即使沒(méi)有任何Rust編程經(jīng)驗(yàn)的開(kāi)發(fā)者也可以學(xué)習(xí)參考。本書(shū)適用于以下幾類(lèi)讀者。
●有高級(jí)語(yǔ)言(如Java、Python、Go、C++等)編程經(jīng)驗(yàn)的開(kāi)發(fā)者;
●正在從事軟件開(kāi)發(fā)工作的開(kāi)發(fā)者;
●計(jì)算機(jī)軟件及相關(guān)專(zhuān)業(yè)的學(xué)生;
●其他有一定數(shù)據(jù)結(jié)構(gòu)和算法經(jīng)驗(yàn)且對(duì)Rust感興趣的讀者。
【本書(shū)特色】
以往常聽(tīng)一些朋友抱怨,且筆者在學(xué)習(xí)過(guò)程中也有類(lèi)似感受:“學(xué)習(xí)一門(mén)新的語(yǔ)言,對(duì)入門(mén)書(shū)籍閱讀過(guò)半,還只會(huì)寫(xiě)Hello World程序,繼續(xù)學(xué)習(xí)后面的章節(jié)卻已忘記了前面的內(nèi)容!敝猿霈F(xiàn)這種情況,主要是因?yàn)槌鯇W(xué)者很容易糾纏于語(yǔ)法細(xì)節(jié)的學(xué)習(xí),鉆一些深?yuàn)W復(fù)雜卻不常用的語(yǔ)法的“牛角尖”,導(dǎo)致“從入門(mén)到放棄”的情況時(shí)有發(fā)生。特別是Rust編程的初學(xué)者,如果一開(kāi)始就囿于Rust語(yǔ)法細(xì)節(jié),很容易因受挫而放棄。
筆者較為推崇的學(xué)習(xí)方式是,掌握一門(mén)語(yǔ)言最基礎(chǔ)的語(yǔ)法知識(shí)后就進(jìn)行編程實(shí)戰(zhàn)訓(xùn)練,實(shí)踐中遇到了問(wèn)題再去探究深層原理和細(xì)節(jié)。這樣比一開(kāi)始就進(jìn)行“面面俱到、點(diǎn)點(diǎn)探究”的學(xué)習(xí)會(huì)更有收獲,理解也更為透徹。因此,本書(shū)將秉持學(xué)以致用的原則進(jìn)行講解,不事無(wú)巨細(xì)地羅列一個(gè)個(gè)知識(shí)點(diǎn),也不立刻探究背后的原理和細(xì)節(jié),而是幫助讀者以最快的速度掌握Rust編程所需的基本概念和基礎(chǔ)語(yǔ)法,快速進(jìn)入編程實(shí)戰(zhàn)訓(xùn)練,以刻意練習(xí)的方式讓讀者掌握每個(gè)知識(shí)點(diǎn)。這里的刻意練習(xí)包含以下三個(gè)方面的要求。
一是在“學(xué)習(xí)區(qū)”學(xué)習(xí)。跳出學(xué)習(xí)的“舒適區(qū)”,選擇有難度、有挑戰(zhàn)的知識(shí)學(xué)習(xí)。數(shù)據(jù)結(jié)構(gòu)和算法的優(yōu)劣取決于開(kāi)發(fā)者的技術(shù)功底,而開(kāi)發(fā)者對(duì)數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)的掌握程序決定了他們?cè)诿鎸?duì)新問(wèn)題時(shí)分析問(wèn)題和解決問(wèn)題的能力。因此,結(jié)合數(shù)據(jù)結(jié)構(gòu)與算法的知識(shí)點(diǎn)進(jìn)行編程訓(xùn)練,能使讀者快速建立對(duì)Rust編程的認(rèn)知,是挖掘自身成長(zhǎng)潛能的重要手段和開(kāi)發(fā)高性能程序的必備基礎(chǔ)。
二是大量重復(fù)練習(xí)。只有不斷地重復(fù)練習(xí),才能真正掌握知識(shí)點(diǎn)。本書(shū)精選LeetCode平臺(tái)上與Rust語(yǔ)法知識(shí)點(diǎn)相關(guān)的一些高頻算法面試真題,在細(xì)致講解與代碼實(shí)現(xiàn)中,把重要的語(yǔ)法知識(shí)點(diǎn)通過(guò)題目復(fù)現(xiàn),幫助讀者在重復(fù)練習(xí)中真正做到各個(gè)知識(shí)點(diǎn)的熟練掌握與融會(huì)貫通;同時(shí),還會(huì)把初學(xué)者在練習(xí)中遇到的常見(jiàn)問(wèn)題以及解決問(wèn)題的過(guò)程展現(xiàn)出來(lái),使讀者在逐步解決問(wèn)題中鞏固知識(shí)點(diǎn)。
三是及時(shí)測(cè)評(píng)反饋。沒(méi)有及時(shí)反饋的練習(xí)往往是無(wú)效的。本書(shū)將協(xié)助讀者在LeetCode平臺(tái)上進(jìn)行練習(xí)并及時(shí)獲得測(cè)評(píng)反饋,增加讀者的學(xué)習(xí)興趣。
【如何閱讀本書(shū)】
本書(shū)分為三篇,具體內(nèi)容如下。
●語(yǔ)言基礎(chǔ)篇(第1~11章):介紹Rust編程中必須掌握的基礎(chǔ)語(yǔ)法。
●編程能力訓(xùn)練篇(第12~13章):將數(shù)組、棧、隊(duì)列、哈希表、鏈表、樹(shù)等實(shí)用的數(shù)據(jù)結(jié)構(gòu)和遞歸、分治、回溯、二分查找、排序、動(dòng)態(tài)規(guī)劃等常用算法與Rust編程實(shí)戰(zhàn)結(jié)合進(jìn)行講解,并精選了LeetCode上的一些高頻算法面試真題,使用Rust語(yǔ)言進(jìn)行編程實(shí)戰(zhàn)。
●綜合實(shí)戰(zhàn)篇(第14~15章):以排序算法為主題,圍繞功能拓展和性能拓展兩條主線,結(jié)合工程管理、泛型、trait系統(tǒng)、高階函數(shù)、閉包、迭代器、單元測(cè)試、多線程并發(fā)和異步并發(fā)等重要的語(yǔ)法知識(shí)點(diǎn)進(jìn)行綜合實(shí)戰(zhàn)訓(xùn)練。
如果你具備Rust基礎(chǔ)語(yǔ)法知識(shí),可以直接從第2章或編程能力訓(xùn)練篇開(kāi)始閱讀。但如果你是一名初學(xué)者,建議按照本書(shū)的編排順序從第1章開(kāi)始學(xué)習(xí)。
●筆者運(yùn)營(yíng)公眾號(hào)“沖鴨Rust和區(qū)塊鏈”,分享Rust、算法和區(qū)塊鏈開(kāi)發(fā)的原創(chuàng)技術(shù)?紤]到本書(shū)定位于快速入門(mén)實(shí)戰(zhàn),沒(méi)有涉及Rust宏和Unsafe編程,筆者后續(xù)計(jì)劃從Substrate和libp2p源碼解析的角度寫(xiě)一些進(jìn)階版實(shí)戰(zhàn)系列來(lái)講解這些知識(shí)點(diǎn),并會(huì)分享在公眾號(hào)上供大家參考。
●隨書(shū)源碼地址:https://github.com/inrust/Rust-Programming-in-Action。
朱春雷,北京大學(xué)軟件工程碩士,資深Rust技術(shù)專(zhuān)家和區(qū)塊鏈技術(shù)專(zhuān)家,有10年以上軟件開(kāi)發(fā)經(jīng)驗(yàn)。 Web3meta Labs創(chuàng)始人兼首席技術(shù)官,Polkadot(波卡)技術(shù)大使,熟悉區(qū)塊鏈技術(shù)框架Substrate開(kāi)發(fā)。Web3meta Labs致力于為Ethereum、Polkadot等領(lǐng)先的區(qū)塊鏈項(xiàng)目打造基礎(chǔ)設(shè)施。
【語(yǔ)言基礎(chǔ)篇】
●第1章 初識(shí)Rust2
1.1 Rust語(yǔ)言簡(jiǎn)介2
1.2 搭建編程環(huán)境3
1.3 Hello Rust4
1.4 Hello Cargo5
1.5 本章小結(jié)7
●第2章 變量與數(shù)據(jù)類(lèi)型8
2.1 變量和可變性8
2.1.1 變量聲明8
2.1.2 變量的可變性9
2.1.3 變量遮蔽9
2.1.4 常量10
2.2 基本數(shù)據(jù)類(lèi)型11
2.2.1 整數(shù)類(lèi)型11
2.2.2 浮點(diǎn)數(shù)類(lèi)型12
2.2.3 布爾類(lèi)型12
2.2.4 字符類(lèi)型12
2.2.5 范圍類(lèi)型12
2.3 復(fù)合數(shù)據(jù)類(lèi)型13
2.3.1 元組類(lèi)型13
2.3.2 數(shù)組類(lèi)型14
2.3.3 結(jié)構(gòu)體類(lèi)型15
2.3.4 枚舉類(lèi)型17
2.4 容器類(lèi)型18
2.4.1 Vec18
2.4.2 VecDeque21
2.4.3 HashMap25
2.5 字符串28
2.5.1 字符串的創(chuàng)建29
2.5.2 字符串的修改29
2.5.3 字符串的訪問(wèn)32
2.6 字面量和運(yùn)算符34
2.6.1 字面量34
2.6.2 運(yùn)算符34
2.7 本章小結(jié)35
●第3章 流程控制37
3.1 條件判斷37
3.1.1 if條件判斷37
3.1.2 if-else條件判斷38
3.1.3 if-else if-else條件判斷38
3.2 循環(huán)39
3.2.1 loop循環(huán)39
3.2.2 while循環(huán)40
3.2.3 for循環(huán)40
3.2.4 continue和break語(yǔ)句41
3.3 match模式匹配41
3.4 if let和while let模式匹配42
3.5 本章小結(jié)43
●第4章 函數(shù)、閉包與迭代器44
4.1 函數(shù)44
4.1.1 定義函數(shù)44
4.1.2 方法和函數(shù)46
4.1.3 高階函數(shù)47
4.2 閉包50
4.2.1 基本語(yǔ)法50
4.2.2 類(lèi)型推斷50
4.2.3 捕獲環(huán)境變量51
4.3 迭代器51
4.3.1 Iterator trait52
4.3.2 消費(fèi)器52
4.3.3 迭代器適配器54
4.4 本章小結(jié)56
●第5章 類(lèi)型系統(tǒng)57
5.1 泛型57
5.1.1 泛型與容器57
5.1.2 泛型與結(jié)構(gòu)體58
5.1.3 泛型與枚舉60
5.1.4 泛型與函數(shù)61
5.1.5 泛型與方法61
5.2 trait系統(tǒng)62
5.2.1 trait定義與實(shí)現(xiàn)62
5.2.2 trait作為參數(shù)63
5.2.3 返回實(shí)現(xiàn)trait的類(lèi)型66
5.2.4 標(biāo)準(zhǔn)庫(kù)常用trait66
5.3 類(lèi)型轉(zhuǎn)換71
5.3.1 原生類(lèi)型間的轉(zhuǎn)換71
5.3.2 數(shù)字與String類(lèi)型間的轉(zhuǎn)換72
5.3.3 &str與String類(lèi)型間的轉(zhuǎn)換73
5.4 本章小結(jié)73
●第6章 所有權(quán)系統(tǒng)74
6.1 通用概念74
6.1.1 棧內(nèi)存與堆內(nèi)存74
6.1.2 值語(yǔ)義與引用語(yǔ)義75
6.1.3 復(fù)制語(yǔ)義與移動(dòng)語(yǔ)義75
6.2 所有權(quán)機(jī)制76
6.2.1 變量綁定76
6.2.2 所有權(quán)轉(zhuǎn)移77
6.2.3 淺復(fù)制與深復(fù)制81
6.3 引用和借用83
6.3.1 引用與可變引用83
6.3.2 借用規(guī)則87
6.3.3 借用示例1:切片88
6.3.4 借用示例2:迭代器90
6.4 生命周期92
6.4.1 生命周期語(yǔ)法92
6.4.2 懸垂引用94
6.4.3 生命周期與函數(shù)96
6.4.4 生命周期與結(jié)構(gòu)體98
6.4.5 生命周期省略規(guī)則100
6.5 本章小結(jié)100
●第7章 智能指針102
7.1 獨(dú)占所有權(quán)的Box102
7.1.1 Box在堆上存儲(chǔ)數(shù)據(jù)102
7.1.2 Deref解引用103
7.1.3 Drop清理資源104
7.2 共享所有權(quán)的Rc105
7.3 應(yīng)對(duì)內(nèi)部可變性的RefCell106
7.4 本章小結(jié)108
●第8章 并發(fā)編程109
8.1 多線程并發(fā)109
8.1.1 線程管理110
8.1.2 線程池114
8.2 異步并發(fā)115
8.2.1 async/.await語(yǔ)法115
8.2.2 async-std庫(kù)117
8.3 本章小結(jié)119
●第9章 錯(cuò)誤處理120
9.1 Result120
9.1.1 高效處理Result121
9.1.2 處理不同類(lèi)型的錯(cuò)誤122
9.1.3 傳播錯(cuò)誤123
9.2 Panic125
9.2.1 追蹤Panic125
9.2.2 捕獲Panic126
9.3 本章小結(jié)127
●第10章 模塊化編程128
10.1 crate管理128
10.1.1 使用Cargo創(chuàng)建crate129
10.1.2 使用第三方crate129
10.2 module系統(tǒng)130
10.2.1 定義模塊130
10.2.2 創(chuàng)建多文件模塊131
10.2.3 多文件模塊的層級(jí)關(guān)系132
10.2.4 模塊的可見(jiàn)性133
10.2.5 使用use導(dǎo)入模塊135
10.2.6 模塊的路徑136
10.2.7 使用pub use重導(dǎo)出136
10.2.8 加載外部crate137
10.3 本章小結(jié)138
●第11章 單元測(cè)試139
11.1 單元測(cè)試框架139
11.2 編寫(xiě)測(cè)試140
11.2.1 使用assert!140
11.2.2 使用assert_eq!和assert_ne!141
11.2.3 自定義失敗信息142
11.3 運(yùn)行測(cè)試143
11.3.1 運(yùn)行部分測(cè)試144
11.3.2 忽略某些測(cè)試145
11.4 本章小結(jié)146
【編程能力訓(xùn)練篇】
●第12章 數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn)148
12.1 數(shù)組148
12.1.1 移動(dòng)零149
12.1.2 加一156
12.1.3 刪除排序數(shù)組中的重復(fù)項(xiàng)158
12.2 棧與隊(duì)列159
12.2.1 最小棧160
12.2.2 有效的括號(hào)163
12.2.3 滑動(dòng)窗口最大值165
12.3 哈希表168
12.3.1 兩數(shù)之和170
12.3.2 有效的字母異位詞172
12.3.3 字母異位詞分組174
12.4 鏈表179
12.4.1 反轉(zhuǎn)鏈表182
12.4.2 鏈表的中間節(jié)點(diǎn)183
12.4.3 合并兩個(gè)有序鏈表185
12.4.4 刪除鏈表的倒數(shù)第n個(gè)節(jié)點(diǎn)187
12.5 樹(shù)191
12.5.1 二叉樹(shù)的前序遍歷195
12.5.2 二叉樹(shù)的中序遍歷199
12.5.3 二叉樹(shù)的后序遍歷202
12.5.4 二叉樹(shù)的層次遍歷206
12.5.5 二叉搜索樹(shù)中的插入操作208
12.6 本章小結(jié)211
●第13章 算法實(shí)戰(zhàn)213
13.1 遞歸、分治與回溯213
13.1.1 pow(x, n)216
13.1.2 爬樓梯218
13.1.3 括號(hào)生成220
13.1.4 子集222
13.1.5 組合224
13.1.6 N皇后227
13.2 二分查找230
13.2.1 搜索旋轉(zhuǎn)排序數(shù)組231
13.2.2 尋找旋轉(zhuǎn)排序數(shù)組中的最小值232
13.2.3 有效的完全平方數(shù)235
13.3 深度與廣度優(yōu)先搜索236
13.3.1 二叉樹(shù)的最大深度239
13.3.2 二叉樹(shù)的最小深度242
13.3.3 二叉搜索樹(shù)中的搜索244
13.4 排序算法246
13.4.1 數(shù)組中的第k個(gè)最大元素257
13.4.2 合并區(qū)間259
13.4.3 翻轉(zhuǎn)對(duì)261
13.5 動(dòng)態(tài)規(guī)劃264
13.5.1 爬樓梯265
13.5.2 最小路徑和267
13.5.3 三角形最小路徑和269
13.5.4 零錢(qián)兌換270
13.5.5 最長(zhǎng)上升子序列273
13.5.6 編輯距離274
13.6 本章小結(jié)277
【綜合實(shí)戰(zhàn)篇】
●第14章 泛型與高階函數(shù)實(shí)戰(zhàn)280
14.1 工程管理280
14.2 泛型編程281
14.2.1 插入排序算法282
14.2.2 加載算法庫(kù)284
14.2.3 結(jié)構(gòu)體實(shí)例排序285
14.3 高階函數(shù)編程287
14.3.1 排序算法庫(kù)287
14.3.2 生成隨機(jī)數(shù)據(jù)291
14.3.3 排序算法API庫(kù)292
14.4 本章小結(jié)295
●第15章 并發(fā)編程實(shí)戰(zhàn)296
15.1 多線程并發(fā)296
15.2 異步并發(fā)298
15.2.1 排序算法庫(kù)的異步實(shí)現(xiàn)298
15.2.2 排序算法API庫(kù)的異步實(shí)現(xiàn)302
15.2.3 創(chuàng)建可執(zhí)行程序303
15.3 本章小結(jié)305