除了組合語言,其他語言是否都會先轉為 C 語言?

時間 2021-05-30 23:07:22

1樓:Interlock

C語言並不是基礎,在C語言出現之前就有很多很多程式語言了。C語言也是為了方便程式設計師使用才被製作出來的。C語言衍生出了很多類C語言。當然還有更多的語言和C語言毫無瓜葛。

當乙個編譯器設計者想要實現一門語言的時候,至少有兩個方案可以選,乙個是將該語言直接轉換成機器碼,另乙個是將該語言轉換成中介語言,中介語言再轉換成機器碼。C語言是各個類unix平台上最廣泛被支援的語言。充當中介語言也比較合適。

所以轉換成C語言再轉換成機器碼是乙個常見的策略。

2樓:JeepCar

不知道題主說的是不是真的,但我願意相信。每個CPU的結構、指令都是各不相同的。現在的CPU越來越複雜,廠家以外的人很難充分了解掌握各個CPU的特點、優勢。

普通程式設計師也很難直接以匯編寫程式。即使能夠寫,因為對CPU的結構、指令缺乏深入理解,很難充分發揮CPU效能。因此,一般會由CPU設計廠商直接提供C語言編譯器。

廠家了解CPU,能夠將C語言更有效地編譯成機器所能執行的指令。而其他人只要將你的程式轉換成C語言,就能夠比較充分地利用CPU的效能。如果不先轉為C,直接轉為彙編,可能編譯後的執行效率反而更低。

3樓:王銳

c語言是誕生比較晚的語言,之前fortran,cobol,lisp,basic,algol,pascal都比c早,C語言在這些語言看是晚輩,很多特性方面還不如上面的一些語言,有些是倒退的。

並且c之後的語言基本也就乙隻手可以數過來的工具是編譯成c語言的,比如包括早期原始的一些cpp編譯器,自從有了模板泛型等複雜特性,這些早期的cpp編譯器也不更新了。

編譯型語言大部分都是編譯到中間虛擬機器機器語言,然後到各個平台的原生機器語言。早期是一次性編譯到機器語言,隨著理論的進步,編譯成中間虛擬機器機器語言,再往目標機器語言編譯以方便便於優化,另一方面便於移植。

解釋語言有自己的直譯器。

而且這些語言本身很多都是用自己開發的,叫做自舉。用1.0版本開發2.0,用自己編譯自己,還能驗證編譯器。

舉個例子,一次維斯最開始接了IBM的乙個新大型機PASCAL開發任務,對方只給了他指令規範。維斯的實現方式是先在其他電腦上寫乙個小型的執行期庫,然後他的PASCAL編譯器做的就是把PASCAL編譯到這個小的執行庫上,叫PCODE。等IBM給了他真的電腦,他只要實現這個小的執行庫就好了。

然後不斷的拿這個PASCAL開發自己,給自己增加新特性。因為他在有真機之前已經做了PASCAL編譯器的大部分工作,所以最快的速度交出了任務。

所以絕大多數程式語言和c一毛錢關係都沒有。

4樓:pansz

歷史上確實曾經有少數的語言是先轉為 C 語言再編譯的。

原因當然是省事,畢竟 C 語言在各平台下都能編譯。

不過大多數時間裡,大多數語言,並不需要先轉成 C 語言再編譯

所以某科普的說法並不準確。

雖然他們並不需要轉化成C語言再編譯,但大多數語言的編譯器都是由 C 語言寫的,不是 C 語言的那部分語言編譯器基本也都是 C++ 寫的。編譯器既不是由C寫也不是由C++寫的語言,確實也有,但那就屈指可數,實際使用也比較小眾。

所以,說 C 語言是基礎並沒有什麼錯,但 C 語言其實並不需要所有人去掌握。如同說不需要所有的汽車司機學習怎麼造輪子一樣的道理。

5樓:胖胖小

第二,不可能所有語言轉成c (為什麼會有這種神奇的想法)。隨便說說,網頁前台三大件html, js和css,哪個都不會轉成c再執行...

就好比,我乙個中中國人看日本動畫片,難道還會去找英文版的嗎?

6樓:蘇維

編譯器(compiler)和轉譯器(transpiler, a.k.a. source to source compiler)在如今基本是當成不同的兩個東西。

歷史上是有一些語言會選擇轉譯到c,再交給c編譯器完成到二進位制的編譯(事實上現在也有),但這一直不是也不可能是主流做法。

——稍了解過編譯相關知識就可以明白編譯器(或者轉譯器)跑完AST生成後,是直接生成二進位制或是轉譯成其他語言的工作量是在乙個數量級的,除非特殊原因沒必要多此一舉。

現今最廣泛的轉譯器應用應該是把各種語言編譯成js,而非c。

7樓:逸之

感覺你把C和彙編搞混了,問題改成這樣還合理些:

除了C語言,其他語言是否都會先轉為組合語言?

C語言其實和其他程式語言一樣,都屬於高階語言,很多語言會基於C來實現,但它們編譯時跟C沒半毛錢關係,卻都會殊途同歸到彙編。

當然解釋型語言另當別論。

8樓:是小蘑菇呀

首先,這個問題不需要「大神」,只要學完了乙個四年電腦科學的本科生(比如我)就能回答。

其次,因為如果所有語言的基礎是C(編譯階段會轉化為C),那麼實際上所有人都應該先學C

這句話的前提就是不成立的。我一直認為,所有語言(包括人類語言)的基礎都是思維。語言只是一種表達方式。

某些語言在編譯階段轉成C(可能只是用了語法而已),主要是歷史原因(所謂出名要趁早)。新發明乙個語言之後只要在下層轉成(translate to)C就可以用現有的編譯器(compiler),而不用自己重新寫乙個編譯器轉去組合語言,可以但是沒有必要。還有一些高階語言,需要一定的開發環境(另乙個底層程式),可以看這個介紹。

其次,先學底層,再理解性的往上學軟東西

可以但是沒有必要。

除了最常用的C,還有組合語言和機器語言,即使看了這些知識以後(除了來知乎答題)永遠也用不到,我也強烈建議學程式設計的人都要了解這些基礎知識。既然要吃這碗飯,(種子什麼樣的,大公尺怎麼種的,飯怎麼煮的[劃掉])總要了解一下吧。

但也不一定說只有學了底層才能往上,你完全可以先學應用層,解決目前工作或者學習的需要,再去了解那些基礎。人類之所以偉大,是因為我們懂得爬上巨人的肩膀。

最後,Don't Reinvent the Wheel, Unless You Really Want to.

9樓:涇渭漳淮

當然不是。c語言是供人寫給人看的,是人和機器之間的媒介,機器(其它語言的編譯器)和機器(計算機硬體)之間不需要c這個媒介。

不過其它語言的底層庫函式可能是用c寫的,編譯器本身可能也是c寫的。

組合語言跳轉問題?

韋易笑 怎麼還在學 16 位彙編呀?什麼年代了?程序還要自己操作段位址。你理解錯了 call word ptrds 0eh 發生的是 push ip jmp word ptr ds 0eh 同時push ip展開是 decsp,2 movword ptrss sp ip 所以完整展開 call wo...

學習組合語言有什麼好處?

藍芽彪 效能要求比較高的地方其實是可以用C替代的.但有個地方C比較難解決基本靠彙編,晶元補丁.參考RAM的補丁機制,最近跟彙編幹上了.果斷拿出大一學習的彙編基礎操刀上. 最近在研究hotspot,然後發覺不懂作業系統根本不能理解很多知識點,然後研究作業系統,發覺要懂彙編,然後學習彙編,然後你就會覺得...

高階語言源程式不如組合語言源程式的可移植性好嗎

四眼井 組合語言就不要談什麼可移植性,彙編可以給你極致的高效率,穩定性,安全性,但你非要在組合語言上扯什麼可移植性。你這個問題可以改成以下版本 1 航母速度不如電單車快麼?那航母還有什麼卵用?2 阿司匹林治不了腳氣麼?那阿司匹林還有什麼卵用?3 美元擦屁股手感不如衛生紙麼?那美元還有什麼卵用?還有3...