{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

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

DevYKDevYK 回答10 收藏1
收藏問題

10條回答

forsigner

forsigner

回答于2022-06-22 19:55

首先上結(jié)論:

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

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

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

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

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

那么為什么要發(fā)明高級編程語言呢?因為:

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

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

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

2. 編譯是什么?

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

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

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

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

3. 解釋是什么?

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

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

4. 一些直接面向高級語言的機器

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

評論0 贊同0
  •  加載中...
0x584a

0x584a

回答于2022-06-22 19:55

我來回答這個問題,其實際情況并不是這樣的,首先要明確的是,我們不管用什么語言編寫程序最后都要生成機器能夠識別的語言。我以自已最為熟悉的編程語言C語言和匯編語言為例來說明吧!



我們知道計算機是不能直接識別C語言或匯編語言的,要經(jīng)過編譯軟件把這些人類很容易讀懂的語言生成計算機能夠“識讀”的語言,我們稱之為“機器語言”。機器語言都是以“1”和“0”組成的,我們?nèi)祟惡茈y讀懂!



因此,在用編程軟件編寫程序時,編程軟件都有把源程序編譯成目標文件的功能,比如我們常用的keil軟件,只要通過簡單的設(shè)置便會自動生成后綴為.Hex的目標文件,我們要把這個文件通過下載軟件下載到計算機中就可以了!不需要相互轉(zhuǎn)換。我們用匯編寫程序也是一樣的方法。不過所生成的目標文件其格式可以是.Hex文件或者.bin文件,只不過前者以十六進制形式出現(xiàn)而后者以二進制形式出現(xiàn)!我們可以類推出其它編程語言都應該大同小異。



當然,最后我們可以使C語言和匯編語言相互轉(zhuǎn)化的,我們稱為反匯編!這種方法用的場合較少!以上是我對這個問題的回答!歡迎朋友們參與討論這個話題。敬請觀注電子及工控技術(shù)!

評論0 贊同0
  •  加載中...
Karuru

Karuru

回答于2022-06-22 19:55

用C寫的程序才會被編譯成匯編語言,再由匯編器翻譯成機器碼。是這樣的,要搞清楚一點,只有機器語言才能和底層硬件打交道,也就是每種高級語言的最終執(zhí)行代碼都是機器碼,至于中間形式的目標代碼則有很多種,像Java語言的代碼被編譯成一種叫字節(jié)碼的中間代碼,然后由相應平臺的JVM翻譯成機器碼執(zhí)行,還有的像JavaScript, Python這種解釋型的語言根本就不經(jīng)過編譯,而是逐條代碼直接翻譯成機器碼再執(zhí)行。很多時候說C語言是最基礎(chǔ)的語言并不是說所有語言都要往C語言上走一遍,一部分原因是因為C語言的特性使得它適合編寫一些語言的底層支持模塊,還有就是操作系統(tǒng)是由C語言編寫的,應用程序與操作系統(tǒng)交互需要調(diào)用一些C寫的模塊。總之,你完全可以自己發(fā)明一種語言,你定義好語法規(guī)則,再寫一個針對這種需要的編譯器,能翻譯成平臺兼容的機器語言,那樣就可以執(zhí)行了。所以不存在什么語言都要轉(zhuǎn)成C這一說

評論0 贊同0
  •  加載中...
FWHeart

FWHeart

回答于2022-06-22 19:55

java是編譯成軟指令,運行時由jvm就是java虛擬機翻譯成本地硬件指令。而c語言編譯后是直接的機器指令。

因此,在不同架構(gòu)CPU和操作系統(tǒng)上實現(xiàn)不同的jvm就可以實現(xiàn)java庫的跨平臺使用。就是說只要你的平臺能安裝jvm就能運行java程序。

匯編語言是文本化的機器指令,任何語言一般不編譯成匯編語言。

而匯編語言程序,編譯之后才是機器指令。

機器指令都是二進制存儲的,具體每條指令形態(tài)就像:指令id+參數(shù),參數(shù)就像是寄存器、立即數(shù)這樣的。指令id就是某條指令唯一的標識。

指令id一般由CPU廠商給出列表,說明哪個數(shù)字對應于哪個指令。

評論0 贊同0
  •  加載中...
mingde

mingde

回答于2022-06-22 19:55

  • C是最接近CPU指令集的高級語言,幾乎沒有多余的東西。
  • 小到玩具、大到超級計算機,各種CPU的指令集在本質(zhì)上差不多。

所以很多涉及底層的東西是用C寫的,既有較高性能,又相對容易移植。

比如Python是用C語言寫的,但是Python程序在運行時不會被編譯成C語言。

C++是給C語言添加了面向?qū)ο蟮母拍睢?/p>

評論0 贊同0
  •  加載中...
antz

antz

回答于2022-06-22 19:55

實際情況并不是這樣的。

我們來一條條的看吧:

1.編程語言并不是都要編譯成C,這個說法不知道是誰提出來的。C語言和java,python一樣,也是一種高級語言。但是C語言有個優(yōu)勢,就是可以嵌套匯編,實現(xiàn)底層交互。

2.很多人存在一個誤區(qū),匯編語言就是最底層的語言了,其實計算機還是不認識匯編是個什么東西, 因為計算機只能識別一種語言,那就是機器語言,全都是0和1這樣的二進制數(shù)。比方說MOV AX,BX,這條匯編的意思是寄存器將BX的內(nèi)容轉(zhuǎn)移到AX中,對應機器語言的1000100111011000,非常復雜。可以這么理解:匯編語言實際上是機器指令的一種簡寫形勢。

可以看看下圖,做一個簡單的加法運算,分別用C語言,匯編和機器語言表示,各位就能理解高級語言的好處了。

無論是C還是其他什么語言,最終的目的都是實現(xiàn)某種功能,而這離不開硬件的支持,所以歸根結(jié)底,還是要從程序和硬件的關(guān)系說起。

硬件,程序和編譯器之間的關(guān)系

在計算機中存在著大量的電子元件,電路就兩種情況:開和關(guān),這兩種狀態(tài)分別用1和0來表示,也就是眾所周知的二進制, 在計算機中,所有的運算都是以二進制的形式進行的,比方說3+4,在CPU中的表現(xiàn)形式為00110000+01000000,如果是負數(shù)運算或浮點運算的話還會更復雜一些,這里不再累述。

通過0和1決定電路狀態(tài),那么操作者是通過編程語言操作硬件的呢?這里編譯器的作用就體現(xiàn)出來了。

編譯器就像是一個翻譯一樣,也就任人們口中俗稱的編程軟件。其實用更專業(yè)的話來說,編譯器實際上是IDE(開發(fā)集成環(huán)境)中的一個工具。

雖然大家可能在操作中感受不是那么強烈,但如果你在windows控制臺下用javac編譯過java代碼,或者你在linux的命令行下編譯過程序,這個時候我們就直接使用了編譯器。

最后提一點,并不是所有的語言都會被編譯器直接編譯成機器語言。C語言是一個比較特殊的語言,因為他是直接可以直接編譯為匯編再編譯為機器碼的,這也是C語言可以和底層打交道的主要原因。像我們熟知的java,它會把源碼先轉(zhuǎn)換成一種叫做字節(jié)碼的東西,通過JVM虛擬機將其轉(zhuǎn)換為機器碼。所以說,編譯器的類型有很多,作用不能一概而論。

評論0 贊同0
  •  加載中...
levinit

levinit

回答于2022-06-22 19:55

我認為只是一小部分很low的高級語言需要C語言中轉(zhuǎn)編繹。大多數(shù)PC機語言直接編繹成宏匯編語言或者更直接的機器語言的形式執(zhí)行;而更低級的單片機語言,無論是C還是匯編,都直接編繹為機器碼,直接可被設(shè)備識別。



像高級的C++語言,如果進行調(diào)試,基本以宏匯編語言的形式出現(xiàn),VC,VS等基本如此。當然,要讓機器識別,最后必然是機器碼。

也有很多很low的高級語言,必須先轉(zhuǎn)為C,再執(zhí)行。這種語言效率都很低,可以理解為2次開發(fā)。這也是為什么很多小公司、個人都可以做編繹器,小范圍、特定場合用用可以。

對于單片機編程,簡單很多。這也是為什么單片機編繹程序眾多的主要原因。特別是最low的51系到8位程序的編繹,初學者都可以嘗試做。當然做到極致也是不容易的。




編繹語言,要做到微軟MS的VC,VS的水平,估計需要幾十年的努力,同時還要對處理器的硬件結(jié)構(gòu)搞的很明白。如果相關(guān)的知名處理器廠商,如Intel,ARM架構(gòu)等廠商不跟你合作,估計永遠也做不出來。



(圖片來源于網(wǎng)絡(luò),僅為示意)

評論0 贊同0
  •  加載中...
Caicloud

Caicloud

回答于2022-06-22 19:55

首先這種認識是不正確的,所有的編程語言要轉(zhuǎn)化成機器語言然后才去運行,肯定不會轉(zhuǎn)化成C語言去運行,因為C語言還是要匯總成機器語言去運行。從類別上講編程語言主要分成兩種,一種在運行之前提前生成二進制文件,機器上電直接運行就可以了;另外一種是一邊運行一邊編譯最終的結(jié)果也是轉(zhuǎn)化成二進制文件,這樣機器才能準確的識別出來。只要是遵循馮諾依曼的架構(gòu)都要轉(zhuǎn)化成二進制的文件讓機器去運轉(zhuǎn)執(zhí)行,可能在未來量子計算機發(fā)展起來架構(gòu)會有所改變,起碼在很長的一段時間內(nèi)還會繼續(xù)這種架構(gòu)存在。

編程語言如何實現(xiàn)跨平臺運行

就拿典型的編程語言Java作為例子來闡述,java屬于典型的跨平臺語言,跨平臺的語言編程的好處是在任何一個操作系統(tǒng)上完成代碼編寫之后就可以在任何平臺來運行,一般開發(fā)java都在windows平臺上開發(fā),但真正在部署的時候既可以在linux服務(wù)器上運行,也可以在windows服務(wù)器上運行。但在實際運行過程中還是要遵循各自的指令體系,做這個時期的關(guān)鍵點就在于java的虛擬機,所以在安裝運行環(huán)境的時候,不同的操作系統(tǒng)的版本是不一致的,java在編譯的時候都會轉(zhuǎn)化成字節(jié)碼,字節(jié)碼在不同操作系統(tǒng)的虛擬機都可以運行,虛擬機里面會把主流的操作系統(tǒng)指令都分別集成進去,也就是java版本在更迭的時候除了增加基本語法之外,還要在修改不同的操作系統(tǒng)底層實現(xiàn),這樣子才能真正做到跨平臺運行。

跨平臺在嵌入式領(lǐng)域使用的比較多,如果用C++開發(fā)的代碼可以在宿主機上直接運行,調(diào)試完畢了然后再燒錄到嵌入式板卡里面去運行,畢竟直接在PC的linux上調(diào)試代碼,要比直接在板子里調(diào)試要方便的多,這就是跨平臺的好處,除了方便開發(fā)代碼還極大方便調(diào)試。

C語言在編程語言中的地位

雖然不是每種編程語言都要轉(zhuǎn)化成C語言再去運行,但很多編程語言的底層都是C語言來實現(xiàn)的,這是真實存在的事實,但還是有很多人覺得C語言已經(jīng)過時了,起碼從招聘的簡章C語言的比例在下降,這個主要原因是國內(nèi)程序員大部分都做著互聯(lián)網(wǎng)的工作,互聯(lián)網(wǎng)主要從事應用級開發(fā)比較多,所以一些集成化編程語言在國內(nèi)比較能夠吃得開,像python,php,Java在國內(nèi)都有著良好的生態(tài)基礎(chǔ),這是國內(nèi)軟件環(huán)境決定的。

C語言在很多基礎(chǔ)領(lǐng)域還是首選的編程語言,語法簡潔但靈活多樣,在實際功能的的時候效率高性能強,在很多領(lǐng)域還是第一編程語言,主要在通訊行業(yè)以及嵌入式領(lǐng)域還是C語言的主戰(zhàn)場。非常流行的人工智能在底層很多功能實現(xiàn)也是基于C語言完成,只不過C語言的角色從前臺走向了幕后,但重要性并沒有因此而降低,即使選擇C語言作為入門的編程語言,在基礎(chǔ)過硬的情況下照樣能找到合適的工作,不要迷信C語言已經(jīng)不行了之類的話語。

對于編程語言的編譯原理以及運行過程還是要多去涉獵,如果純正的高級編程語言可能很少去關(guān)系這些個原理,都是去操心如何架構(gòu)等方面的問題,底層如何實現(xiàn)功能對于上層調(diào)用方式都有決定性因素,盡管很多人不推薦第一門編程語言選擇C語言,但從個人的角度出發(fā),還是建議C語言作為入門編程語言,即使不是從事這方面的工作,起碼在從知識體系上還是有很大的好處,希望能幫到你。

評論0 贊同0
  •  加載中...
legendaryedu

legendaryedu

回答于2022-06-22 19:55

你可能聽錯了 大部分編程語言是用C開發(fā)的 例如大行其道的Python和Java 但是并不是說這些語言一定會編譯為C 往往是編譯成虛擬機指令或者編譯成機器語言 注意機器語言不是匯編語言 機器語言是二進制可以直接執(zhí)行

以Python為例 Python本身的編譯器會把源代碼編譯為虛擬機的指令 再用虛擬機去執(zhí)行這些指令 Python的一大優(yōu)勢是很容易呼叫C規(guī)格的共享函數(shù)庫 或者說很容易用C來擴展或者加速Python

單純就虛擬機來比較 Java虛擬機更優(yōu)秀 很多新技術(shù) 例如JIT編譯技術(shù)

不過Python+C的組合還是很有市場 特別是人工智能和工業(yè)控制 還有自動化部署和測試自動化

如果你想了解虛擬機 SQLite虛擬機相對比較簡單 雖然是個數(shù)據(jù)庫虛擬機 不過文檔比較容易消化 代碼也就一個C文件

評論0 贊同0
  •  加載中...
stackfing

stackfing

回答于2022-06-22 19:55

計算機能夠識別的語言只有機器語言,也就是0-1代碼,咱們可以直接編寫0-1代碼讓計算機執(zhí)行程序,沒有問題。但是,這就增加我們學習編程的學習成本和編程成本,為此咱們的前輩們開發(fā)了編程語言,最早的是匯編語言,通過編譯器將匯編語言變成機器語言;另外一種是高級語言,像Python、java、C++、MATLAB、VB等等。高級語言接近于人類語言,學習成本、編程成本低,匯編語言學習成本較高,目前除了對計算速度要求極其嚴格的環(huán)境,一般不采用匯編語言。

因此,高級語言和匯編語言不是遞進的關(guān)系,即高級語言不會編譯成匯編語言,他們都會變成機器語言(即0-1代碼),供計算機硬件識別并驅(qū)動計算機完成相關(guān)功能。

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<