龔丹 蘇小紅 王甜甜
摘要:當(dāng)前用戶對軟件產(chǎn)品在功能上、體驗上的需求多種多樣,這就對軟件開發(fā)和維護(hù)的時效性要求越來越高。作為軟件開發(fā)中使用的主流語言——C家族的編程語言,若要在激烈的競爭中保持住自己的主流地位,其支撐平臺和工具也需要不斷尋求快速、輕量、易于剪裁等方面的突破。Clang源自于伊利諾伊大學(xué)的LLVM研究項目,并有蘋果公司的開發(fā)支持,是一款革新性的c家族語言編譯器。Clang不僅在編譯速度上普遍比傳統(tǒng)的編譯器快,并且其基于庫的體系結(jié)構(gòu),使得Clang易于剪裁、體量輕盈,同時,還具有強大的動、靜態(tài)分析功能,發(fā)布不到十年,已經(jīng)得到了軟件開發(fā)和維護(hù)專業(yè)人員的廣泛認(rèn)可。
關(guān)鍵詞:軟件開發(fā);編譯器;語法分析;抽象語法樹
0引言
Clang是LLVM項目的一個子項目。LLVM的命名最早源自于底層虛擬機(Low Level Virtual Machine)的縮寫,但是其工作卻并未直接針對傳統(tǒng)的虛擬機,而是旨在提供一種既支持靜態(tài)編譯又支持動態(tài)編譯,同時也不受編程語言限定制約的編譯策略。隨著這個項目的不斷發(fā)展,LLVM已經(jīng)無法完全指征與代表這一項目了,只是這種叫法一直延續(xù)下來。目前,LLVM包含了很多的子項目,其中最具盛名的就是Clang。
Clang最主要的追求目的即是快速編譯。由于GNU編譯器套裝(GCC)系統(tǒng)龐大,而且蘋果公司(Apple)主要使用的Obiecfive-C在GCC中優(yōu)先級較低,同時GCC作為一個純粹的編譯系統(tǒng),與集成開發(fā)環(huán)境(Integrated Development Environment,IDE)的配合也未可堪稱優(yōu)良,因此Apple決定從零開始寫C的前端,也就是基于LLVM的Clang了。在提供快速的編譯工作基礎(chǔ)上,各種源代碼級工具的開發(fā)將得到極大的益處。從源上說,Clang結(jié)構(gòu)更簡單,只需要實現(xiàn)詞法和語法分析,代碼優(yōu)化和機器代碼的生成工作均由LLVM執(zhí)行完成。所以比起全部集成包攬的GCC來說,Clang可以更為專注地研發(fā)和推進(jìn)一件事情直至成功。這種結(jié)構(gòu)也使Clang可以獨立引用并運行在其他的程序里。比如XavierDeguillard發(fā)布的vim插件Clang_complete就是利用Clang進(jìn)行語法分析后給出精確的自動補全和語法錯誤提示的。
1Clang的特性
提供快速的編譯則編譯平臺本身不能是笨重的,因此Clang的開發(fā)選用了一種基于庫(library-based)的體系結(jié)構(gòu),這即使得在不同的應(yīng)用需求下,開發(fā)人員可以隨意裁剪使用相應(yīng)的庫,從而靈活搭建輕量級的、有伸縮性的工具。具體而言,Clang的特性有6個方面:可伸縮性好、支持多樣性的應(yīng)用,快速編譯、低內(nèi)存占用,診斷信息表達(dá)能力強,與IDE結(jié)合緊密,與GCC兼容,以及使用BSD開源許可。下面將分別對其展開闡釋與概述。
1)可伸縮性好、支持多樣性應(yīng)用。Clang的核心設(shè)計概念是其使用基于庫的體系結(jié)構(gòu)。前端的各個部分被分割到不同的庫中,可以根據(jù)不同的使用場景進(jìn)行適配組合。當(dāng)前Clang被分為10個庫(見表1)和1個Clang驅(qū)動程序。Clang的各個庫之間功能獨立、接口清晰,如開發(fā)一個預(yù)處理器,則只需要組裝libbasic庫和liblex庫。