不同處理器可以編譯相同源代碼么
㈠ 相同的cpu架構,在不同的操作系統下生成的程序為什麼不可以通用程序不是機器語言么針對硬體操作的阿
相同的CPU架構只是指程序運行的硬體是相同的,而軟體(操作系統、操作系統下生成的程序)是不一樣的,最後生成的針對硬體操作的機器語言也不一樣。生成的程序最後都要匯編成機器語言才能被運行,而機器語言在同一種架構下都可以用.但不能運行在不同架構的平台下。
㈡ 高級編程語言也要編譯成匯編語言,不同的cpu匯編語言不一樣,那會編譯成那種匯編語言呢
高級語言一般最終不是編譯成匯編語言而是機器語言,而像C#這類語言編譯後為公共語言,不是機器碼,運行時公共語言代碼由NET框架負責進一步即時翻譯即時執行為機器指令。只有C++這類語言編譯後為CPU可以直接執行的機器碼。
附圖是VS2019中C++語言的一段調試時的反匯編窗口,其中白字是C++源代碼,下面是對應的匯編碼,匯編行左列為內存地址,中間是對應的機器指令和數據(內存中的實際值),右側是對應的匯編碼。
比如,定義整數變數a並賦值1的語句,被編譯器編譯成C7 45 F8 01 00 00 00 這樣幾個位元組,其中C7為匯編碼中的MOV指令,可以操作16位寄存器和內存以及立即數,45 F8 是當前命名空間中變數地址,即變數a的地址(F845),而01 00 00 00 為32位寬度的數值1(內存排列順序是前低後高)。也就是說機器語言的指令格式為:指令代碼,地址,數據,當然根據不同指令,有時候地址和數據是不需要的。而右側 MOV dword ptr[a],1 是指令助記符,也就是匯編指令,而用匯編指令編寫的程序也是需要編譯成機器指令的。
指令C7對應的匯編碼及含義
㈢ 同樣的程序段在不同的CPU中運行,結果一樣不
當然一樣,不一樣的CPU只是對你機器的狀態產生的速度等一些本身的實質問題而已
㈣ 電腦:不同的機器,指令不同,為什麼程序能在不同的機器間(cpu不同,是嗎)運行,
你理解得不對,不同的機器,如果採用的指令集不同,程序絕對不能兼容(連操作系統本身都要修改,更不用說依賴其運行的程序)。我們一般接觸的不同性能的CPU,其實指令集是一樣的。即使是指令集相同,如果操作系統不同,程序仍然不能兼容。必須在想要兼容的操作系統環境中(模擬環境下也可)重新編譯源代碼,生成對應操作系統的程序版本才行。
如果是編譯型的程序,也就是腳本類的,它在不同(操作)系統之間的兼容,其實是通過實時編譯實現的。
㈤ 請問運行於不同CPU構架的linux,它們的軟體可以通用嗎
以上回答中jiangtao9999的比較靠譜兒。
是這樣:
1、Linux下的軟體幾乎都是c語言的;
2、如果你學過C語言,找找書應該有這樣一個概念:ANSI C,這個是一個C語言的標准,比如printf這個函數就屬於標准庫(也就是符合ANSI標準的)函數
3、假如你編寫了一個軟體,代碼中僅僅包含ANSI的庫函數,那麼沒有問題,只要是支持C語言的平台,都能正常運行,即:編寫了一個簡簡單單的helloworld到哪裡編譯運行都沒有問題。
【前提是:】編譯再運行,不編譯就運行是不可以的,比如printf函數在各種架構上的實現方式是不可能相同的,所以需要在arm的編譯器上再編譯一遍才可以。否則運行不了。
有的軟體平台可以不用編譯,直接運行,比如jiangtao9999說的java、Python什麼的,Java可以實現「一次編譯,滿哪運行」什麼的,而Python則是有了.py源代碼就可以無敵了,使用的時候不用你去執行編譯命令,直接執行即可。arm上實現這兩種語言都是很容易的——下載源代碼、編譯、安裝即可。
4、不同架構的Linux平台都要實現一個編譯器,這是很重要的,有了編譯器,才可以從源代碼安裝軟體。
5、使用非ANSI庫中的函數需要該Linux包含這個函數的實現,否則,編譯後的連接將不通過,比如一個軟體使用了GTK來實現圖形用戶界面,那麼就需要系統中包含了gtk的庫函數,這就叫依賴,安裝軟體,首先要解決依賴,依賴有時候解決起來很麻煩,所以軟體開發過程中盡量減少依賴,這樣方便安裝。
6、tar.gz這種格式的軟體包有可能是源代碼,有可能是可執行文件(這是因為那隻是一個壓縮包,內容是什麼不一定),這兩者不同。很多軟體以tar.gz格式發布源代碼,而qq的Linux版本屬於可執行文件,在幾乎所有Linux平台下面直接雙擊或者通過命令就可以使用。
7、如果你使用的是rpm包或者deb包或者是tar.gz文件包中可執行文件形式的軟體包,而不是tar.gz這種形式的源代碼,你需要使用相應的軟體包管理器安裝就行,
但這不意味著arm版本的deb和x86版本的deb文件是通用的,你能這樣用是因為所有的使用x86機器的軟體經過編譯或者交叉編譯(在arm平台上編譯x86平台上的軟體就叫交叉編譯)以後,運行於幾乎完全一樣的統一的平台上,實現軟體和系統的無縫對接,方便了用戶——一方面可以不用浪費編譯的時間,主要還是方便了那些不會編譯軟體的人。
8、我也正在學習Linux,所以很多地方不太對,這只是我現在的一些理解。jiangtao9999說的主要是和匯編有關,如果代碼的實現主要是在c語言水平,那麼就會由編譯器屏蔽掉指令集和寄存器什麼的。
9、要是在網路回答的答案能改改就好了,這樣錯誤就會少一點。
10、重新羅嗦一遍:
1在不重新編譯源代碼的情況下,x86下linux的軟體不可以運行於arm構架的Linux,即使運行也會奇卡。
2和在編譯是否時為X86的CPU構架優化了編譯無關。(把我問迷糊了,估計是無關)
3軟體在編譯時是否為X86的CPU構架而優化主要看作者了,資料可以參看http://www.gentoo.org/doc/zh_cn/gcc-optimization.xml
4和不同的安裝包格式有一定關系
5tar.gz格式的軟體包不能保證在不同架構的Linux都能運行
6在arm的linux安裝時解決依賴以後,乳溝編譯通過基本是沒什麼問題的
7不是所有源代碼在arm和x86下編譯一下就可以了,還需要做一些努力
8有源代碼可以對遇到的不通過的問題逐一解決,理論上可以實現所有軟體都能運行
9重新編譯過程中如果遇到依賴問題需要逐一解決
㈥ 不同結構的CPU執行相同的程序
只有高級語言才有可能得到相同的結果,匯編和機器碼基本是對應的,所以不同的結構結果不一樣,因為指令都不同別說結果了,程序都不一定能按要求跑。
㈦ 誰知道為什麼c語言程序為何可以在不同CPU上運行,還有,如果一個操作系統如果使用匯編語言開發,除了
因為運行的並不是C語言的代碼,而是被編譯器編譯過的C語言代碼,只要編譯器設置正確,在不同的CPU上想完成相同的任務,C代碼是完全一樣的,只就是所謂的代碼移植,編譯好的C程序是不能移植的,但是相同的代碼可以在任何有編譯器的環境中編譯.
至於操作系統,用匯編寫的話,很難讓人理解,查錯,修改,升級都會比較麻煩,但是性能上,直接用匯編寫,如果你的技術夠高,肯定會比C的要好.
㈧ linux 下的gcc和windows 下的gcc相同嗎gcc的源代碼是否相同對同一程序編譯出來的可執行文件是否相同
linux下的gcc 和 windows下的gcc,是GNU針對兩個不同的平台發行的,兩個不同版本的編譯器,源代碼不完全相同,但大部分地方是相同跨平台的代碼。只需要用的時候,configure成相應的平台,它就會編譯成相應平台用的gcc。
對於同一個程序,在兩個不同的平台下編譯出來的可執行文件是不相同的,linux下編譯好的helloWorld程序在windows上面是不能運行的。
但是,linux下編譯好的helloworld在linux下運行,與windows下編譯好的helloworld在windows里運行的效果,是相同的。
㈨ 不同的cpu機器指令相同么
CPU的指令集從主流的體系結構上分為精簡指令集和復雜指令集,而在普通的計算機處理器基本上是使用的復雜指令集。在計算機早期的發展過程中,CPU中的指令集是沒有劃分類型的,而是都將各種程序需要相配合的指令集成到CPU中,但是隨著科技的進步,計算機的功能也越來越強大,計算機內部的元件也越來越多,而且越來越復雜,CPU的指令也相應的變得十分復雜,而在使用過程中,並不是每一條指令都要完全被執行,在技術人員的研究過程中發現,約有80%的程序只用到了20%的指令,而一些過於冗餘的指令嚴重影響到了計算機的工作效率,就這一現象,精簡指令集的概念就被提了出來。
精簡指令集RISC就是(Reced Instruction Set Computing)的縮寫,而復雜指令集CISC則是(Complex Instruction Set Computing)的縮寫。它們之間的不同之處就在於RISC指令集的指令數目少,而且每條指令採用相同的位元組長度,一般長度為4個位元組,並且在字邊界上對齊,欄位位置固定,特別是操作碼的位置。而CISC指令集特點就是指令數目多而且復雜,每條指令的長度也不相等。
㈩ 不同cpu的指令集不是不同嗎為什麼一個程序可以在很多不同的電腦上用
CPU使用的微指令集會有些不同,但這是CPU內部使用的.CPU會把匯編的指令進行相應的轉化為機器指令,並把這樣的一句指令轉化為一系列的微指令在CPU內部完成.所以,相同的程序在不同的CPU上可以得到相同的結果.