① C語言編譯器icc與gcc編譯出來的執行文件有什麼區別
ICC 是intel 針對intel 體系架構開發的編譯器,顯然,你的代碼,如果運行在intel機器上,intel的人開發的編譯器,編譯出來的可執行代碼效率更高。畢竟人家對intel體系結構這么熟悉,裡面的優化說明的,肯定做得不錯。但是只能運行在intel體系結構上。比如你的PPC的板子就不能運行了。
GCC是一般性的通用的編譯器,可以編譯運行在各種體系結構上的代碼,比如intel, PPC, ARM, MIPS。它很通用。裡面的開發者,當然也熟悉intel 體系架構。但是也要考慮到通用。所以,是一般化的選擇。在intel體系結構上運行的話,可能某些地方不如ICC的效率高。
他們實現的原理基本是一致的,但是在細節上,肯定差別很大。比如針對同一種語句,有的會告警,有的不會。有些支持擴展特性。有些不支持。
② ARM有這么多的架構,內核,晶元,請問匯編指令是一樣的嗎,比如CORTEX M3與CORTEX A8的匯編是一樣的嗎
兄弟,ARM公司為了便於ARM的推廣和用戶開發,所以ARM系類的匯編指令集都是一樣的,且一套匯編指令集足以,多了反而是累贅。
但不同的編譯器可能有不同的匯編格式。
如linux下的GCC編譯器下匯編函數是這樣的,GCC下的是GUN匯編。
FUNC:
MOV r1,#0x0
LDR r1,#0x30
但在ADS1.2下格式這樣的,少了一個冒號,但裡面的指令集都是一樣的,這點無可異議。
FUNC
MOV r1,#0x0
LDR r1,#0x30
這些編譯器的差異和你使用的ARM架構沒有關系的
想學ARM入門,推薦周立功系類的書,很多東西講得很到位,對於初學者很適合,也適合以後的開發,
(純手寫,有問題可繼續追問)
③ 請問運行於不同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架構,在不同的操作系統下生成的程序為什麼不可以通用程序不是機器語言么針對硬體操作的阿
相同的CPU架構只是指程序運行的硬體是相同的,而軟體(操作系統、操作系統下生成的程序)是不一樣的,最後生成的針對硬體操作的機器語言也不一樣。生成的程序最後都要匯編成機器語言才能被運行,而機器語言在同一種架構下都可以用.但不能運行在不同架構的平台下。
⑤ C++之IDE和編譯器的區別
C++的IDE與編譯器的區別:
IDE(Integrated Development Environment)指整合開發環境,也就是用於編輯程式碼、開發程式的應用程式,一般包含程式碼編輯器與編譯器等。C++的IDE有Visual C++6.0、GUIDE等;
編譯器(Compiler),則是用於將高階程式語言程式碼翻譯成目的碼(如機器語言)的程式。C++的編譯器是g++。
上面說了,IDE一般包含編譯器,也就是說編譯器一般屬於IDE的一部分。在IDE中可編輯、編譯程式碼,而編譯器只能編譯程式碼。
ide包括編譯器
你描述的IDE是自帶了編譯器的IDE。
仍有一些IDE只有開發環境,編譯器需要另外指定,比如codeblocks,這個IDE可以使用g或者vs編譯器或者別的。
還有個例子就是eclipse,本身並不帶編譯器,需要額外指定。
很明顯是Visual c++好,Visual c++功能比Turbo c 2.0強大的多. 兩個開發環境的針對性不同,Turbo c 2.0主要針對C進行開發,而Visual c++主要針對C++,但我覺得Visual c++開發C++和C都是很好的工具. Turbo c 2.0比較適合剛剛接觸C語言的人來使用,Visual c++可以說是從事商業開發的有效工具
C++的時編譯成機器程式碼,java的時位元組碼,就是虛擬指令,只能在java虛擬上執行。
c++的設計者說過,c++的設計目標是保留c語言的長處如:系統程式設計特性,執行快速快等,再新增上面向物件特性。
語言的特性決定編譯器的特點。核心的區別也就上面一句話,具體的差別那得幾本書來說明。c編譯器通常只編譯c檔案,c++編譯器可以同時編譯c和c++檔案。
包含關系。
IDE(Integrated Development Environment)指整合開發環境,可以用來編輯程式碼,包含有編譯器。一般現在最常用的就是VC++和Visual Studio了。
編譯器(Compiler),則是用於將高階程式語言程式碼翻譯成目的碼(如機器語言)的程式。C++一般是g++
1. IDE與硬體平台有關。不同IDE攜帶的編譯器不同。
2. 當然有關。不是半導體廠家提供的,而是編譯器開發廠商提供的,也有很多開源的編譯器。
3. 有關系。目前最常見的編譯器仍然只支援C/C++,宴殲C#的編譯器較少而且據說仍不完善。至於Java……哈哈,這種二道販子還需要勞煩編譯器?
4. 可以整合。具體的你需要查閱相應IDE的手冊,看看能夠整合晌逗沖/新增哪些編譯器。
5. 關心到架構就可以。廠商自己擴充套件的東西多半就是些對映,你看廠商的外設就行;而且很多廠商都提供了易於開發的庫(當然他們的庫也都是夠爛的,用熟了以後就可以扔掉)。
6. 是否用作業系統不影響編譯器,整體而言也不影響IDE;當然IDE中如果能夠新增針對作業系統元件的原生支援(重點是除錯方面),用起來就更方便。
優化方式理論上跟編譯器和硬體都有關聯。程式碼級別的優化,要看所使用的編譯器實現,Xcode用的是clang,VS用的是windows自己的編譯器。。。
匯編級別(指令級別)的優化,要根據硬體對應的指令集實現,指令集根據CPU型別的不同而不同。。。
g++編譯時實際上是呼叫g進行編譯;
g不能自動連結庫檔案,一般用g++來連結庫檔案,非要用g的話,一般使用g -lstdc++命令;
extern 「c」對於g和g++沒有區別;
實際使用時只需安裝g和g++中的一個就行了,如果使用g,編譯直接用g就行了,連結要加上-lstdc++引數;如果使用g++,編譯時實際還是呼叫g,連結直接使用g++即可;
關於包含庫檔案標頭檔案的說明:以gtd庫檔案為例,庫檔案一般是libgtd.so格式的檔案,如果是libgtd-***.so或者其他格式,可以通過軟連結命令轉化成libgtd.so格式,ln
-s libgtd-***.so
libgtd.so。一般庫檔案如果是放在/lib,/usr/lib,/usr/local/lib目錄下,則無需額外處理,編譯連結時-lgtd會自動找到對應檔案不會報錯,但是如果不在對應目錄,則需要加上-L
/所在目錄
-lgtd才能找到對應的庫檔案。標頭檔案一般是採用原始檔中用#include命令包含,而不是採用-include引數包含,標頭檔案如果放在/usr/include目錄下則會自動找到不會報錯,否則編譯連結時需要使用-I
/所在目錄才能正確找到。
編譯連結命令示例:
g++ test.cpp -o test.txt -L /mytest/lib -lgtd -I /mytest/include
⑥ 編譯器和IDE的區別 如Eclipse、tasking,GNU,GCC,keil,IAR有什麼區別
1. IDE與硬體平台有關。不同IDE攜帶的編譯器不同。
2. 當然有關。不是半導體廠家提供的,而是編譯器開發廠商提供的,也有很多開源的編譯器。
3. 有關系。目前最常見的編譯器仍然只支持C/C++,C#的編譯器較少而且據說仍不完善。至於Java……哈哈,這種二道販子還需要勞煩編譯器?
4. 可以集成。具體的你需要查閱相應IDE的手冊,看看能夠集成/添加哪些編譯器。
5. 關心到架構就可以。廠商自己擴展的東西多半就是些映射,你看廠商的外設就行;而且很多廠商都提供了易於開發的庫(當然他們的庫也都是夠爛的,用熟了以後就可以扔掉)。
6. 是否用操作系統不影響編譯器,整體而言也不影響IDE;當然IDE中如果能夠添加針對操作系統組件的原生支持(重點是調試方面),用起來就更方便。