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