摘要:如果對沒概念,建議先讀這里中文文章。理解什么是匯編,以及編譯器如何生成它,對于理解是很有幫助的。舉個例子,大腦會將指令最開始的比特通過管道送到中。
作者:Lin Clark
編譯:胡子大哈
翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c55a3ba6d8a07e449fdd23
英文原文:A crash course in assembly
轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息
本文是關(guān)于 WebAssembly 系列的第三篇文章。如果你沒有讀先前文章的話,建議先讀這里。如果對 WebAssembly 沒概念,建議先讀這里(中文文章)。
理解什么是匯編,以及編譯器如何生成它,對于理解 WebAssembly 是很有幫助的。
在上一篇關(guān)于 JIT 的文章中,我介紹了和計算機打交道,就像同外星人打交道一樣。
現(xiàn)在來思考一下“外星人”的大腦是如何工作的——機器的“大腦”是如何對我們輸入給它的內(nèi)容進行分析和理解的。
“大腦”中,有一部分負責思考——處理加法、減法或者邏輯運算。還有其他的部分分別負責短暫記憶和長期記憶的。
這些不同的部分都有自己的名字:
負責思考的部分叫做算數(shù)邏輯單元(ALU)
寄存器提供短暫記憶功能
隨機存取存儲器(RAM)提供長期記憶功能
機器代碼中的語句稱作指令。
那么在指令進入“大腦”以后都發(fā)生了什么呢?它們會被切分為不同的部分傳送到不同的單元進行處理。
“大腦”切分指令通過不同連接線路進行。舉個例子,“大腦”會將指令最開始的 6 比特通過管道送到 ALU 中。而 ALU 會通過 0 和 1 的位置來決定對兩個數(shù)做加法。
這串 01 串就叫做“操作碼”,它告訴了 ALU 要執(zhí)行什么樣的操作。
然后“大腦”會取后面兩個連續(xù)的 3 比特 01 串來確定把哪兩個數(shù)加到一起,而這 3 比特指的是寄存器的地址。
注意看上面機器碼的注釋:“ADD R1 R2”,這對于人類來講很容易理解其含義。這就是匯編,也叫符號機器碼,它使人類也能看懂機器代碼的含義。
可以看到匯編和這臺機器的機器碼之間有直接的映射關(guān)系。正是因為如此,擁有不同機器結(jié)構(gòu)的計算機會有不同的匯編系統(tǒng)。如果你有一個機器,它有自己的內(nèi)部結(jié)構(gòu),那么它就需要它所獨有的匯編語言。
從上面的分析可以知道我們進行機器碼的翻譯并不是只有一種,不同的機器有不同的機器碼,就像我們?nèi)祟愐舱f各種各樣的語言一樣,機器也“說”不同的語言。
人類和外星人之間的語言翻譯,可能會從英語、德語或中文翻譯到外星語 A 或者外星語 B。而在程序的世界里,則是從 C、C++ 或者 JAVA 翻譯到 x86 或者 ARM。
你想要從任意一個高級語言翻譯到眾多匯編語言中的一種(依賴機器內(nèi)部結(jié)構(gòu)),其中一種方式是創(chuàng)建不同的翻譯器來完成各種高級語言到匯編的映射。
這種翻譯的效率實在太低了。為了解決這個問題,大多數(shù)編譯器都會在中間多加一層。它會把高級語言翻譯到一個低層,而這個低層又沒有低到機器碼這個層級。這就是中間代碼( intermediate representation,IR)。
這就是說編譯器會把高級語言翻譯到 IR 語言,而編譯器另外的部分再把 IR 語言編譯成特定目標結(jié)構(gòu)的可執(zhí)行代碼。
重新總結(jié)一下:編譯器的前端把高級語言翻譯到 IR,編譯器的后端把 IR 翻譯成目標機器的匯編代碼。
總結(jié)本文介紹了什么是匯編以及編譯器是如何把高級語言翻譯成匯編語言的,在下一篇文章中,我們來介紹 WebAssembly 的工作原理。
我最近正在寫一本《React.js 小書》,對 React.js 感興趣的童鞋,歡迎指點。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86930.html
摘要:為了更好的理解,我們有必要去先理解什么是匯編,以及編譯器是如何產(chǎn)生匯編的。什么是匯編現(xiàn)在,我們來看看外星人的大腦是如何工作的。這些注釋就是匯編,也稱為符號機器碼。結(jié)束以上的內(nèi)容就是什么是匯編以及它是如何從高級編程語言翻譯過來的。 本文是圖說 WebAssembly 系列文章的第三篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 為了更好的理解 WebAssembly ,我們有必要去先...
摘要:但是它們其實并不是二選一的關(guān)系并不是只能用或者。正因為如此,指令有時也被稱為虛擬指令。這是因為是采用基于棧的虛擬機的機制。聲明模塊的全局變量。。下文預(yù)告現(xiàn)在你已經(jīng)了解了模塊的工作原理,下面將會介紹為什么運行的更快。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c77641a6d8...
摘要:但是為什么執(zhí)行的更快呢在這個系列文章中,我會為你解釋這一點。所以當人們說更快的時候,一般來講是與相比而言的。被人們廣為傳播的性能大戰(zhàn)在年打響。性能的提升使得的應(yīng)用范圍得到很大的擴展?,F(xiàn)在通過,我們很有可能正處于第二個拐點。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce8036...
摘要:并且于年月日,四個主要的瀏覽器一致同意宣布的版本已經(jīng)完成,即將推出一個瀏覽器可以搭載的穩(wěn)定版本。因此本文著重介紹為什么比更快。本文主要表達的是為什么應(yīng)該是更快的。則不同,它是由幾大主要的瀏覽器廠商共同設(shè)計的。 作者:Alon Zakai 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...
摘要:現(xiàn)在,我們將會剖析的工作原理,而最重要的是它和在性能方面的比對加載時間,執(zhí)行速度,垃圾回收,內(nèi)存使用,平臺訪問,調(diào)試,多線程以及可移植性。目前,是專門圍繞和的使用場景設(shè)計的。目前不支持多線程。 原文請查閱這里,略有改動,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第六章...
閱讀 984·2021-11-24 09:39
閱讀 2185·2021-11-16 11:54
閱讀 2077·2021-11-11 17:22
閱讀 2372·2021-09-30 09:55
閱讀 3591·2021-08-12 13:22
閱讀 1626·2019-08-30 15:44
閱讀 1168·2019-08-29 12:12
閱讀 3263·2019-08-27 10:58