天天看點

《C語言接口與實作:建立可重用軟體的技術》一導讀

《C語言接口與實作:建立可重用軟體的技術》一導讀

c語言接口與實作:建立可重用軟體的技術

如今的程式員忙于應付大量關于api(application programming interface)的資訊。但是,大多數程式員都會在其所寫的幾乎每一個應用程式中使用api并實作api的庫,隻有少數程式員會建立或釋出新的能廣泛應用的api。事實上,程式員似乎更喜歡使用自己搞的東西,而不願意查找能滿足他們要求的程式庫,這或許是因為寫特定應用程式的代碼要比設計可廣泛使用的api容易。

不好意思,我也未能免俗:lcc(我和chris fraser為ansi/iso c編寫的編譯器)就是從頭開始編寫的api。(在a retargetable c compiler: design and implementation一書中有關于lcc的介紹。)編譯器是這樣一類應用程式:可以使用标準接口,并且能夠建立在其他地方也可以使用的接口。這類程式還有記憶體管理、字元串和符号表以及連結清單操作等。但是lcc僅使用了很少的标準c庫函數的例程,并且它的代碼幾乎都無法直接應用到其他應用程式中。

本書提倡的是一種基于接口及其實作的設計方法,并且通過對24個接口及其實作的描述詳細示範了該方法。這些接口涉及很多計算機領域的知識,包括資料結構、算法、字元串處理和并發程式。這些實作并不是簡單的玩具,而是為在産品級代碼中使用而設計的。實作的代碼是可免費提供的。

c程式設計語言基本不支援基于接口的設計方法,而c++和modula-3這樣的面向對象的語言則鼓勵将接口與實作分離。基于接口的設計跟具體的語言無關,但是它要求程式員對像c一樣的語言有更強的駕馭能力和更高的警惕性,因為這類語言很容易破壞帶有隐含實作資訊的接口,反之亦然。

然而,一旦掌握了基于接口的設計方法,就能夠在服務于衆多應用程式的通用接口基礎上建立應用程式,進而加快開發速度。在一些c++環境中的基礎類庫就展現了這種效果。增加對現有軟體(接口實作庫)的重用,能夠降低初始開發成本,同時還能降低維護成本,因為應用程式的更多部分都建立在通用接口的實作之上,而這些實作無不經過了良好的測試。

本書中的24個接口引自幾本參考書,并且針對本書特别做了修正。一些資料結構(抽象資料類型)中的接口源于lcc代碼和20世紀70年代末到80年代初所做的icon程式設計語言的實作代碼(參見r. e. griswold和m. t. griswold所著的the icon programming language)。其他的接口來自另外一些程式員的著作,我們将會在每一章的“擴充閱讀”部分給出詳細資訊。

書中提供的一些接口是針對資料結構的,但本書不是介紹資料結構的,本書的側重點在算法工程(包裝資料結構以供應用程式使用),而不在資料結構算法本身。然而,接口設計的好壞總是取決于資料結構和算法是否合适,是以,本書可算是傳統資料結構和算法教材(如robert sedgewick所著的algorithms in c)的有益補充。

大多數章節會隻介紹一個接口及其實作,少數章節還會描述與其相關的接口。每一章的“接口”部分将會單獨給出一個明确而詳細的接口描述。對于興趣僅在于接口的程式員來說,這些内容就相當于一本參考手冊。少數章節還會包含“例子”部分,會說明在一個簡單的應用程式中接口的用法。

每章的“實作”部分将會詳細地介紹本章接口的實作代碼。有些例子會給出一個接口的多種實作方法,以展示基于接口設計的優點。這些内容對于修改或擴充一個接口或是設計一個相關的接口将大有裨益。許多練習題會進一步探究一些其他可行的設計與實作的方法。如果僅是為了了解如何使用接口,可以不用閱讀“實作”一節。

接口、示例和實作都以文學(literate)程式的方式給出,換句話說,源代碼及其解釋是按照最适合了解代碼的順序交織出現的。代碼可以自動地從本書的文本檔案中抽取,并按c語言所規定的順序組合起來。其他也用文學程式講解c語言的圖書有a retargetable c compiler和d. e. knuth寫的the stanford graphbase: a platform for combinatorial computing。

<a href="https://yq.aliyun.com/articles/91533">第1章 引言</a>

<a href="https://yq.aliyun.com/articles/91533">1.1 文學程式</a>

<a href="https://yq.aliyun.com/articles/91538">1.2 程式設計風格</a>

<a href="https://yq.aliyun.com/articles/91542">1.3 效率</a>

<a href="https://yq.aliyun.com/articles/91548">1.4 擴充閱讀</a>

<a href="https://yq.aliyun.com/articles/91553">1.5 習題</a>

<a href="https://yq.aliyun.com/articles/91555">第2章 接口與實作</a>

<a href="https://yq.aliyun.com/articles/91555">2.1 接口</a>

<a href="https://yq.aliyun.com/articles/91559">2.2 實作</a>

<a href="https://yq.aliyun.com/articles/91564">2.3 抽象資料類型</a>

<a href="https://yq.aliyun.com/articles/91568">2.4 客戶程式的職責</a>

<a href="https://yq.aliyun.com/articles/91572">2.5 效率</a>

<a href="https://yq.aliyun.com/articles/91575">2.6 擴充閱讀</a>

<a href="https://yq.aliyun.com/articles/91578">2.7 習題</a>

第3章 原子

第4章 異常與斷言

第5章 記憶體管理

第6章 再談記憶體管理

第7章 連結清單

第8章 表

第9章 集合

第10章 動态數組

第11章 序列

第12章 環

第13章 位向量

第14章 格式化

第15章 低級字元串

第16章 進階字元串

第17章 擴充精度算術

第18章 任意精度算術

第19章 多精度算術

第20章 線程

附錄a 接口摘要

參考書目

歡迎來到異步社群!

繼續閱讀