天天看點

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

本節書摘來自華章計算機《計算機系統:核心概念及軟硬體實作(原書第4版)》一書中的第3章,第3.6節,作者:[美] j. 斯坦利·沃法德(j. stanley warford)著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

c++是一種hol6層語言,當程式員在c++中聲明變量時,必須指定變量值的類型。而在isa3層,變量是二進制的。

假設在一個c++程式中聲明了

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

并在一台7位計算機上運作這個程式。在isa3層,int類型的值以補碼二進制表示法存儲。如果i和j的值分别是8和-2,程式包含語句

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

那麼在isa3層對這個表達式求值是這樣的:

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

在isa3層,char類型的值以ascii或其他字元編碼的形式存儲。如果ch1的值是-,ch2的值是2,那麼這些值在isa3層被存儲為

010 1101011 0010

這個位模式當然和整數j的值不一樣,j的值是111 1110。

在c++中,在hol6層,每個字元在數軸上都有一個序數值位置。在isa3層,機器層,這個序數值就是作為無符号整數來解釋的字元編碼的二進制值。因為不同的計算機可以選擇使用不同的二進制符号編碼,是以它們的序數值可能會不同。

例3.46根據ascii表,d用100 0100代表,而100 0100(bin)=68(dec)。在一台使用ascii碼的計算機上,d的序數值就是68。 □

例3.47要在你的計算機上振鈴,可以執行如下産生振鈴的語句

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

在hol6層,進階語言的一個典型語句是

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

字元串常量tom被傳送到輸出裝置。這條語句在isa3層并不這麼簡單。在機器語言中,你沒法“寫出tom”,而是必須把位序列

101 0100

110 1111

110 1101

發送到輸出裝置。

為什麼我們要處理位而不是我們習慣的英文字母和十進制數字呢?因為計算機是電子的。最便宜最可靠的制造計算機電子部件的方法是把它們做成二進制的,是以我們隻能用二進制機器來處理資訊。isa3層的問題是我們要處理的資訊是十進制數字和英文字母的形式,而機器語言是以1和0的形式表示資訊,是以需要進行編碼,例如補碼二進制表示法和ascii。

要處理的資訊形式和表示資訊的語言之間的不比對并不隻是在isa3層有,這也是所有較高層次要考慮的重要問題。

通過旅行推銷員問題可以說明hol6層的這種情況。一個推銷員負責8個不同城市的業務,他乘坐航空公司航班穿梭在這些城市之間,這8個城市之間有14條航空線路。要處理的資訊形式是航空公司提供的地圖,地圖展示了連接配接推銷員負責範圍内城市之間的所有航線。地圖如圖3-34所示,它也标出了每條航線航班的價格。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

推銷員必須從洛杉矶出發,通路他職責範圍内的每個城市,然後傳回洛杉矶,他當然想把他的行程計劃為花費最少的。

确定最佳行程表聽起來像是計算機的完美工作。推銷員把地圖給程式員,程式員知道怎樣用hol6層語言(例如,c++)來說話。

但是現在程式員要面對這個計算機科學的根本問題。地圖和hol6層語言這兩種資料形式不比對,c++不認識地圖,它隻能認識諸如實數、整數和數組之類的東西。

程式員必須決定怎樣用c++能夠處理的形式來表達資料。例如,他可以用如圖3-35所示的二維實數數組來表示地圖。在這個方案中,頂行和左列的整數代表推銷員所負責範圍内的城市,表中每個實數表示從行索引代表的城市到列索引代表的城市的美元價格。如果這個二維數組叫cost,那麼

cost 0 = 65

表示從城市0(洛杉矶)飛到城市5(薩克拉門托)的費用是65美元。

cost 1 = le30

表示城市1(聖地亞哥)和城市7(拉斯維加斯)之間沒有航線。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

原始資料轉換為c++可以處理的表示後,hol6層程式員可以繼續他的算法設計,并最終解決這個問題。但是第一步必然用這種語言能夠處理的形式來表示這些資料。

isa3層的問題是怎樣用機器語言來表示數字和字母,hol6層的問題是怎樣用c++的整數、實數和數組來表示一個有城市、線路和航班費用的地圖。在這兩個層次上,都有最根本的資料表示問題。

3.6.1另一種表示

資訊表示問題具有挑戰性的一面是通常會有多種不同的方法來表示資料。選擇哪種表示取決于要怎樣處理資料。

這裡有一個在isa3層表示正整數的另一種方法。盡管本章用無符号二進制來表示正數,但這并不是唯一的可能,正整數也能以二進制編碼的十進制數(binary coded decimal,bcd)形式來存儲。

在bcd中,每個十進制的位剛好需要4位。十進制數142會以二進制0001 0100 0010的形式存儲。因為隻有10個十進制數字,是以4 位的bcd組是0000、0001、0010、0011、0100、0101、0110、0111、1000和1001,從1010到1111的位模式未被使用。

如果資料更多的是在計算機内進行算術運算而不是i/o操作,通常會選擇無符号二進制;當資料是金融業務并有很多i/o操作時,通常選用bcd。bcd更容易轉換為十進制用于列印報表,然而bcd算術運算電路通常比無符号二進制算術運算電路慢。

推銷員問題中也有類似的選擇。例如,航空公司沒有在所有可能的城市之間開通航線,尤其是小城市。要從棕榈泉到裡諾,必須首先從棕榈泉飛到洛杉矶,然後從洛杉矶再到裡諾。在圖3-35中,盡管隻有14條航線,但是cost有64個元素,大多數元素是le30,有28個元素不是le30,而隻有14個是真正必需的。

例如,這兩項

cost0 = 65

cost5 = 65

代表洛杉矶和薩克拉門托之間隻有一條航線,假設兩個方向的航班費用是相等的,那麼實際上隻需要一個項,另一項是多餘的。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

是以程式員可以決定采用圖3-36所示的方式來表示地圖。在hol6層語言中,線路可以實作為一個數組route,數組中的每個記錄包含3個字段:from、to和cost,那麼

route[4].from = 0

route[4].to = 5

route[4].cost = 65

表示洛杉矶和薩克拉門托之間的飛行花費是65美元。

用這種方式表示地圖,不會為不存在的航線浪費存儲空間。如果城市9和城市11之間沒有航線,那麼就不用存儲它們。

在hol6層,地圖還有其他表示方式, 與在isa3層無符号整數有其他表示方式一樣。在任何層,都可能會有多種表示資料的方法,任何一種方法都能得到正确的結果。

确定哪一種表示最好通常是很困難的。實際上,通常要定義什麼是“最好的”都很困難。如果你的計算機有大記憶體,那對你來說,最好的表示可能是一種有點兒浪費存儲的方式,因為有足夠的空間。另一方面,如果記憶體不足,最好的表示就是少用點兒存儲空間,盡管用這種方式處理資料的算法會很慢。這種空間/時間的折中适用于計算機系統的各個抽象層次。與所有創造性努力會遇到的一樣,這種選擇并不總是很明确的。

3.6.2模型

模型是某些實體系統的簡化表示。每個科學領域的從業人員,包括計算機科學,構模組化型并研究它們的性質,比如天文學家建構和研究的一些太陽系模型。

大約公元前350年,希臘的亞裡士多德提出了一個模型,在這個模型中,地球位于宇宙的中心,環繞地球的是55個天球。太陽、月亮、行星和恒星每個都在一個天球上環繞天空。

這個模型和現實相符的程度如何呢?它能成功地解釋天空的形狀像球的頂部一樣,也能解釋行星大概的運作。千百年來,亞裡士多德的模型被認為是準确的。

1543年,波蘭天文學家哥白尼出版了《de revolutionibus》(天體運作論),在這本書中,他建立了以太陽為中心的太陽系模型,行星圍繞太陽做圓周運轉。這個模型比地心模型更接近實體系統。

16世紀後期,丹麥天文學家tycho brahe(第谷·布拉赫)進行了一系列精确的天文觀察,這些觀察與哥白尼的模型有一定的差異。然後,1609年,johannes kepler(約翰内斯·開普勒)設想了一個模型,在這個模型中,地球和所有行星圍繞太陽運作,但軌道不是圓形而是扁平的圓形(即橢圓形)。這個模型成功地詳細解釋了tycho brahe觀察到的行星的複雜運作。

每個模型都是太陽系的一個簡化表示。沒有一個模型能夠完全精确地描述真實的實體世界。現在我們知道,根據愛因斯坦的相對論,甚至kepler的模型也是一個近似模型。沒有模型是完美的,每個模型都是現實世界的一個近似。

當資訊在計算機存儲器中表示時,這個表示也僅僅是一個模型。如同太陽系的每個模型描述真實系統的某個方面比其他方面更加精确一樣,一種表示方法描述資訊的某個性質比其他性質更精确。

例如,正整數的一個性質是有無窮大的數。不管你寫一個多大的整數,别人總能寫出更大的數。計算機的無符号二進制表示不能很精确地描述這個性質,因為記憶體中存儲整數的空間大小是有限制的。

我們知道=1.4142136...是無限不循環的。存儲實數的表示方法是一個模型,對于像2的平方根這樣的數,它隻能存儲近似數,它不能準确地表示2的平方根。

在任何層次解決問題都涉及建構一個不完美的模型并研究它的性質。hol6層的推銷員問題是确定最少花費的行程,用航線地圖把他的花費模型化。這個模型并不包括一些因素,比如一些城市的某些酒店可能在周末比工作日價格更貴。如果采用一個更接近現實花費的模型可能會改變最佳行程。

前面的例子說明計算機在任何時候解決問題,由于模型的限制,總會涉及近似。近似可能由于表示方法的限制而導緻産生的,例如在存儲2的平方根值時實數的精度是有限的,或者由于對問題的簡化導緻産生的,例如沒有把不同的酒店價格計算在内。

計算機能模型化各種實體系統—庫存清單、國民經濟、賬務系統和生物種群系統,這裡僅舉幾個例子。在計算機科學中,要模型化的通常是計算機本身。

實際上,計算機隻有的實體部分是在lg1層。從本質上說,計算機隻是一個複雜的、有組織的大量電路和電子信号。在isa3層,高電平信号被模型化為1,低電平信号被模型化為0。isa3層的程式員在使用模型時,不需要知道電子電路和信号。記住在isa3層,單詞tom用1和0表示為

hol6層的程式員在使用模型時,不需要知道位。實際上,在任何層,對計算機程式設計隻需有那個層的計算機模型知識即可。

hol6層的程式員可以把計算機模型化為c++機器,這個模型接受c++程式并用它來處理資料。當程式員訓示機器

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.6跨層的表示方法

他不需要考慮計算機在isa3層怎樣被模型化為二進制機器。類似地,當isa3層程式員寫位序列時,他無須考慮在lg1層計算機怎樣被模型化為電路的組合。

這種逐級為計算機系統模組化的方法并不是計算機科學獨有的。考慮一個有6個分公司分布全國的大公司,公司總裁的模型是6個分公司,每個分公司有一個副總裁向他彙報,他通過看每個分公司的業績來看全公司的業績。當要求産品部門增加利潤時,他無須考慮産品部門副總裁的模型。

當副總裁給産品部門的每個小部門經理下達指令時,他無須考慮小部門經理的模型。讓總裁親自處理小部門層的事務幾乎是不可能的,整個公司有太多小部門層的細節,不可能由一個人去管理。

app7層的計算機使用者就像總裁,他給hol6層的程式員寫的程式發出諸如“計算所有大二學生的平均分”的指令,他無須考慮hol6層模型怎樣釋出指令。最終,這條app7層指令逐層向下傳送到lg1層。最終結果是app7層的使用者能夠用非常簡化的計算機模型控制大量的電子電路和信号。

繼續閱讀