A. 編譯器二:LLVM和GCC的區別
GCC: GNU Compiler Collection
GCC屬於傳統編譯器,傳統編譯器的工作原理基本上都是三段式的,可以分為前端(Frontend)、優化器(Optimizer)、後端(Backend)。前端負責解析源代碼,檢查語法錯誤,並將其翻譯為抽象的語法樹(Abstract Syntax Tree)。優化器對這一中間代碼進行優化,試圖使代碼更高效。後端則負責將優化器優化後的中間代碼轉換為目標機器的代碼,這一過程後端會最大化的利用目標機器的特殊指令,以提高代碼的性能。
事實上,不光靜態語言如此,動態語言也符合上面這個模型,例如Java。Java Virtual Machine也利用上面這個模型,將Java代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個前端就可以了。當需要支持多種目標機器時,只需要添加多個後端就可以了。對於中間的優化器,我們可以使用通用的中間代碼。
這種三段式的結構還有一個好處,開發前端的人只需要知道如何將源代碼轉換為優化器能夠理解的中間代碼就可以了,他不需要知道優化器的工作原理,也不需要了解目標機器的知識。這大大降低了編譯器的開發難度,使更多的開發人員可以參與進來。
雖然這種三段式的編譯器有很多有點,並且被寫到了教科書上,但是在實際中這一結構卻從來沒有被完美實現過。做的比較好的應該屬Java和.NET虛擬機。虛擬機可以將目標語言翻譯為bytecode,所以理論上講我們可以將任何語言翻譯為bytecode,然後輸入虛擬機中運行。但是這一動態語言的模型並不太適合C語言,所以硬將C語言翻譯為bytecode並實現垃圾回收機制的效率是非常低的。
GCC也將三段式做的比較好,並且實現了很多前端,支持了很多語言。但是上述這些編譯器的致命缺陷是,他們是一個完整的可執行文件,沒有給其它語言的開發者提供代碼重用的介面。即使GCC是開源的,但是源代碼重用的難度也比較大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的縮寫,定位是一個虛擬機,但是是比較底層的虛擬機。它的出現正是為了解決編譯器代碼重用的問題,LLVM一上來就站在比較高的角度,制定了LLVM IR這一中間代碼表示語言。LLVM IR充分考慮了各種應用場景,例如在IDE中調用LLVM進行實時的代碼語法檢查,對靜態語言、動態語言的編譯、優化等。
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。
B. 怎樣構建一個不依賴gcc/binutils的llvm/clang linux工具鏈
1,Build llvm/clang/lldb/lld 3.5.0等組件 1.0 准備: 至少需要從llvm.org下載llvm, cfe, lldb, compiler-rt,lld等3.5.0版本的代碼。 $tar xf llvm-3.5.0.src.tar.gz $cd llvm-3.5.0.src $mkdir -p tools/clang $mkdir -p tools/clang/tools/ex...
C. Linux環境下C++開發
你能否先去入門一下 Linux ?基礎會了再來討論這個問題?
不過我覺得可能你連 Windows 下面的開發詳細都不是很清楚吧?
開發工具分開發編輯環境,項目管理程序,編譯控制環境,編譯器。
GCC 是編譯器,光有一個 GCC 並不代碼你就真的 Linux 開發了。因為 GCC 還可以給 FreeBSD 編譯程序。GCC 也可以做 Windows 開發進行編譯用。
1、GCC 是編譯器,binutils 是連接器,glibc 是基礎 libc 庫,make 是編譯控制器。開發環境可以用 eclpise ,另外如果用 QT 庫開發,可以用 QT 自己的開發工具。不過這些組合都是可以替換的。比如編譯器除了 GCC 還可以用 llvm 。glibc 還可以改用 uclibc ,make 一般是 gmake ,還有 cmake 或者乾脆自己從頭寫腳本直接進行過程式控制制。
2、如果你會開發那就沒區別,只是函數調用、開發環境、代碼風格等等的過程不一樣。如果你不會,那就完全不同根本沒辦法比較。
3、我想反問 GCC 是什麼?
4、寫一個在 Linux 下面可以運行的 C++ 程序就叫 Linux 環境下的 C++ 開發。
D. 如何利用LLVM寫一個編譯器
LLVM有自己的教程,如果你只想做個玩具,那可以首先試著實現LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,請看他的文檔http://llvm.org/docs/
Kaleidoscope是一個範式簡單的腳本語言,教程里的詞法,語法分析都是手寫的,基本流程就是詞法語法解析,利用LLVM的API生成中間代碼並執行。
我用visual studio編譯的LLVM(version 3.6)實現過Kaleidoscope,我遇到的坑不少,如果你想以visual studio編譯的LLVM實現Kaleidoscope,你可能同樣會遇到
1. LLVM的生成目標對象為ELF格式,在windows下使用JIT的API時會出現incompatible object format的錯誤警告,需要在通過重新設定Mole的triple,我的PC的getTargetTriple的結果是「i686-pc-windows-msvc」,直接在後面再加上「-elf」即可
TheMole->setTargetTriple("i686-pc-windows-msvc-elf");
2. LLVM不支持windows下通過動態鏈接導出函數,如果需要使用C/C++的函數,需要通過addSymbol進行注冊
llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);
3. Kaleidoscope里使用的JIT的查找函數的API,getPointerToFunction已經被棄用了,需要替換為getFunctionAddress
E. 有沒有安裝好的linux erlang
你需要以下准備材料:
1 GNU unzip 用於解壓。
2 tar打包解包程序。
3 GNU make
4 Gcc 之類的C編譯器,或者LLVM或clang
5 GNU m4
6 Perl 5
7 相關的庫和頭文件: ncurses termcap termlib, 軟體包名稱通常是ncurses-devel之類,自己慢慢在程序管理器中查找。
8 git(可選)
安裝過程:
解壓源碼包:
$ tar -zxf otp_src_19.1.tar.gz
進入源碼目錄,聲明變數。
$ cd otp_src_19.1
$ export ERL_TOP=`pwd`
配置:
$ ./configure
如果你不在配置時添加變數指定安裝位置,那麼默認會安裝在 /usr/local/{bin,lib/erlang}中,如果你沒有許可權安裝在此位置,必須在配置時指定安裝安裝位置,如安裝到/opt/erlang/19.1/{bin,lib/erlang}, 用此選項--prefix=/opt/erlang/19.1
如果構建過程中出錯,可能是perl聲明了LANG變數,則你可以修改回來:
$ export LANG=C
然後編譯:
make
測試
make release_tests
在源碼目錄release下創建一個test目錄,然後測試:
$ cd release/tests/test_server
$ $ERL_TOP/bin/erl -s ts install -s ts smoke_test batch -s init stop
用瀏覽器查看源碼目錄下/release/tests/test_server/index.html 的測試報告,一切無誤後,進行安裝。
make install
運行
% erl
Erlang/OTP 17 [erts-6.0] [hipe] [smp:8:8]
Eshell V6.0 (abort with ^G)
1>
如果你還要編譯文檔,則聲明如下兩個變數
$ export PATH=$ERL_TOP/bin:$PATH
$ export FOP_HOME=/path/to/fop/dir
其中,$ERL_TOP變數是源碼目錄。
然後
make docs
驗證正確後,
F. Gcc和llvm編譯器有什麼區別,我這配置哪個快
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。
G. 高通snapdragon-llvm-3.8.3-linux64怎麼使用的
現在A6的情況還不清楚,只好以A5為參照物,籠統的比一下!(這里指的是Iphone4S的A5)
按蘋果官方說法,A6的CPU和GPU性能均為A5的2倍!
而高通四核8064的CPU性能是A5的接近5倍;其GPU性能是A5的2倍以上!
可以說,要論絕對性能的話,8064應該更強,不過,他們用於不同的系統,不能光看硬體性能,應該說他們都夠用了!
H. RHEL linux下llvm的安裝。安裝出現的錯誤如下,怎麼解決或者知道怎麼編譯,教一下。
缺少關聯的文件。
needed by `lib/Target/AArch64/Utils/CMakeFiles/LLVMAArch64Utils.dir/AArch64BaseInfo.cpp.o'.
I. linux編譯安裝後,能不能把build文件夾刪除