X Window 系統(tǒng)使用指南--X的基本架構(gòu)
在本章和下一章我們將描述X的基本架構(gòu),并介紹許多基礎(chǔ)的觀念,其目 的在於對你稍後使用系統(tǒng)時能有一個了解,你將會洞悉系統(tǒng)程式做些什麼和如 何做,如此你將更快和更有效率的使用系統(tǒng),我們也會指出系統(tǒng)外在的利益, 以及使用系統(tǒng)對你的影響。
本章描述系統(tǒng)的基本元素,以及它們彼此之間如何交談(interact),下一 章描述系統(tǒng)其它的面貌,特別是使用者介面。此章包含了許多新觀念,你不妨 先很快的瀏覽這兩章後,開始實(shí)際地使用它,當(dāng)你對系統(tǒng)比較有感覺之後,再 回頭來復(fù)習(xí),這樣比較容易了解。
2.1 X的基本元素
X不像早期的視窗系統(tǒng),把一堆同類軟體集中在一起,而是由三個相關(guān)的 部份組合起來。
1. 一個'server'(供應(yīng)者):是控制實(shí)際顯示器和輸入裝置的程式。
2. 'ClIEnt' (顧客) 程式:需藉著server在指定的視窗中完成特定的 操作。
3. 一個 '通訊通道(communication channel)':client和server用來作 為彼此交談之用。
基本的'server','client'和 '通訊通道' 的關(guān)系圖如圖2-1 。
┌—————————————┐ │ p16 fig 2.1 │ │ │ │ 圖 2-1 X的基礎(chǔ)成員 │ └—————————————┘
底下我們描述一下這三個部份。
2.1.1 Server
Server是控制實(shí)際顯示器和它的輸入裝置 (鍵盤和滑鼠或其它指示裝置) 的軟體,server可以建立視窗、在視窗中畫圖形影像和文字、回應(yīng)client程式 的 '需求' (requests),它不會自己動作,只有在client程式提出需求後才完 成動作。
每一個顯示器只有一個唯一的server。server一般由系統(tǒng)的供應(yīng)廠商提供 ,通常無法被使用者修改。針對作業(yè)系統(tǒng)而言,server只是一個普通的使用者 程式而已,因此很容易換一個新的版本,或許甚至是由第三集團(tuán)提供的原始程 式 (注1) 。
注1:這是Unix系統(tǒng)上的情況,有些供應(yīng)廠商會選擇將server的部份或全部放 在作業(yè)系統(tǒng)核心(kernel)。
2.1.2 Client
Client是使用系統(tǒng)視窗功能的一些應(yīng)用程式。把X下的應(yīng)用程式稱作 'client',原因是因?yàn)樗莝erver的 '顧客' :它要求server應(yīng)它的需求 完成特定的動作。
Client無法直接影響視窗或顯示,它們只能送一個 '需求' (request) 給 server,讓server來完成它們的需求。典型的 '需求' 通常是: '在 XYZ視窗 中寫一列 'Hello, world' 的字串' ,或 '在 CDE視窗中用這種顏色從 A點(diǎn)到 B點(diǎn)畫一條直線' 。
當(dāng)然,對視窗操作提 '需求' 只是client程式的一部份,其它的部份是那 些讓使用者執(zhí)行的程式部份。例如:編輯文字、畫一個系統(tǒng)的工程圖、執(zhí)行計(jì) 算表的計(jì)算等等。一般來說,client程式的這個部份和視窗是獨(dú)立的,對於視 窗幾乎不需要知道什麼,通常 (特別是指大型的標(biāo)準(zhǔn)繪圖套裝軟體,統(tǒng)計(jì)套裝 軟體等) 應(yīng)用程式對許多的輸出裝置具有輸出的能力。在X視窗上的顯示只是 client程式許多輸出格式中的一種,所以,client程式中和X相關(guān)的部份在整 個程式中,只占了非常小的一部份。
使用者可由不同的來源來使用client程式:一些是由系統(tǒng)提供的 (例如時 鐘) ,一些來自於第三集團(tuán),一些是使用者為了特殊應(yīng)用而撰寫他自己的client 程式。
2.1.3 通訊通道
X的第三個元素為通訊通道,client藉著它送 '需求' 給server,而server 藉著它回送狀態(tài) (status) 及一些其它的資訊 (information)。
只要 client 和 server 都知道如何使用通道,通道的本身并不是很重要 ,在系統(tǒng)或網(wǎng)路上支援通訊型態(tài)的需求是內(nèi)建於系統(tǒng)基本的X視窗函數(shù)館(library) ,所有和通訊型態(tài)有關(guān)的事都從函數(shù)館獨(dú)立出來,client和server之間的通訊 只要藉著使用這函數(shù)館(在標(biāo)準(zhǔn)X版為xlib)即可,如圖2-2 。
┌—————————————┐ │ p17 fig 2.2 │ │ │ │ 圖 2-2 xlib函數(shù)館的功能│ └—————————————┘
總結(jié)來說,只要client程式利用函數(shù)館,自然有能力用到所有可用的通訊 方法。
Client和Server通訊大略分為兩類,相對應(yīng)於二種基本X系統(tǒng)的操作模式:
1. server和client在同一部電腦執(zhí)行,則它們彼此均可使用機(jī)器上任何 可用的方法做交互處理通訊(inter-process communication (簡稱IPC)), 見圖2-3 ,在這種模式下,X可以像許多傳統(tǒng)的視窗系統(tǒng)一樣有效率 的操作。
┌—————————————┐ │ p18 fig 2.3 │ │ │ │ 圖 2-3 在相同機(jī)器上的 │ │ client和server │ └—————————————┘
2. client在一部機(jī)器上執(zhí)行,顯示器和server則在另一部機(jī)器上,則 client和server的通訊必需透過網(wǎng)路利用彼此同意的協(xié)定(protocol) 方可。目前,最常見的協(xié)定為TCP/IP和DECnet,但其它任何被提供的 可信賴地協(xié)定亦可使用。圖2-4 顯示一個典型的Ethernet網(wǎng)路的通訊。
┌—————————————┐ │ p18 fig 2.4 │ │ │ │ 圖 2-4 在不同機(jī)器上的 │ │ client和server │ └—————————————┘
這種透過網(wǎng)路,使得應(yīng)用程式的操作,如同在本地機(jī)器一樣的能力稱 為網(wǎng)路透通性(network transparence),幾乎是X獨(dú)一無二的特性 (注1)。這種特性使得它非常適合建立在有彈性地多目標(biāo)混合機(jī)器 網(wǎng)路上。
注1:有幾種例如Sun Microsystems 的NEWS的視窗系統(tǒng)有使用到網(wǎng)路結(jié)構(gòu), 但沒有一種被廣泛地使用,而有超過一家以上的制造廠商使用它們。
因?yàn)閏lient和server完全獨(dú)立,一種名之為X-terminal 的新型態(tài)顯示器 被發(fā)展出來。簡單的說,X-terminal 是一種除了能直接在上面執(zhí)行X server 程式外,什麼也沒有的工作站,它有鍵盤,滑鼠和螢?zāi)唬约耙恍┖途W(wǎng)路互相 通訊的方法(所以在其它主機(jī)上的client可在它上面顯示),但并沒有檔案系 統(tǒng),也不提供一般目的 (general purpose)的程式,一般目的的程式需要在網(wǎng) 路上執(zhí)行。
2.2 Server和Client如何交談
本節(jié)描述client和server互相通訊時,雙方各傳輸些什麼。基本上,一個 client要求server去執(zhí)行輸出,輸入則藉著 '事件' (event) 的通知由server 來掌握( '事件' :如按下鍵盤的鍵或滑鼠的按鈕等等)。
2.2.1 Client送達(dá)server的東西;Output Handing (輸出交予)
當(dāng)一個client要求server做一個動作,例如在一個指定的螢?zāi)簧辖⒁粋€特 殊特徵的視窗,或者在一個視窗中寫一列文字串。這時client是藉著送 '需求' (requests)到server上來達(dá)成。一個 '需求' 是一個被封裝(package) 的簡單 區(qū)塊(block) ,區(qū)塊包含一個 '操作碼'(opcode) 來指示要執(zhí)行何種操作,伴 隨著一些引數(shù)(arguments) 提供更多的需求細(xì)節(jié)。例如:清除一個視窗內(nèi)的一 個長方形區(qū)域,client會送一個16位元組(byte)的需求區(qū)塊,來指定是哪一個 視窗,欲清除區(qū)域的左上角座標(biāo)及區(qū)域的高和寬。
這個格式有幾個重要的特徵:
. 需求區(qū)塊的內(nèi)容,和client與server在何種型態(tài)上的機(jī)器上執(zhí)行完全無 關(guān)。一個client可以輸出需求給在任何型式顯示器上的任何X視窗server。需 求和語言、機(jī)器及作業(yè)系統(tǒng)均無關(guān)。
. 每一個需求包含了視窗的細(xì)節(jié)和其它被使用的資源,對一個client送至 特定server的需求超過一種以上的連接方法,所以在網(wǎng)路架構(gòu)上提供的視窗數(shù) 目沒有限制。
. 需求區(qū)塊通常大小為20位元組左右,算是相當(dāng)?shù)男。驗(yàn)樾枨笫窃O(shè)定為 相當(dāng)高階的,(例如畫一條線是指定兩個端點(diǎn)而非記錄一串螢?zāi)簧系狞c(diǎn))通常 螢?zāi)簧媳挥绊懙降南袼氐臄?shù)目往往是區(qū)塊本身大小的十到一百倍,如此不會使 網(wǎng)路的負(fù)荷太重,網(wǎng)路的使用效率會非常的好(一般認(rèn)為X的server和client 之間的傳輸是位元影像 (bitmaps)的觀念是錯誤的)。
2.2.2 Server送達(dá)Client的東西;Input Handling (輸入交予)
Server也會利用通訊通道送資訊回client,這些資訊包括回應(yīng)client需求 是否成功和告訴client有興趣的特殊 '事件' ,這些 '事件' 包含的訊息類似 ”視窗XYZ 的滑鼠左按鈕被碰觸”或”視窗ABC 已被重定大小等”。
就像從client來的需求一般,server的回應(yīng)也是一些和語言、機(jī)器、作業(yè) 系統(tǒng)無關(guān)的簡單區(qū)塊。
'事件' 是X的基本功能,所有的鍵盤輸入,滑鼠按鈕輸入和滑鼠移動都 是由 '事件' 來控制,尤有進(jìn)者,client完全依賴 '事件' 才能獲得那些一定 在系統(tǒng)發(fā)生的而它必需知道的資訊。我們將從一些普通的輸入和移動功能著手 ,實(shí)際了解 '事件' 是如何工作的:
鍵盤輸入
當(dāng)你從鍵盤按下一個鍵,這個動作會被server查覺到,Server便送出一個 <Key Press> 的 '事件' 通知那些登記對這種情況有興趣的應(yīng)用程式。這種通 知有一些限制:不是通知目前被滑鼠指標(biāo)指到的視窗,便是通知目前被指定接 受所有鍵盤輸入的視窗。這種限制稱之為設(shè)定鍵盤焦點(diǎn)(focus) 。
當(dāng)鍵被松開時(通常幾乎是立刻),另外一個<Key Release> 的 '事件' 產(chǎn)生了,一般除了那些修飾鍵(例如SHIFT 或 CONTROL),很少的應(yīng)用程式會 對松開鍵這個 '事件' 有興趣。
送到client的訊息區(qū)塊告訴client它們是鍵盤 '事件' 內(nèi)容的只是”編號 第幾的鍵已被按下(或松開)”,不包含是不是ASCII 或EBCDIC字元及如何解 釋等內(nèi)容,而把這些留給client程式去處理,這種做法使得client程式看起來 似乎復(fù)雜,但是標(biāo)準(zhǔn)的xlib函數(shù)館,有非常簡單的副程式可供控制解釋鍵盤 ' 事件',而且通常預(yù)設(shè)成你所希望的鍵盤型式,換個角度來看,這種”軟體” 的鍵盤字元相關(guān)方式允許了很大的彈性:在server這方面,對不同型式的鍵盤 均可以完全重新對應(yīng),在client這方面,每一個單獨(dú)的鍵都”可程式化”,例 如按一個鍵即可以輸入一串使用者特定的字串,或者完成一個特殊的功能等。
稍後我們會再詳細(xì)討論,不過直到目前,這些將不會影響你使用系統(tǒng),事 實(shí)上,對於X系統(tǒng)如何處理你按下一個”A ”鍵,并將它轉(zhuǎn)換成一個ASCII 的 ”A ”字元送到你的應(yīng)用程式的這類事情,你不需要太關(guān)心。
關(guān)於指標(biāo)位置的 '事件'
client可以要求當(dāng)螢?zāi)簧系闹笜?biāo)進(jìn)入或離開它所控制的視窗時被通知,這 種 '事件' ('<EnterWindow>' 和'<LeaveWindow>') 告訴client程式是進(jìn)入或 離開視窗以及是哪一個視窗。
當(dāng)指標(biāo)進(jìn)入視窗時通常用類似”高亮度”視窗這一類的方式表式,有些應(yīng) 用程式是改變視窗的邊框(例如從灰到黑),有些則會改變顏色,用以強(qiáng)調(diào)你目 前正在處理這個應(yīng)用程式(視窗)。
當(dāng)一個視窗未被覆蓋時 -- Exposure (曝光 '事件')
X和大多數(shù)其它的視窗系統(tǒng)有一個很大的不同點(diǎn),那就是client必需負(fù)責(zé) 保持它的視窗最近的內(nèi)容,server只是維持視窗在任何時刻均在螢?zāi)簧巷@示, 但它不負(fù)責(zé)保持視窗的內(nèi)容。
當(dāng)原先被其它的視窗遮住的視窗(或視窗的一部份)變成可見時,server 并不知道應(yīng)該顯示這個視窗的哪個部份。server送一個exposure(曝光)'事件' 給擁有這個視窗的client,告訴它視窗的哪一個部份剛剛已變成可見,client便 會決定該怎麼作,在大多數(shù)的情況(一般為簡單的應(yīng)用程式或小視窗),client 只是重畫整個視窗,因?yàn)橹划嬕暣拔幢徽谏w的部份往往要多花額外計(jì)算,并不 值得,在更復(fù)雜的應(yīng)用程式,client才會只重畫視窗必需要出現(xiàn)的部份,這是 由應(yīng)用程式的撰寫者決定,他必需在效率(視窗更新的速度)和只重畫部份視 窗程式碼的復(fù)雜程度間作取舍。
依賴client來重畫視窗內(nèi)容的方式對效率特別重視,尤其是下拉式選單, 你總不希望選下選單之後,選單過了老半天才消失而讓下面的視窗顯示出來吧 ,為了克服這點(diǎn),有些X的產(chǎn)品包含了被稱為save-under(存下層)的便利程 式:
你可以告訴server如果可能的話,盡量在一個視窗被遮蓋前將其被遮蓋的內(nèi)容 存下,當(dāng)遮蓋的視窗被移走時便可立即重現(xiàn)而不需要送曝光 '事件' 給client。
一個類似而更常用,被稱為backing store 的方式也被發(fā)展出來,你可以 告訴server盡可能在一個視窗被遮蓋前將其全部內(nèi)容存下,同樣的,這種方式 可以改進(jìn)client重畫視窗的效率,backing store 和save-under兩者的不同處 是前者儲存整個視窗的內(nèi)容,而後者只存被遮蓋的部份。
雖然有了save-under和back store這兩種產(chǎn)品,但此種結(jié)構(gòu)不被擔(dān)保, client仍然隨時保持準(zhǔn)備接受曝光 '事件' ,即使server真的維護(hù)(maintain) 了一段時間的視窗內(nèi)容,也可能因?yàn)橛洃涹w不足而被迫停止,轉(zhuǎn)而開始重新送 出曝光 '事件'。
2.3 X的網(wǎng)路風(fēng)貌
我們曾經(jīng)提過,client和server只需透過網(wǎng)路便可在不同的機(jī)器上執(zhí)行, 下面幾節(jié)我們將看看如何利用這種便利、為什麼有用、和它如何因整合了計(jì) 算資源而增進(jìn)了網(wǎng)路的成長。
2.3.1 你如何實(shí)際使用X網(wǎng)路
當(dāng)server在一個連接了顯示器的機(jī)器上執(zhí)行,而client在另一部機(jī)器上執(zhí) 行時,滑鼠和鍵盤的輸入由server所在的機(jī)器搜集,可是client卻可以在別的 地方使用到這些輸入,這是如何辦到的?我們以下面的例子解釋。
你在使用一個由Xserver控制顯示器的工作站,如果它是獨(dú)立的,很明顯 地,client也在此工作站上執(zhí)行,即使連接了網(wǎng)路,大部份的時候你還是在你 自己的工作站執(zhí)行client,可是因?yàn)橛幸恍┨厥獾谋憷淌剑愕臋C(jī)器上并沒 有,而你卻希望在你的機(jī)器上顯示程式的輸出,這時你便需要網(wǎng)路上的機(jī)器了 。利用你的作業(yè)系統(tǒng)提供的一些普通的網(wǎng)路設(shè)備程式,你便可以讓client程式 在遠(yuǎn)方的機(jī)器上執(zhí)行,而指定輸出顯示在你自己工作站的顯示器上,如圖2-5.
┌—————————————┐ │ p23 fig 2.5 (???) │ │ │ │ 圖 2-5 使用X網(wǎng)路典型 │ │ 的面貌 │ └—————————————┘
就如同圖上顯示的機(jī)器名稱,假設(shè)client程式的名稱為xgraph,在Unix系統(tǒng)上 ,你所下的命令類似下面:
rsh neptune xgraph -display venus:0
則xgraph程式在遠(yuǎn)方名為neptune 的機(jī)器上執(zhí)行,且xgraph的輸出會送到你自 己名為venus 的機(jī)器上的 0號顯示器上,從現(xiàn)在起,我們將參照這種遠(yuǎn)方顯示 (remote display)的模式操作,當(dāng)client在一部機(jī)器上執(zhí)行時,server在另一 部機(jī)器上執(zhí)行。
現(xiàn)在總結(jié)一下:你使用遠(yuǎn)方顯示的設(shè)備程式使得client程式在遠(yuǎn)方的機(jī)器 上被執(zhí)行,而且告訴它將輸出顯示在執(zhí)行Xserver的本地機(jī)器上。
2.3.2 X的網(wǎng)路設(shè)備有何用途?
在一部機(jī)器上執(zhí)行client而把輸出顯示到另一部機(jī)器有何用途?這些用途 和便利是極常見的,以下是一小部份的用途:
. 遠(yuǎn)方的機(jī)器速度比你的快很多(可能是因?yàn)榧恿烁↑c(diǎn)運(yùn)算器或它根本就 是一部超級電腦。)。
. 在你的區(qū)域網(wǎng)路上,遠(yuǎn)方的機(jī)器是一部檔案服務(wù)器(file server) 提供 了大量磁碟資源,為了降低網(wǎng)路的負(fù)擔(dān),你可以把一些類似大量的搜尋 操作,需要用到大量磁碟動作的程式放在遠(yuǎn)方機(jī)器上執(zhí)行,如此一來, 只有執(zhí)行結(jié)果而不是大量操作磁碟的動作會透過網(wǎng)路傳送。
. 遠(yuǎn)方機(jī)器有特殊的結(jié)構(gòu)適合特別的工作,可能是專門的資料庫機(jī)器,或 者是為一個單獨(dú)的應(yīng)用特別設(shè)計(jì)的特殊目的機(jī)器。
. 遠(yuǎn)方的機(jī)器有只能在其上執(zhí)行的特殊軟體,在現(xiàn)代的工作站,在網(wǎng)路上 有些軟體執(zhí)照只有少數(shù)的機(jī)器擁有已是愈來愈多的趨勢,因?yàn)檐涹w執(zhí)照 只發(fā)給那些有付費(fèi)的工作站CPU 。在這種情況下,可以實(shí)際地在遠(yuǎn)方的 機(jī)器上執(zhí)行這些有執(zhí)照的軟體,而將顯示傳回你自己機(jī)器上,是相當(dāng)?shù)? 便利。
. 你需要同時存取好幾部機(jī)器,通常系統(tǒng)的管理者有此需求。
. 你需要同時輸出到數(shù)部顯示器。(下面有一個□例)
一個特別的□例 -- 一個應(yīng)用程式使用數(shù)個顯示器
大部份的情況,數(shù)個client應(yīng)用程式共享一個顯示器是常見的,例如一個 螢?zāi)簧贤瑫r有時鐘client和編輯器client,但是一個client也可以連接到數(shù)個 server,而且同時輸出到server所在的螢?zāi)簧稀?
這種情形用於教學(xué)特別有效率,如果一個班上的學(xué)生們有X視窗工作站連 接在網(wǎng)路上,則老師就可以把螢?zāi)划?dāng)成動態(tài)的黑板,同時輸出給學(xué)生,再發(fā)展 下去,學(xué)生也可以有一個client程式把顯示輸出給老師,達(dá)成雙向的溝通,只 要網(wǎng)路許可,所有的工作站并不需要在同一個房間,因此老師和學(xué)生可以分散 在各處。
2.3.3 X網(wǎng)路結(jié)構(gòu)產(chǎn)生的簡易性
就像前面所提過的,所有從client對server發(fā)出的 '需求' ,由於它們的 格式和內(nèi)容是和設(shè)備無關(guān)的(device-independent),而所有和設(shè)備相關(guān)的事完 全集中在server,對於任何顯示器的硬體,只有對應(yīng)於此種顯示器的server才 需要去關(guān)心,只要針對一個顯示器的server一旦被提供,所有可執(zhí)行X client 程式的其它機(jī)器立即可使用這個顯示器,不需要重新編譯或重新連結(jié),甚至連 顯示器是什麼型式都不需知道。
這種把設(shè)備的相關(guān)性獨(dú)立出來給server的方式,對許多工作站網(wǎng)路的販賣 商變得可行且輕松,這種彈性在兩方面特別有用:
. 當(dāng)一部執(zhí)行X client 的新機(jī)器加入網(wǎng)路,它立即可以使用任何執(zhí)行X 的顯示器。圖2-6 是一個強(qiáng)力的CPU 如何在網(wǎng)路上被當(dāng)成一個計(jì)算服務(wù) 器(compute server)的示意圖.
┌—————————————┐ │ p25 fig 2.6 (???) │ │ │ │ 圖 2-6 已存在的顯示器 │ │ 可使用在新的CPU │ │ 上的client │ └—————————————┘
. 相反的,當(dāng)一個新的顯示器加入,它立即可被任何機(jī)器上現(xiàn)存的所有 X client 應(yīng)用程式使用,見圖2-7 ,這里有兩個極端的例子:
-- 增加一個高效率的顯示器:它的高品值和(或)速度可被用來加強(qiáng) 任何現(xiàn)存的X應(yīng)用程式。
-- 增加一個非常低等(low end) 的顯示器(例如X顯示器),至少這 是一個使用現(xiàn)在所有軟體,并提供圖形和視窗的最便宜的方法。
┌—————————————┐ │ p26 fig 2.7 (???) │ │ │ │ 圖 2-7 被已存在的client│ │ 程式使用的新顯 │ │ 示器 │ └—————————————┘
2.3.4 在網(wǎng)路上使用非X的應(yīng)用程式 -- 終端機(jī)模擬器
如果在遠(yuǎn)方機(jī)器上的程式并不是X client 或甚至連X是什麼都不知道, 你仍然可以像遠(yuǎn)方的機(jī)器一樣使用它們,這就需要用到X視窗”終端機(jī)模擬器” (terminal emulator) ,一個假裝它是終端機(jī)的程式。如此一來,你便可以讓 任何程式在這個假的終端機(jī)執(zhí)行。這個終端機(jī)模擬器利用X顯示輸出(和得到 鍵盤輸入),當(dāng)然輸出也可以送到本地或遠(yuǎn)方的顯示器。一個這種型式的□例: 利用xterm 終端機(jī)顯示器去執(zhí)行信件程式,見圖2-8 ,(xterm是MIT 標(biāo)準(zhǔn)版X 的所提供的一部份) ,這種方式對擴(kuò)展網(wǎng)路的用途是可想像的,但是注意到一 點(diǎn),它并非萬靈丹,一個不是X的應(yīng)用程式當(dāng)然還是無法用到X的特性,終端 機(jī)顯示器并沒有什麼魔法讓假的終端機(jī)可以使用滑鼠輸入或圖形操作等。
┌—————————————┐ │ p27 fig 2.8 (???) │ │ │ │ 圖 2-8 執(zhí)行遠(yuǎn)方的一個 │ │ 非X的信件程式 │ └—————————————┘
2.4 摘要
本章你可以看到包含在X中的基本構(gòu)成要素:控制顯示器的server,要求 server幫它完成輸入輸出的client應(yīng)用程式和介於兩者之間的通訊通道,你可 以看到它們彼此間如何交談,如何實(shí)地應(yīng)用,以及它們對你的好處(不管你是 使用者或系統(tǒng)建立者)。
下一章,我們繼續(xù)概觀系統(tǒng),但是在稍高一點(diǎn)的層次,焦點(diǎn)集中在使用者 介面上。
