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

幻翠


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

編程語言如何實現跨平臺運行

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

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

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

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

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

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


大學生編程指南


首先上結論:

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

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

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

1. 編程語言到硬件執行之間到底發生了什麼?

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

那麼為什麼要發明高級編程語言呢?因為:

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

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

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

2. 編譯是什麼?

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

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

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

只要有能轉換出最終二進制的高級語言編譯器,那麼其實是不需要有顯式的彙編器和彙編語言的。

3. 解釋是什麼?

解釋相對於同聲傳譯。Javascript這些腳本語言,大部分都是採用解釋器來做翻譯。它並不需要像編譯那樣,一次性把所有的源代碼轉換成最終的二進制。而是在運行的過程中,一邊翻譯一邊執行。與上面設計高級編程語言的編譯器的方式一樣,高級語言的計時器也可以通過遞歸的方式設計、開發。到最後,只要有能轉換出最終二進制的高級語言解釋器,那麼其實是不需要有顯式的彙編器和彙編語言的。

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

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

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


周林ZhouLin


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


AncleDrew


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

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


AI與Python


不一定,和c語言同級的語言差不多是被編譯成彙編語言,比如rust,go等語言都是和c語言同級的。


程序猿創業筆記


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

因此,在不同架構CPU和操作系統上實現不同的jvm就可以實現java庫的跨平臺使用。就是說只要你的平臺能安裝jvm就能運行java程序。

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

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

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

指令id一般由CPU廠商給出列表,說明哪個數字對應於哪個指令。


三袋大菠蘿


並不是所有的編程語言會編譯成C語言,再編譯成彙編語言或者機器指令。

C語言可以是一種中間語言,但還有很多其他中間語言,如三地址代碼、P代碼、P-machine堆棧指令、JVM的字節指令等等,它們比C語言更接近機器指令,是很多語言編譯器的中間代碼。


柳牧山


概念錯誤。所有高級語言,包括C,Java,VB,VC艹,等都需要編譯器轉成二進制機器碼才能在計算機上運行,因計算機只認機器碼(因硬件關係)。當然有些機器不是直接轉成機器碼,而是先轉成彙編碼,再轉成機器碼,均可。


YingBai910


不同的語言編譯的結果不同,有的編譯成中間語言再解釋執行,也有的乾脆就不編譯直接k解釋執行。懶得細說了,自己去了解。


廣州何劍鋒


現代編譯器的做法是把語言編譯成中間語言,但這中間語言並不是c,從來沒聽說過一款主流的語言是先編譯成c再到彙編。


分享到:


相關文章: