為什么計(jì)算機(jī)采用八位字節(jié)
我正在制作一份有關(guān)計(jì)算機(jī)以二進(jìn)制表示事物的小冊(cè)子,有人問(wèn)我一個(gè)問(wèn)題 - 為什么 x86 架構(gòu)使用 8 位字節(jié)?為什么不能是其他大小呢?
對(duì)于類(lèi)似這樣的問(wèn)題,我認(rèn)為有兩種可能性:
- 這是歷史原因造成的,其他尺寸(如 4、6 或 16 位)同樣有效。
- 8 位是客觀(guān)上的最佳選擇,即使歷史發(fā)展不同,我們?nèi)匀粫?huì)使用 8 位字節(jié)。
- 一些混合 1 和 2 的因素。
我對(duì)計(jì)算機(jī)歷史并不是非常著迷(與閱讀計(jì)算機(jī)文獻(xiàn)相比,我更喜歡使用計(jì)算機(jī)),但我總是很好奇計(jì)算機(jī)事物今天的方式是否存在本質(zhì)原因,或者它們大多是歷史偶然的結(jié)果。因此,我們將談?wù)撘恍┯?jì)算機(jī)歷史。
作為歷史偶然性的一個(gè)例子:DNS 有一個(gè) class
字段,它有 5 種可能的值(internet
、chaos
、hesiod
、none
和 any
)。 對(duì)我來(lái)說(shuō),這是一個(gè)明顯的歷史意外的例子 - 如果我們今天重新設(shè)計(jì) DNS 而不必?fù)?dān)心向后兼容性,我無(wú)法想象我們會(huì)以相同的方式定義類(lèi)字段。我不確定我們是否會(huì)使用 class
字段!
這篇文章沒(méi)有明確的答案,但我在 Mastodon 上提問(wèn),并找到了一些潛在的 8 位字節(jié)原因。我認(rèn)為答案是這些原因的某種組合。
字節(jié)和字有什么區(qū)別?
首先,本文中經(jīng)常提到 “字節(jié)byte” 和 “字word”。它們有什么區(qū)別?我的理解是:
- 字節(jié)的大小 是你可以尋址的最小單元。例如,在我的計(jì)算機(jī)上,程序中的
0x20aa87c68
可能是一個(gè)字節(jié)的地址,然后0x20aa87c69
是下一個(gè)字節(jié)的地址。 - 字的大小 是字節(jié)大小的某個(gè)倍數(shù)。我對(duì)此困惑了多年,維基百科的定義非常模糊(“字是特定處理器設(shè)計(jì)使用的自然數(shù)據(jù)單元”)。我最初認(rèn)為字大小與寄存器大小相同(在 x86-64 上為 64 位)。但是根據(jù) 英特爾架構(gòu)手冊(cè) 的第 4.1 節(jié)(“基本數(shù)據(jù)類(lèi)型”),在 x86 上,雖然寄存器是 64 位的,但一個(gè)字是 16 位的。因此我困惑了 —— 在 x86 上,一個(gè)字是 16 位還是 64 位?它可以根據(jù)上下文而有不同的含義嗎?這是怎么回事?
現(xiàn)在讓我們來(lái)討論一些使用 8 位字節(jié)的可能原因!
原因 1:將英文字母適配到 1 字節(jié)中
維基百科文章 表示 IBM System/360 于 1964 年引入了 8 位字節(jié)。
在管理該項(xiàng)目的 Fred Brooks 的一段 視頻采訪(fǎng) 中,他講述了原因。以下是我轉(zhuǎn)錄的一些內(nèi)容:
…… 6 位字節(jié)在科學(xué)計(jì)算中確實(shí)更好,而 8 位字節(jié)則更適合商業(yè)計(jì)算,每個(gè)字節(jié)都可以針對(duì)另一個(gè)字節(jié)進(jìn)行調(diào)整,以使兩種字節(jié)互相使用。
因此,這變成了一個(gè)高管決策,我決定根據(jù) Jerry 的建議采用 8 位字節(jié)。
……
我在我的 IBM 職業(yè)生涯中做出的最重要的技術(shù)決策是為 360 選擇 8 位字節(jié)。
我相信字符處理將變得重要,而不是十進(jìn)制數(shù)字。
使用 8 位字節(jié)處理文本很有道理:26 為 64,因此 6 位不足以表示小寫(xiě)字母、大寫(xiě)字母和符號(hào)。
為了使用 8 位字節(jié),System/360 還引入了 EBCDIC 編碼,這是一種 8 位字符編碼。
接下來(lái)在 8 位字節(jié)歷史上重要的機(jī)器似乎是 英特爾 8008,它設(shè)計(jì)用于計(jì)算機(jī)終端(Datapoint 2200)。終端需要能夠表示字母以及終端控制代碼,因此使用 8 位字節(jié)對(duì)其來(lái)說(shuō)很有意義。計(jì)算機(jī)歷史博物館上的 Datapoint 2200 手冊(cè) 在第 7 頁(yè)上說(shuō) Datapoint 2200 支持 ASCII(7 位)和 EBCDIC(8 位)。
為什么 6 位字節(jié)在科學(xué)計(jì)算中更好?
我對(duì)這條 “6 位字節(jié)在科學(xué)計(jì)算中更好” 的評(píng)論很好奇。以下是 Gene Amdahl 的一段采訪(fǎng)摘錄:
我原本希望采用 24 和 48 而非 32 和 64,因?yàn)檫@將為我提供一個(gè)更合理的浮點(diǎn)系統(tǒng)。因?yàn)樵诟↑c(diǎn)運(yùn)算中,使用 32 位字大小時(shí),你必須將指數(shù)保持在 8 位中用于指數(shù)符號(hào),并且要使其在數(shù)字范圍上合理,你必須每次調(diào)整 4 個(gè)位而不是單個(gè)位。因此,這將導(dǎo)致你比使用二進(jìn)制移位更快地失去一些信息。
我完全不理解這條評(píng)論 - 如果你使用 32 位字大小,為什么指數(shù)必須是 8 位?如果你想要,為什么不能使用 9 位或 10 位?但這是我在快速搜索中找到的全部?jī)?nèi)容。
為什么大型機(jī)使用 36 位?
與 6 位字節(jié)相關(guān)的問(wèn)題是:許多大型機(jī)使用 36 位字大小。為什么?在維基百科的 36 位計(jì)算 文章中有一個(gè)很好的解釋?zhuān)?/p>
在計(jì)算機(jī)問(wèn)世之前,即需要高精度科學(xué)和工程運(yùn)算的領(lǐng)域,使用的是十位數(shù)碼電動(dòng)機(jī)械計(jì)算器……這些計(jì)算器每位數(shù)碼均有一個(gè)專(zhuān)用按鍵,操作人員在輸入數(shù)字時(shí)需要用到所有手指,因此,雖然有些專(zhuān)業(yè)計(jì)算器有更多位數(shù)碼,但這種情況是個(gè)實(shí)際的限制。
因此,早期針對(duì)相同市場(chǎng)的二進(jìn)制計(jì)算機(jī)通常使用 36 位字長(zhǎng)度。這足以表示正負(fù)整數(shù)最高精度到十位數(shù)字(最小應(yīng)為 35 位)。
因此,這種 36 位大小似乎是基于
的,它等于 34.2。嗯。
我猜這個(gè)原因是在 50 年代,計(jì)算機(jī)非常昂貴。因此,如果您想要你的計(jì)算機(jī)支持十位十進(jìn)制數(shù)字,你將設(shè)計(jì)它恰好具有足夠的位來(lái)執(zhí)行此操作,而不會(huì)更多。
現(xiàn)在計(jì)算機(jī)更快更便宜,因此,如果您想要出于某種原因表示十位十進(jìn)制數(shù)字,你只需使用 64 位即可 - 浪費(fèi)一點(diǎn)空間通常并不會(huì)有太大問(wèn)題。
還有人提到,一些具有 36 位字大小的計(jì)算機(jī)可以讓你選擇字節(jié)大小 - 根據(jù)上下文,你可以使用 5 或 6 或 7 或 8 位字節(jié)。
原因 2:與二進(jìn)制編碼的十進(jìn)制一起工作
20 世紀(jì) 60 年代,有一種流行的整數(shù)編碼叫做 二進(jìn)制編碼的十進(jìn)制binary-coded decimal(縮寫(xiě)為 BCD),它將每個(gè)十進(jìn)制數(shù)字編碼為 4 位。
例如,如果你想要編碼數(shù)字 1234
,在 BCD 中,它會(huì)是這樣的:
0001 0010 0011 0100
因此,如果你想要能夠輕松地與二進(jìn)制編碼的十進(jìn)制一起工作,你的字節(jié)大小應(yīng)該是 4 位的倍數(shù),比如 8 位!
為什么 BCD 很流行?
這個(gè)整數(shù)表示方法對(duì)我來(lái)說(shuō)真的很奇怪 —— 為什么不用更有效率的二進(jìn)制來(lái)存儲(chǔ)整數(shù)呢?在早期的計(jì)算機(jī)中,效率非常重要!
我最好的猜測(cè)是,早期的計(jì)算機(jī)沒(méi)有像我們現(xiàn)在這樣的顯示器,所以一個(gè)字節(jié)的內(nèi)容被直接映射到開(kāi)關(guān)燈上。
這是來(lái)自維基百科一個(gè)帶有一些亮燈的 IBM 650 顯示器的圖片(CC BY-SA 3.0 許可):
因此,如果你想讓人們能夠相對(duì)容易地從二進(jìn)制表示中讀取十進(jìn)制數(shù),這樣做就更有意義了。我認(rèn)為,今天 BCD 已經(jīng)過(guò)時(shí)了,因?yàn)槲覀儞碛酗@示器,并且我們的計(jì)算機(jī)可以將用二進(jìn)制表示的數(shù)字轉(zhuǎn)換為十進(jìn)制,并顯示它們。
此外,我想知道,“四位nibble”(意為 “4 位”)這個(gè)詞是不是來(lái)自 BCD 的。在 BCD 的上下文中,你經(jīng)常會(huì)引用半個(gè)字節(jié)(因?yàn)槊總€(gè)十進(jìn)制數(shù)字是 4 位)。所以有一個(gè) “4 位” 的詞語(yǔ)是有意義的,人們稱(chēng) 4 個(gè)位為 “四位nibble”。今天,“四位” 對(duì)我來(lái)說(shuō)感覺(jué)像是一個(gè)古老的詞匯,除了作為一個(gè)趣聞我肯定從未使用過(guò)它(它是一個(gè)很有趣的詞?。>S基百科關(guān)于 “四位” 的文章支持了這個(gè)理論:
“四位” 用來(lái)描述存儲(chǔ)在 IBM 大型計(jì)算機(jī)中打包的十進(jìn)制格式(BCD)中數(shù)字的位數(shù)。
還有一個(gè)人提到 BCD 的另一個(gè)原因是 金融計(jì)算。今天,如果你想存儲(chǔ)美元金額,你通常只需使用整數(shù)的分?jǐn)?shù),然后在需要美元部分時(shí)除以 100。這沒(méi)什么大不了的,除法很快。但顯然,在 70 年代,將一個(gè)用二進(jìn)制表示的整數(shù)除以一個(gè) 100 是非常慢的,所以重新設(shè)計(jì)如何表示整數(shù),以避免除以 100 是值得的。
好了,關(guān)于 BCD 就說(shuō)這么多。
原因 3:8 是 2 的冪?
許多人說(shuō),CPU 的字節(jié)大小是 2 的冪次方很重要。我無(wú)法確定這是真的還是假的,而且我對(duì) “計(jì)算機(jī)使用二進(jìn)制,所以 2 的冪次方很好” 這種解釋感到不滿(mǎn)意。這似乎非常合理,但我想深入探討一下。而且從歷史上看,肯定有很多使用字節(jié)大小不是 2 的冪次方的機(jī)器,例如(來(lái)自這個(gè)來(lái)自 Stack Exchange 上復(fù)古計(jì)算版塊的 帖子):
- Cyber 180 大型機(jī)使用 6 位字節(jié)
- Univac 1100/2200 系列使用 36 位字長(zhǎng)
- PDP-8 是一臺(tái) 12 位計(jì)算機(jī)
一些我聽(tīng)到的關(guān)于 2 的冪次方很好的原因我還沒(méi)有理解:
- 一個(gè)單詞中的每個(gè)位都需要一個(gè)總線(xiàn),而你希望總線(xiàn)數(shù)量是 2 的冪次方(為什么?)
- 很多電路邏輯容易針對(duì)分而治之的技術(shù)(我需要一個(gè)例子來(lái)理解這個(gè))
對(duì)我更有意義的原因是:
- 它使設(shè)計(jì)“時(shí)鐘分頻器”更容易,這些分頻器可以測(cè)量“在這條線(xiàn)路上發(fā)送了 8 位”,分別基于減半進(jìn)行操作 - 你可以將 3 個(gè)減半時(shí)鐘分頻器串聯(lián)起來(lái)。Graham Sutherland 告訴我這個(gè),他制作了這個(gè)非常酷的 分頻器模擬器,展示了這些分頻器的工作原理。該網(wǎng)站(Falstad)還有很多其他示例電路,似乎是制作電路模擬器的一個(gè)非??岬姆绞?。
- 如果你有一個(gè)指令可以將字節(jié)中的特定位清零,則如果你的字節(jié)大小為 8(2 的 3 次方),你可以只使用 3 位指令來(lái)指示哪一位。x86 似乎沒(méi)有這樣做,但 Z80 的位測(cè)試指令 是這樣做的。
- 有人提到一些處理器使用 進(jìn)位前瞻加法器,它們按 4 位分組。經(jīng)過(guò)一些快速的谷歌搜索,似乎有各種各樣的加法器電路。
- 位圖:你計(jì)算機(jī)的內(nèi)存被組織成頁(yè)(通常大小為 2 的 n 次方)。它需要跟蹤每一頁(yè)是否空閑。操作系統(tǒng)使用位圖來(lái)完成這項(xiàng)工作,其中每個(gè)位對(duì)應(yīng)一頁(yè),并且根據(jù)頁(yè)面是空閑還是占用,值為 0 或 1。如果你有一個(gè) 9 位的字節(jié),你需要除以 9 來(lái)在位圖中找到你要查找的頁(yè)面。除以 9 的速度比除以 8 慢,因?yàn)槌?2 的冪次方總是最快的。
我可能很糟糕地扭曲了其中一些解釋?zhuān)涸谶@里,我非常超出了自己的知識(shí)領(lǐng)域。我們繼續(xù)前進(jìn)吧。
原因 4:小字節(jié)大小很好
你可能會(huì)想:好吧,如果 8 位字節(jié)比 4 位字節(jié)更好,為什么不繼續(xù)增加字節(jié)大小呢?我們可以有 16 位字節(jié)?。?/p>
有幾個(gè)保持字節(jié)大小較小的理由:
- 它是一種空間浪費(fèi) —— 字節(jié)是你可以尋址的最小單位,如果你的計(jì)算機(jī)存儲(chǔ)了大量的 ASCII 文本(只需要 7 位),那么每個(gè)字符分配 12 或 16 個(gè)位相當(dāng)浪費(fèi),而你可以使用 8 個(gè)位代替。
- 隨著字節(jié)變得越來(lái)越大,你的 CPU 需要變得更復(fù)雜。例如,你需要每個(gè)位線(xiàn)路一條總線(xiàn)線(xiàn)路。因此,我想簡(jiǎn)單總是更好。
我對(duì) CPU 架構(gòu)的理解非常薄弱,所以就說(shuō)到這里吧。對(duì)我來(lái)說(shuō),“這是一種空間浪費(fèi)” 的理由似乎相當(dāng)有說(shuō)服力。
原因 5:兼容性
英特爾 8008(1972 年)是 8080(1974 年)的前身,8080 是第一款 x86 處理器 8086(1976 年)的前身。似乎 8080 和 8086 很受歡迎,這就是我們現(xiàn)代 x86 計(jì)算機(jī)的來(lái)源。
我認(rèn)為這里有一個(gè) “如果它好好的就不要?jiǎng)铀?的問(wèn)題 - 我假設(shè) 8 位字節(jié)功能良好,因此英特爾看不到需要更改設(shè)計(jì)的必要性。如果你保持相同的 8 位字節(jié),那么你可以重復(fù)使用更多指令集。
此外,80 年代左右我們開(kāi)始出現(xiàn)像 TCP 這樣的網(wǎng)絡(luò)協(xié)議,它們使用 8 位字節(jié)(通常稱(chēng)為“八位組octet”),如果你要實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議,你可能希望使用 8 位字節(jié)。
就這些!
在我看來(lái),8 位字節(jié)的主要原因是:
- 很多早期的電腦公司都是美國(guó)的,美國(guó)使用最廣泛的語(yǔ)言是英語(yǔ)
- 這些人希望計(jì)算機(jī)擅長(zhǎng)文本處理
- 較小的字節(jié)大小通常更好
- 7 位是你可以用來(lái)容納所有英文字母和標(biāo)點(diǎn)符號(hào)的最小尺寸
- 8 比 7 更好(因?yàn)樗?2 的冪次方)
- 一旦有得到成功應(yīng)用的受歡迎的 8 位計(jì)算機(jī),你希望保持相同的設(shè)計(jì)以實(shí)現(xiàn)兼容性。
有人指出 這本 1962 年的書(shū) 第 65 頁(yè)談到了 IBM 選擇 8 位字節(jié)的原因,基本上說(shuō)了相同的內(nèi)容:
- 其完整的 256 個(gè)字符的容量被認(rèn)為足以滿(mǎn)足絕大多數(shù)應(yīng)用程序的需要。
- 在該容量范圍內(nèi),單個(gè)字符由單個(gè)字節(jié)表示,因此任何特定記錄的長(zhǎng)度并不因該記錄中字符而異。
- 8 位字節(jié)在存儲(chǔ)空間上是相當(dāng)經(jīng)濟(jì)的。
- 對(duì)于純數(shù)字工作,一個(gè)十進(jìn)制數(shù)字只需要 4 個(gè)比特表示,兩個(gè)這樣的 4 位字節(jié)可以打包成一個(gè) 8 位字節(jié)。盡管這種數(shù)字?jǐn)?shù)據(jù)包裝不是必需的,但為了提高速度和存儲(chǔ)效率,它是一種常見(jiàn)做法。嚴(yán)格來(lái)說(shuō),4 位字節(jié)屬于不同的代碼,但與 4 位及 8 位方案相比,它們的簡(jiǎn)單性導(dǎo)致了更簡(jiǎn)單的機(jī)器設(shè)計(jì)和更清晰的尋址邏輯。
- 4 位和 8 位的字節(jié)大小,作為 2 的冪次方,允許計(jì)算機(jī)設(shè)計(jì)師利用二進(jìn)制尋址和位級(jí)索引的強(qiáng)大功能(見(jiàn)第 4 章和第 5 章)。
總的來(lái)說(shuō),如果你在英語(yǔ)國(guó)家設(shè)計(jì)二進(jìn)制計(jì)算機(jī),選擇 8 位字節(jié)似乎是一個(gè)非常自然的選擇。