當前位置:首頁 » 編程軟體 » 編譯器局限

編譯器局限

發布時間: 2022-08-07 22:04:14

linux嵌入式交叉編譯工具鏈問題 淺談

簡介

交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。

交叉編譯工具鏈的製作方法

  1. 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。

  2. 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。

  3. 直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。

方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。


方法1:分步構建交叉編譯工具鏈


  1. 下載所需的源代碼包

  2. 建立工作目錄

  3. 建立環境變數

  4. 編譯、安裝Binutils

  5. 獲取內核頭文件

  6. 編譯gcc的輔助編譯器

  7. 編譯生成glibc庫

  8. 編譯生成完整的gcc

由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org


方法2:用Crosstool工具構建交叉工具鏈(推薦)

Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。

運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝

  • 准備文件:

下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命

令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz
  • 建立腳本文件

接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:

# cd crosstool-0.43

# cp demo-arm.sh arm.sh

# vi arm.sh

修改後的arm.sh腳本內容如下:

#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
  • 建立配置文件

在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。

KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項


gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。

BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5
  • 執行腳本

將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:

#cdcrosstool-0.43
#./arm.sh

經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:

arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf
  • 添加環境變數

然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數

export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH

至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!












Ⅱ 編譯器本身是如何進行測試的

編譯器最重要的性質就是保證語義的正確。比如,從高級語言翻譯到機器指令之後,指令必須正確的表達原來程序的意思。所以一般編譯器測試都包含一些源程序,用來覆蓋可能出現的各種情況。基本的原則是:原來程序的結果 = 編譯後機器指令運行的結果。機器指令運行的結果很容易知道,運行一下就知道了。可是原來程序的結果你怎麼知道呢?
為了解決這個「原來程序語義」的問題,最好是寫一個解釋器,准確無誤的表達原來的代碼的語義。所以我們的要求就是:
高級語言解釋器(源程序) = 機器執行(機器代碼)
由於處理器其實就是一個用來執行機器代碼的解釋器,這里有一個很美好的對稱關系:
interp1(L1) = interp2(L2)
另外還有一個問題,就是編譯器一般需要經過多個轉化步驟(叫做 pass)才能最後編譯為機器指令。比如,
L2 = pass1(source)
L3 = pass2(L2)
L4 = pass3(L3)
Ln = passN(Ln-1)
machine_code = codegen(Ln)
由於源程序經過了很多步驟猜得到最後的機器指令,如果你使用上面的公式,就會出現以下一些情況:
1. 知道結果錯了,但是卻不知道到底是哪一個 pass 錯了。
2. 結果沒有錯,但是中間卻有 pass 實際上是錯的。但是由於之前的 pass 把輸入程序的一些結構給「優化」掉了,所以錯的那個 pass 其實沒能得到觸發錯誤的那個數據結構。所以測試沒能發現錯誤。如果以後前面的那個 pass 被修改,錯誤就會暴露出來。這是非常難以發現的潛伏的危險。
為了防止這些情況出現,一些編譯器(比如 Chez Scheme 和 Kent Dybvig 的課程編譯器)使用了對每一個 pass 進行測試的做法。具體的方法就是為每一個中間語言都寫一個解釋器,把這語言的語義完全的表示出來。這樣我們就需要檢查一組等式:
L2 = pass1(source)
高級語言編譯器(源程序) = interp2(L2) // 測試 pass1 的正確性
L3 = pass2(L2)
interp2(L2) = interp3(L3) // 測試 pass2 的正確性
這樣一來我們就能獨立的判斷每一個 pass 的正確性了。
這些是基本的語義測試原理。另外除了語義,可能還有一些「表面」一些的測試,它們看代碼本身,而不只看它的語義。比如尾遞歸優化的測試應該確保輸出程序的尾遞歸得到正確的處理,等等。這些是語義測試檢查不到的,因為尾遞歸沒有正確處理的程序大部分也能輸出正確的結果。
普通的單元測試方法也可以用來測試一些編譯器里的輔助函數,但那些不是編譯器特有的,所以就不講了。
另外,就像所有測試的局限性一樣,你沒法枚舉所有可能出現的輸入,所以以上的測試方法其實也不能保證編譯器的完全正確。

Ⅲ 編譯器優化方法和局限性有什麼_ 急!

Ⅳ 既然大部分語言都具有移植性,為什麼現在的應用程序依然有很大的平台局限性

比較上層的語言(通常是腳本語言)不太受系統環境的影響,這也就是為什麼同一款瀏覽器插件可以在不同系統的瀏覽器上運行的原因。

相反,比較底層的語言(C,匯編語言等)受制於硬體介面,如果你認真學習過硬體方面的知識的話你就會知道不同的系統對同一個硬體IO的命令是不一樣的,而這個不一樣不只是二進制機器語言上的不同,而是源代碼就有很大的區別。例如UNIX環境下網路編程使用套接字通常調用<sys/socket.h>下的函數,而windows環境下根本沒有這個頭文件。 如果一款底層編寫的程序不需要任何處理就可以移植到另一個平台上,那麼說明它幾乎沒有怎麼使用高級硬體IO,也就是說它基本沒什麼用。。。。

java這門語言編程時有哪些限制或局限

Java語言局限性及其解決對策

2.1 執行速度慢
事實上,Java比c語言寫的程序執行起來慢很多。執行慢的原因主要是在主機操作系統上加了虛擬機層,比本地編解碼慢。
解決的方法主要有:
(1)「及時(Just in Time, JIT)編譯器」
(2)研究新的編譯理論和技術
(3)使用JavaStation及JavaOS
(4)採用Java晶元
將Java做成晶元,用來解釋Java語句,把Java語句作為一條指令來執行,加快Java語言編寫程序的執行。Java晶元可直接執行Java位元組碼。

2.2 Java標准問題
目前還沒有Java系列國際標准。有關Java的核心技術:Java虛擬機、Java語法、Java類庫和Java應用程序介面(API)等。這些都變成國際標准還需要一段時間。
Java在實現跨平台性和可移植性的同時,自己也漸漸走上了Unix發展的老路。這樣發展下去是很危險的。
解決的方法主要有:
(1)盡快制定出Java國際標准;
(2)Sun公司提出了100%純Java倡議,這是純化Java的良好開端。
2.3 安全性問題
Java已實現了幾種安全性機制。但還存在的問題:對applets有許多限制。
Java現有的安全模型並不完善,有些開發人員能生成嵌入Web的Java小程序,即不友好的小程序。這種程序可能給Web用戶帶來麻煩。
安全性問題需要進一步的研究,包括提出新的Java安全模型。
2.4 已有軟體產品的充分利用
如果程序必須與遺留下來的老代碼和數據打交道,則傳統的工具或語言能工作得更好。
Java語言提供了本地方法調用,可調用其它語言編寫的程序。但這樣系統就不能保證運行在其它Java平台上。要能運行在任何Java平台上,就要求100%的純Java。
Sun公司提出了100%純Java倡議,要求滿足下列所有條件:100%用Java編程,沒有本地方法調用,遵守Java核心API規范,通過100%純Java測試。
解決的方法主要有:
(1)將C, C++等語言直接編譯成Java的位元組碼。美國已將Ada語言編譯成了Java位元組碼。
(2) IBM正在研製的通用虛擬機(UVM),它允許開發人員使用Java,Basic和Smalltalk等語言,建立各種與平台無關的軟體。UVM的設計目標是翻譯Smalltalk、Basic和Java編碼。
2.5 Java語言的基本類庫簡單
與微軟(Microsoft)的基本類庫相比,Java語言的基本類庫簡單。
解決的方法主要有: Java語言基本類庫的擴充。
2.6 跨平台問題
跨平台是Java語言最大的優點。但保證跨平台兼容性的條件下,Java不能全部使用本機操作系統具有的各種功能。
由於一種操作系統特有的功能和特徵並不能准確的轉移到另一種操作系統上,因此Java的跨平台適配性也許是不可能實現的。
從理論上講,可以創建一個能在任何處理器和操作系統上運行的Java虛擬機,但不同的處理器和操作系統支持的功能不同,所有這些差異要靠Java虛擬機來解決。
跨平台計算的實現較之於單平台來說成本高,難度大,而且為此必須開發能夠運行於多種硬體平台和軟體平台的應用程序。
2.7 軟體開發費用問題
軟體開發商對另外的語言也許有更好的工具,使用熟悉的工具或語言有更高的生產率。
如果要另外花錢和增加客戶負擔,軟體開發商也許不願意改變。
2.8 廣泛的應用實例
用一種語言滿足所有用戶的需求,是很難地,也不大可能。Java語言還很年輕,不夠穩定和成熟。
這還要經過實際應用的檢驗。
3 結束語
本文分析了Java語言存在的問題,目前解決這些問題的研究方法。這些為Java語言的進一步研究提供了參考,為廣大用戶選擇Java語言作為開發工具提出了可能遇到的問題。
總之,隨著計算機網路的廣泛普及,越來越多的用戶進入Internet,Java計算模式會是一種非常重要的計算模式,Java語言的研究和應用,也會變得更加深入和廣泛。

Ⅵ c語言編程在功能上有哪些局限性

環境就是你用來進行編程的編程平台,最簡單的環境就是TXT文本文件了(不過這個不支持編譯,一般的編譯環境是支持編譯的)。就C語言系列來說,主流的編譯環境有C-FREE系列、VC系列、VS(Visual Studio)系列 Emacs是一種強大的文本編輯器,在程序員和其他以技術工作為主的計算機用戶中廣受歡迎。EMACS,即Editor MACroS(編輯器宏)的縮寫,最初由Richard Stallman(理查德·馬修·斯托曼)於1975年在MIT協同Guy Steele共同完成。這一創意的靈感來源於TECMAC和TMACS,它們是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人編寫的宏文本編輯器。 Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將「高級語言」翻譯為「機器語言(低級語言)」的程序。Visual C++是一個功能強大的可視化軟體開發工具。自1993年Microsoft公司推出Visual C++1.0後,隨著其新版本的不斷問世,Visual C++已成為專業程序員進行軟體開發的首選工具。雖然微軟公司推出了 Visual C++.NET(Visual C++7.0),但它的應用有很大的局限性,只適用於Windows 2000、Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C++6.0為平台。

Ⅶ 用dev-c++編譯器對C語言程序進行編譯有什麼局限性

首先,Dev-C++不是編譯器,僅僅是編譯環境。
其次,Dev-C++用的編譯器是在Windows環境下模擬Linux G++的MinGW,據說G++是完全標準的C++編譯器。
但模擬後因為系統不完全兼容,編譯出的結果在Windows環境下不如VC++編譯結果快。寫C的話,因為是C++兼容C,速度達不到最優。如果對程序結果質量有高要求的話,建議換Turbo C這款經典的C編譯器。(用C++編譯器影響不大,基本上1000000以內語句執行次數,或者說1000行代碼以內看不出明顯區別)

Ⅷ 解釋器與編譯器的區別

編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

Ⅸ 【編譯器】有寧願用VC++6.0也不用codeblocks的嗎為什麼

Code::Blocks 是一個開放源碼的全功能的跨平台C/C++集成開發環境。 Code::Blocks是開放源碼軟體。Code::Blocks由純粹的C++語言開發完成,它使用了蓍名的圖形界面庫wxWidgets(2.6.2 unicode)版。對於追求完美的C++程序員,再也不必忍受Eclipse的緩慢,再也不必忍受VS.NET的龐大和高昂的價格。 Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將「高級語言」翻譯為「機器語言(低級語言)」的程序。Visual C++是一個功能強大的可視化軟體開發工具。自1993年Microsoft公司推出Visual C++1.0後,隨著其新版本的不斷問世,Visual C++已成為專業程序員進行軟體開發的首選工具。雖然微軟公司推出了 Visual C++.NET(Visual C++7.0),但它的應用有很大的局限性,只適用於Windows 2000、Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C++6.0為平台。

Ⅹ 我的機器上面沒有java或者c的編譯器,能否遠程編程

我想你要的是這個。
http://events.csdn.net/solaris/unix-center/
這里有很多機器你可以用終端連上去,裡面有自帶的C/C++/Java等編譯器,但是這樣受到的局限很大,畢竟沒有在本機上來得方便,如果是網站我想應該是沒有的,因為瀏覽器的負載很有限,根本達不到那種效率。其實現在一般的機器裝個JDK、VC完全沒問題,為什麼要如此麻煩。

熱點內容
大唐無雙冒險腳本 發布:2025-02-08 11:08:36 瀏覽:759
什麼安卓手機可以用個兩三年 發布:2025-02-08 11:02:37 瀏覽:967
安卓收銀軟體哪個好用 發布:2025-02-08 11:01:44 瀏覽:171
實現秘聞存儲的方法 發布:2025-02-08 10:23:33 瀏覽:168
怎麼在微信發文件夾 發布:2025-02-08 10:09:45 瀏覽:795
cryengine源碼 發布:2025-02-08 09:50:58 瀏覽:394
aardio可以反編譯嗎 發布:2025-02-08 09:50:53 瀏覽:484
公司營業執照密碼是什麼 發布:2025-02-08 09:47:56 瀏覽:855
體驗腳本 發布:2025-02-08 09:46:15 瀏覽:691
醫學生需要什麼配置的筆記本 發布:2025-02-08 09:45:34 瀏覽:772