前言

系統程式在電子資訊產業界是如此的重要,但在學術界卻完全相反,系統程式要能讓大專學生能夠學以致用,還有很大一段距離,本書企圖彌補這段落差。

系統程式課程的教科書,大致上分為兩類,第一類是以系統軟體理論 (System Software) 為主的書籍,而第二類是以系統程式 (System Programming) 實務為主的書籍。

以系統軟體理論為主的書籍當中,最著名的書是Beck 的System Software: An Introduction to Systems Programming。這本書以 SIC/XE 這個假想的機器出發,很清楚的說明了系統軟體的概念,並且理論陳述上掌握得相當好,既簡單又清楚。然而、該書已有 20 年多年的歷史,且以 Pascal 與 SIC/XE 的組合語言為範例,忽略了現今以 C 語言為核心的產業現況,導致該書完全與實務脫節,讓學生無法理解真實世界的狀況。

在以實務為主的系統程式書籍中,通常分為很多子類。像是 『Linux 系統程式設計』或『Windows 系統程式設計』之類的書,會將焦點鎖定在單一作業系統上。這種書籍在實務上很有用,但是卻很容易過時,因為作業系統隨時都在變化中。況且,這類書籍的焦點是作業系統,所以通常不會納入組譯器、連結器、載入器、巨集處理器、編譯器等主題,因此不適合作為系統程式課程的教科書。

找不到適當的教科書,是系統程式課程傳授者的困擾之一,另一個困擾是到底要教授甚麼主題,也還處於眾說紛紜的狀況。有些學校將『系統程式與組合語言』合併成一門課程,有些則分開。

然而,組合語言雖是系統程式的主題之一,但卻只是其中的一小部分,無法涵蓋系統程式的一些重要部分,像是編譯器、組譯器、連結器等等。另外,C 語言在系統程式中的重要性,並不亞於組合語言,甚至有過之而無不及,這些都不是組合語言課程所能涵蓋的。

因此,本書捨棄此種作法,直接將『系統軟體』與『系統程式』兩者都納入『廣義的系統程式』範圍當中,以便較完整的涵蓋『系統軟體』與『系統程式設計』這兩個密切相關的領域,避免遺漏重要的主題。

我們期望藉由同時納入『系統軟體』與『系統程式設計』等兩個密切相關的主題,達到相輔相成的目的,因為我們相信,學習系統程式,除了可以幫助學習者理解電腦運作的原理之外,還能在實務上培養出優秀的系統程式設計師。我們認為,這兩個定義都是系統程式課程的重點,不可偏廢。

在本書中,我們假定讀者已經學過至少一門的程式設計課程。如果讀者學習過 C 語言,那對於閱讀本書將會有很大的幫助。因為,當今世界上的大部分系統程式,都是用 C 語言開發出來的。

然而,本書的篇幅絕對無法涵蓋系統軟體與系統程式的所有面向,因此,我們將捨棄某些可能被納入系統程式的主題,像是資料庫系統、軟體工程等,以便使本書能聚焦在典型的系統軟體與系統程式兩個領域,才有可能進行較深入的闡述。

筆者認為,系統軟體與系統程式兩者,對資訊工程系以及電子科系的學生而言都相當重要。因此,為了較為全面且平衡的介紹『系統軟體』與『系統程式』兩個主題,我們將採取兩者並重的方式。

在系統軟體方面,我們利用一個簡化版的處理器CPU0,說明組譯器、連結器、載入器、巨集處理器的運作原理。這個方式可以避免掉實務上的複雜性。電腦系統複雜的原因,通常是由於電腦硬體追求效率所造成的,利用 CPU0 這樣的簡單架構,可以大幅降低這種複雜性,直接深入電腦背後的原理,避免被太複雜的機器架構與組合語言所迷惑。

在系統程式方面,我們主要採用開放原始碼的 GNU 開發工具,以實際操作的方式學習『系統程式實務』,這可以讓我們不至於脫離現實太遠,也能讓讀者順便熟悉GNU 這個在產業上具有無比重要性的工具集。

在語言上面,本書將以C 語言與組合語言兩者為主。由於C 語言的指標設計對硬體具有強大的控制能力,這使得C 語言在系統程式產業上具有無比的重要性。而組合語言則是理解電腦運作原理的關鍵,並且可以補足C 語言在某些與硬體控制能力上的不足。因此這兩個語言對於學習系統程式而言,缺一而不可。

內容簡介

本書將從第1 章的『系統軟體』出發,然後在第 12 章以『系統軟體實作』結尾。中間的章節分為三個部分,第一部分是 2-6 章的『組合語言』相關主題,第二部分是 7-8 章的『高階語言』相關主題,而第三部分則是 9-11 章的『執行平台』相關主題。

在『組合語言』部分,我們從第2 章的『電腦的硬體結構』出發,然後在第3 章進入『組合語言』領域。接著,導入組合語言相關的系統軟體,這包含『組譯器』(第4 章)、『連結與載入』(第5 章) 等主題。然後,利用巨集處理器(第 6 章)開始導入高階語言。

在『高階語言』部分,我們從第7 章的『高階語言』出發,然後說明高階語言的重要系統軟體 -『編譯器』 (第8 章) 是如何製作的,並且以C 語言作為主要對象,說明其語法與編譯器的設計原理。

在『執行平台』部分,我們以第9 章的『虛擬機器』開頭,然後在第10章介紹『作業系統』,然後在第11章中介紹沒有作業系統的嵌入式開發環境,這三種平台都是現今實務上常用的環境,像是 Java 的JVM 與微軟的 .NET 都屬於虛擬機器,而開放原始碼的 Linux 與微軟的 Windows 則屬於作業系統,另外,單晶片、SOPC 等領域,則屬於嵌入式系統。

最後,在第 12 章中,我們將實作出小型的『組譯器』、『編譯器』以及『虛擬機器』,以便分別代表『組合語言』、『高階語言』與『執行平台』三類系統軟體,讓讀者實際體會其設計方法。

筆者認為,系統程式並非單獨的一門課程,而是一個整合『數位邏輯』、『計算機結構』、『嵌入式系統』、『作業系統』、『編譯器』等課程的核心領域,本書希望能在化繁為簡的原則上,建立系統程式與上述課程之間的關係。

本書的網路資源

筆者為本書開闢了一個網路專區 http://sp1.wikidot.com/,以便能讓讀者取得相關的補充教材,像是範例程式與投影片等等。在網路發達的今日,系統程式領域並非一本書即可涵蓋的,我們希望透過該網站,能隨時讓讀者取得最新的相關訊息,並且隨時更新書籍中的錯誤,甚至介紹本書中所無法涵蓋的主題。

感謝

長久以來,筆者在教授『系統程式』課程時,總是感到無比困擾。原因是當筆者採用理論性的書籍時,學生會感覺不到系統程式在實務上的重要性。但是採用實務性的『組合語言』書籍,卻又造成課程上的文不對題,於是一直希望能有人寫一本理論與實務兼具的系統程式教科書,但卻又遍尋不到。

於是我寫了一份相當簡短的草稿放在自己的網站上,旗標出版社的彥發兄看到該草稿後,便主動與我聯絡,希望能將該草稿出版。這下可讓我既欣慰又感到壓力,欣慰的是可以將該書出版,但筆者一面教書的情況下要在 8 個月內將書籍完成,因此而倍感壓力。現在,這本書終於完成了,我得感謝旗標的彥發兄與昕暐兄,沒有彥發兄的提議,我可能一輩子都無法將此書完成。而沒有昕暐兄的修改校對,這本書恐怕會難以閱讀。

另外,也感謝旗標公司中無數參與這本書的同仁,沒有你們的參與,這本書將無法付梓出版。當然,對於我個人而言,更應該感謝的是我的家人,我的太太與兩個小寶貝,為了這本書而犧牲了好幾個周末,以至於無法好好的陪伴你們,感謝妳們的支持、關心與照顧。真心的感謝幫助過我們的每一個人,希望大家都能平安、健康且快樂。祝福大家!

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License