回覆列表
  • 1 # 無處不在2

    那咋可能呢,原始碼變為可執行程式碼基本分兩種,一種叫解釋執行,類似於同聲傳譯,一種叫編譯執行,類似於翻譯,兩種各有利弊,有的語言結合兩種方式的特點,比如java等使用虛擬機器的語言,編譯之後生成的是虛擬機器指令,然後由虛擬機器再解釋成宿主機指令執行。

  • 2 # 火山口

    1、編譯器是高階語言程式碼和執行平臺之間的轉換工具。它的使命,讓執行平臺能夠理解原始碼的意圖。2、給編譯器輸入程式程式碼編譯器輸出的結果是什麼,這取決於執行平臺的性質。3、如果你的程式程式碼打算在某個作業系統上執行(例如安卓或者windows),那麼編譯器就會將你的程式程式碼解釋成(編譯)該作業系統所能識別的指令或函式程式碼。然後由作業系統根據要求,將編結果再解釋成硬體機器碼去操作硬體。安卓的情況要更復雜一點,中間的二道販子太多了。。。4、如果你的程式程式碼打算直接執行在某個CPU硬體平臺上(例如51或者ARM微控制器),那麼編譯器會你的程式碼直接解釋(編譯)成該硬體平臺所能識別的指令程式碼(硬體機器碼),然後存放在CPU能夠找到的某個儲存空間裡,CPU上電之後,就會自動去執行那些指令程式碼。5、原始碼是不是都會被解釋(編譯)成C或者彙編程式碼(機器碼)?肯定不是啊。沒有人規定作業系統一定要能夠直接識別機器碼或者C程式碼呀,比如安卓就不認識機器碼。你把程式解釋成運作平臺不能識別的語言,那不就是對牛彈琴?

  • 3 # 散居獵人

    直接編譯成機器指令或中間程式碼以便於最佳化和移植。沒有任何必要先弄成c再弄成彙編最後再弄成機器指令!還有一種是解釋執行,不需要編譯。

  • 4 # 星雲鶴峰

    這個問題,應該源自舊版的教科書,這個結論在特定時期,有上下文環境,這句話是有道理的。但是話確實被摘錄出來說,就覺得說得太滿,易招致反駁。

    首先,分清兩個概念,一個是編譯原理,一個編譯實現,很多人沒分清編譯原理和編譯實現。

    下面針對一個語系的來說說,因為的確有不是基於C實現的編譯器,只是市場佔比實在太低。

    今年,排名前十的分別是:C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL和R。

    十足的C語言系統的大家族,即使Go說已經實現了自舉,但是早期也是基於C來進行編譯實現的語言,換句話來說,沒有C,根本沒有Go,從編譯原理的角度,自舉不過是“編譯實現的高效率而已”。

    簡單來說,一個系的其他語言在實現編譯器的時候,都是編譯為C或者C至上搭建的語言來實現的。但是在編譯實現上,並不需要直接出現C語言的語句,甚至說,C語言在編譯為彙編時,並沒有出現彙編的指令的ASCII碼,而是出現01指令碼,為了方便查閱編譯結果是否正確,會用匯編的編譯器來對機器碼進行反編譯,看看產生的指令是否正確,但是,從編譯原理的角度,C的確是被編譯為彙編了。所以,首先要分清楚,編譯原理和編譯實現。

    太多的問題,我一下子回答不完。舉例說JAVA,Java是在JVM上執行的,從現象看,JAVA指令被JVM直接執行了,有軟體JVM也有硬體實現的JVM,但是JVM就是一種編譯實現機制,JVM本身就是一個虛擬機器,在不同平臺根據機器的不同實現不同的JVM虛擬機器,就能令JAVA一份程式碼,跨平臺執行,不需要更改程式碼。這種JVM虛擬機器本身就是一個特殊的編譯器,透過這個特殊的編譯器,產生了最終的機器碼(不要說彙編,會引起誤會),這個編譯器如何實現透過編譯原理來實現的呢?也是透過編譯為C,編譯為機器碼來實現的。

    再說說行編譯,行編譯是需要執行指定的語句時,再去編譯01碼,交給機器來執行,也叫解釋性語言,並沒有提前進行編譯的動作,並且不需要對別的不需要執行的語句進行編譯,這是最大的區別。需要執行時再對指定的語句進行編譯,其實有可以認為是一種特殊的編譯過程。這種過程也能追溯到C基礎上搭建起來的語言體系。

    “幾乎”所有的程式語言最後會編譯成C,再編譯成彙編,最後落實到硬體操作,在編譯原理上並沒有什麼大毛病,不要與編譯實現混為一談。JVM和行編譯的解釋性語言都只不過是特殊的編譯器實現形式。

    C語言的地位至今還是無可替代,Dennis Ritchie的成就可比肩喬布斯

  • 5 # etl25779526

    我給總結吧!很多人都說對了!絕大部分語言都是由一個所謂直譯器,直接到機器語言。只是大多是按照c語言的習慣規範的,只是錯覺而已。舉例:玩微控制器的時候,使用c和彙編。都能生成程式碼!大小不一樣。

  • 6 # 噴子來啦好熱鬧

    早期的程式語言一般是編譯、連線成指定構架的機器碼,自從有了llvm,就變了,其它基於llvm的編譯器,先編譯成IL中間語言,然後由llvm編譯成指定構架的機器語言。

    另外java,C#語言是也是編譯成IL中間語言,然後在執行的時候編譯成本機可執行的機器語言!

    指令碼語言早期是解釋執行從不編譯,後來加入JIT即時編譯模組,可以在執行的時候編譯成機器語言。

    IL中間語言:一種彙編類似的語言,更高階一點,可以在最終編譯為本地機器語言

    JIT:一種即時編譯系統,執行時編譯!

  • 7 # 覆水難收77313204

    不會編譯成c,都是編譯成硬體語言,就是二進位制碼。彙編在某種程度上可以看成是機器語言的一種更容易閱讀的表達方式。

  • 8 # AncleDrew

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

  • 9 # AI與Python

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

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

  • 10 # 迷城人生

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

  • 11 # 三袋大菠蘿

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

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

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

    而組合語言程式,編譯之後才是機器指令。

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

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

  • 12 # 小x全棧工程師

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

  • 13 # 柳牧山

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

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

  • 14 # 周林ZhouLin

    首先上結論:

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

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

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

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

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

    那麼為什麼要發明高階程式語言呢?因為:

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

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

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

    2. 編譯是什麼?

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

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

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

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

    3. 解釋是什麼?

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

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

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

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

  • 15 # 大學生程式設計指南

    首先這種認識是不正確的,所有的程式語言要轉化成機器語言然後才去執行,肯定不會轉化成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語言已經不行了之類的話語。

  • 16 # 愛思考的奧特曼

    實際情況並不是這樣的。

    我們來一條條的看吧:

    1.程式語言並不是都要編譯成C,這個說法不知道是誰提出來的。C語言和java,python一樣,也是一種高階語言。但是C語言有個優勢,就是可以嵌套匯編,實現底層互動。

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

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

    無論是C還是其他什麼語言,最終的目的都是實現某種功能,而這離不開硬體的支援,所以歸根結底,還是要從程式和硬體的關係說起。

    硬體,程式和編譯器之間的關係

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

    透過0和1決定電路狀態,那麼操作者是透過程式語言操作硬體的呢?這裡編譯器的作用就體現出來了。

    編譯器就像是一個翻譯一樣,也就任人們口中俗稱的程式設計軟體。其實用更專業的話來說,編譯器實際上是IDE(開發整合環境)中的一個工具。

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

    最後提一點,並不是所有的語言都會被編譯器直接編譯成機器語言。C語言是一個比較特殊的語言,因為他是直接可以直接編譯為彙編再編譯為機器碼的,這也是C語言可以和底層打交道的主要原因。像我們熟知的java,它會把原始碼先轉換成一種叫做位元組碼的東西,透過JVM虛擬機器將其轉換為機器碼。所以說,編譯器的型別有很多,作用不能一概而論。

  • 17 # 532的天空

    不是所有程式語言都編譯成c語言,編譯成彙編也不是必須的方式,每個語言都有自己的編譯器。只有極少數以c語言為中間介質進行。計算機也不會以彙編為執行程式碼,大部分還是需要機器碼進行執行的。也有一些語言是使用虛擬機器作為中間介質處理程式和cpu之間的互動,java就是這種情況。

    其實揭開現象看本質,所有機器執行的指令都是在cpu的暫存器中執行。高階語言使用類,c語言就是使用內部的函式,彙編是直接操作,他們最後都會和暫存器打交道。排隊往裡送東西,排隊取東西。這就是計算機的計算過程,由於cpu計算頻率很快才使得這樣的過程讓人沒有感到。

    大家如果有興趣可以自己用一下微控制器或者stm32。特別是stm32的兩種方式(設定暫存器和使用sdk)程式設計後更能加深對計算機程式設計思想的認識。

  • 中秋節和大豐收的關聯?
  • 過年朋友叫去家裡吃飯,需要帶點什麼禮物好呢?