摘要:為了更好的理解,我們有必要去先理解什么是匯編,以及編譯器是如何產(chǎn)生匯編的。什么是匯編現(xiàn)在,我們來看看外星人的大腦是如何工作的。這些注釋就是匯編,也稱為符號機器碼。結(jié)束以上的內(nèi)容就是什么是匯編以及它是如何從高級編程語言翻譯過來的。
本文是圖說 WebAssembly 系列文章的第三篇。如果您還未閱讀之前的文章,建議您從第一篇入手。
為了更好的理解 WebAssembly ,我們有必要去先理解什么是匯編(Assembly),以及編譯器是如何產(chǎn)生匯編的。
因為 WebAssembly 在瀏覽器中的作用跟匯編類似,這也是為什么 WebAssembly 稱為 WebAssembly 的原因。
在上一篇文章中,我們提到,我們跟計算機的交流就像是跟外星人的交流。
什么是匯編現(xiàn)在,我們來看看外星人的大腦是如何工作的。類比一下就是,計算機的大腦如何分析并理解我們跟它交流的內(nèi)容。
計算機的大腦中有一塊區(qū)域是專門負(fù)責(zé)思考的,這個思考就是我們所說的加法、減法和其他邏輯操作。
在這個區(qū)域的附近,也有一塊區(qū)域是負(fù)責(zé)短期記憶的。當(dāng)然,相對的,也存在負(fù)責(zé)長期記憶的區(qū)域。
人類給這些區(qū)域分別取了獨特的名字:
負(fù)責(zé)思考的區(qū)域稱為算術(shù)邏輯單元(Arithmetic-logic Unit, ALU)
負(fù)責(zé)短期記憶的區(qū)域稱為寄存器(Register)
負(fù)責(zé)長期記憶的區(qū)域稱為隨機存儲器(Random Access Memory, RAM),也就是內(nèi)存
機器語言中的句子我們把它稱為指令。
當(dāng)這些指令傳給計算機的大腦時會發(fā)生什么呢?
計算機會把指令拆分成不同的部分,每部分都有它們自己獨特的含義。
計算機拆分指令的方式跟計算機大腦內(nèi)部的實現(xiàn)相關(guān)。
舉例來說,一種實現(xiàn)方式可能總是取出最開始的 6 位數(shù)據(jù),并把它送給 ALU。
然后, ALU 根據(jù)這些 0 和 1 發(fā)現(xiàn),原來它的意思是要把兩個整數(shù)加起來。
我們把這 6 位數(shù)據(jù)組成的數(shù)據(jù)塊稱為操作碼(Operation Code),因為告訴 ALU 需要做什么操作。
當(dāng)計算機大腦知道是要做加法操作后,它會把接下來的兩個 3 位數(shù)據(jù)塊取出來,以此來定位是哪兩個數(shù)要相加。取出的兩個 3 位數(shù)據(jù)塊對應(yīng)的就是寄存器的地址,寄存器中保存的數(shù)據(jù)就是待相加的整數(shù)。
注意上圖中我們對機器碼的注釋,根據(jù)這些注釋人類可以很簡單地明白其中發(fā)生了什么。
這些注釋就是匯編,也稱為符號機器碼。它是人類把機器碼變成可直接閱讀的方式。
你可能已經(jīng)發(fā)現(xiàn),匯編跟該機器的機器碼有著相當(dāng)直接的關(guān)系。比如上面說的 6 位、3 位數(shù)據(jù)塊等,換一臺機器可能就變成了 7 位、4 位等。
因此,實際上有很多種不同的匯編,分別對應(yīng)不同的計算機架構(gòu)。當(dāng)你有一臺不同架構(gòu)的計算機時,很可能你就得使用它專有的匯編。
所以,我們的翻譯目標(biāo)不止一個。
它并不僅僅是一種稱為機器碼的語言,而是多種不同的機器碼。這就像不同國家的人們說不同的語言一樣,不同架構(gòu)的計算機也使用不同的機器語言。
在人類和外星人之間的語言翻譯中,你可能要從英語、或者俄語、或者漢語翻譯為外星語 A、或者外星語 B。
編程語言領(lǐng)域也一樣,我們需要把 C、C++、Rust 翻譯為 x86 或者 ARM 架構(gòu)的匯編。
對應(yīng)不同架構(gòu)的計算機,我們需要一種能夠把任何一種高級編程語言翻譯為不同匯編的能力。
其中一種辦法就是創(chuàng)建所有可能的映射關(guān)系,然后實現(xiàn)每種語言到每種匯編的翻譯。
但這種方法是相當(dāng)?shù)托У摹榱颂嵘剩蠖鄶?shù)的編譯器都會在兩者之間新增一個中間層。
這種編譯器會把高級編程語言翻譯成一種介于高級語言和機器碼之間的中間產(chǎn)物,稱為中間代碼(Intermediate Representation,IR)。
這樣的話,編譯器就可以接受任何一種高級語言,然后把它翻譯成中間代碼。
之后,編譯器的另一部分再把中間代碼變成特定架構(gòu)計算機的匯編。
按照中間代碼的生成可以把編譯編譯流程劃分為前端和后端。
編譯器前端接收高級編程語言,輸出中間代碼;編譯器后端則是接收中間代碼,輸出目標(biāo)架構(gòu)的匯編代碼。
以上的內(nèi)容就是什么是匯編以及它是如何從高級編程語言翻譯過來的。
在下一篇文章中,我們將看到 WebAssembly 是如何生成的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94768.html
摘要:性能簡史在年,被創(chuàng)造出來時并不是沖著性能去的。而且在之后的十年發(fā)展中,它的性能一直是很低的。的引入成就了性能提升的一個轉(zhuǎn)折點,其執(zhí)行速度比以往快了之多。性能提升也使得在全新的問題上使用成為可能。現(xiàn)在,極可能是下一個性能轉(zhuǎn)折點。 你可能已經(jīng)聽說 WebAssembly 代碼跑起來非常快。但是你知道這是為什么嗎?在本系列文章中,我們將探究其原因。 何為 WebAssembly WebAss...
摘要:本文是圖說系列文章的第四篇。它們表示一種可以在普遍流行機器上高效使用的指令集合。這是因為是一種稱為堆棧機器。盡管是根據(jù)堆棧機器來設(shè)計的,但是這并不是它在真實物理機器上工作的方式。這些內(nèi)容稱為段。 本文是圖說 WebAssembly 系列文章的第四篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 WebAssembly 是一種使得除 JavaScript 以外的編程語言也能運行在網(wǎng)頁上...
摘要:現(xiàn)狀年月日,主流的四大瀏覽器達(dá)成了共識并宣布的最小可行產(chǎn)品已經(jīng)完成。更快的函數(shù)調(diào)用當(dāng)前,在中調(diào)用函數(shù)比想象的要慢。直接操作目前,沒有任何方式能夠操作。這就導(dǎo)致了部分應(yīng)用可能會因此而推遲發(fā)布時間。結(jié)束現(xiàn)如今已經(jīng)相當(dāng)快速。 本文是圖說 WebAssembly 系列文章的最后一篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 現(xiàn)狀 2017 年 2 月 28 日,主流的四大瀏覽器達(dá)成了共識...
摘要:如果對沒概念,建議先讀這里中文文章。理解什么是匯編,以及編譯器如何生成它,對于理解是很有幫助的。舉個例子,大腦會將指令最開始的比特通過管道送到中。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c55a3ba6d8a07e449fdd23 英文原文:A crash course i...
摘要:本文是圖說系列文章的第五篇。這樣的話,使用的開發(fā)者也不需要做任何適配,但是它們卻能獲得更高性能。該圖并不是用來準(zhǔn)確的衡量其性能的。運行編寫出高性能的代碼是可能的。這種清理工作由引擎自動進行,稱為垃圾回收。 本文是圖說 WebAssembly 系列文章的第五篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 在上一篇文章中,我們說到了使用 WebAssembly 和 JavaScript...
閱讀 2880·2021-11-11 10:58
閱讀 1937·2021-10-11 10:59
閱讀 3501·2019-08-29 16:23
閱讀 2350·2019-08-29 11:11
閱讀 2797·2019-08-28 17:59
閱讀 3849·2019-08-27 10:56
閱讀 2094·2019-08-23 18:37
閱讀 3124·2019-08-23 16:53