色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

所有的編程語言最后會(huì)編譯成C,再編譯成匯編,最后落實(shí)到硬件操作上嗎?

首先上結(jié)論:

(1)不是所有的編程語言都要先編譯成C

(2)甚至有編程語言連編譯成匯編這一步都跳過了。

(3)不是所有的編程語言都需要編譯,有的是純解釋型語言

1.編程語言到硬件執(zhí)行之間到底發(fā)生了什么?

硬件執(zhí)行的本質(zhì)就是一堆電子元件的“開關(guān)”動(dòng)作,開、關(guān)兩種狀態(tài)可以用二進(jìn)制的1和0來表示,這樣整個(gè)硬件的執(zhí)行就和二進(jìn)制對應(yīng)了起來。硬件是無法理解上層的高級(jí)編程語言的(比如Java、C++、C,、C#、Javascript……)。

那么為什么要發(fā)明高級(jí)編程語言呢?因?yàn)椋?/p>

(1)人類直接與二進(jìn)制打交道,比較費(fèi)力,與自然語言相隔太遠(yuǎn),不利于相互交流和協(xié)作,從而很難誕生高效的大規(guī)模團(tuán)隊(duì)協(xié)作來完成超復(fù)雜規(guī)模的軟件設(shè)計(jì)、開發(fā)。

(2)每種硬件平臺(tái)對應(yīng)的二進(jìn)制設(shè)計(jì)都不太相同,如果直接與二進(jìn)制打交道,那么就要不斷地重復(fù)造輪子,不利于跨平臺(tái)的設(shè)計(jì)和協(xié)作。

既然需要高級(jí)編程語言,而硬件又只認(rèn)識(shí)二進(jìn)制,那么怎么去解決這兩者之間的鴻溝呢?答案就是:編譯和解釋。

2.編譯是什么?

你可以把編譯類比成一次性翻譯完整的文學(xué)著作。相當(dāng)于把用高級(jí)編程語言編寫的源代碼一次性轉(zhuǎn)換成二進(jìn)制。

人們擺脫二進(jìn)制的第一步嘗試是設(shè)計(jì)匯編語言和開發(fā)匯編器。每一條匯編指令與對應(yīng)的二進(jìn)制是一一對應(yīng)的,換言之,匯編語言只不過是二進(jìn)制的一種助記方式。

在有了匯編器之后,可以在匯編語言之上,再來設(shè)計(jì)高級(jí)編程語言和高級(jí)語言的編譯器,后者可以通過匯編器轉(zhuǎn)換成二進(jìn)制。通過這樣的不斷遞歸的設(shè)計(jì)、開發(fā)過程,就可以設(shè)計(jì)出非常高級(jí)的編程語言。具體的原理分析可以參見筆者的專欄《華為方舟編譯器源代碼分析》的《先有蛋還是先有雞:編譯器本身是怎么被編譯出來的?》。

只要有能轉(zhuǎn)換出最終二進(jìn)制的高級(jí)語言編譯器,那么其實(shí)是不需要有顯式的匯編器和匯編語言的。

3.解釋是什么?

解釋相對于同聲傳譯。Javascript這些腳本語言,大部分都是采用解釋器來做翻譯。它并不需要像編譯那樣,一次性把所有的源代碼轉(zhuǎn)換成最終的二進(jìn)制。而是在運(yùn)行的過程中,一邊翻譯一邊執(zhí)行。與上面設(shè)計(jì)高級(jí)編程語言的編譯器的方式一樣,高級(jí)語言的計(jì)時(shí)器也可以通過遞歸的方式設(shè)計(jì)、開發(fā)。到最后,只要有能轉(zhuǎn)換出最終二進(jìn)制的高級(jí)語言解釋器,那么其實(shí)是不需要有顯式的匯編器和匯編語言的。

關(guān)于解釋器的具體原理,以及加強(qiáng)型算法——如JIT,可以參見筆者的專欄《華為方舟編譯器源代碼分析》的《干掉Java虛擬機(jī)來提升應(yīng)用程序性能:只有華為想到了嗎?》。

4.一些直接面向高級(jí)語言的機(jī)器

歷史上還專門開發(fā)過面向高級(jí)語言的機(jī)器,中間是不需要匯編語言過渡的。比如大名鼎鼎的LISP語言。曾經(jīng)人們專門為LISP語言開發(fā)過對應(yīng)的機(jī)器。但是最終的商業(yè)成果并不理想,主要是當(dāng)時(shí)一些條件還不成熟。