自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS前端編譯器擴(kuò)展——Clang

移動(dòng)開發(fā) iOS
Clang在iOS代碼編譯中主要用于C/C++、Objective-C的前端編譯工作,Clang屬于llvm編譯鏈的一部分,是llvm的前端編譯器。

Part 01、了解Clang   

眾所周知,編譯器一般分為前端和后端,編譯器前端主要負(fù)責(zé)預(yù)處理、詞法分析、語(yǔ)法分析、語(yǔ)法檢查、生成中間代碼等與底層計(jì)算機(jī)架構(gòu)無(wú)關(guān)的工作。

后端以中間代碼為輸入,首先進(jìn)行架構(gòu)無(wú)關(guān)的代碼優(yōu)化,之后針對(duì)不同的機(jī)器架構(gòu)生成不同的機(jī)器碼,進(jìn)行匯編鏈接。

圖片

Clang在iOS代碼編譯中主要用于C/C++、Objective-C的前端編譯工作,Clang屬于llvm編譯鏈的一部分,是llvm的前端編譯器。我們可以通過(guò)Clang開放出來(lái)的API接口對(duì)源碼進(jìn)行自定義處理,如靜態(tài)代碼檢查、編譯流程控制、代碼查找提示補(bǔ)全等功能。Clang工具針對(duì)的對(duì)象正是AST——語(yǔ)法分析的結(jié)果,抽象語(yǔ)法樹(abstract syntax tree)。

一個(gè)AST的簡(jiǎn)單例子:

圖片


Clang工具可以遍歷讀取AST上的每一個(gè)節(jié)點(diǎn),并對(duì)節(jié)點(diǎn)對(duì)應(yīng)的代碼進(jìn)行查詢、修改操作。Clang插件更能夠直接集成進(jìn)iOS的編譯流程中,控制輸出自定義的編譯告警、錯(cuò)誤,控制編譯流程。

Part 02、Clang工具的選擇  

Clang大體包含三種不同的工具,libClang、Clang插件和libTooling。Clang插件和libTooling代碼類似,關(guān)于AST的所有信息都通過(guò)ASTContext上下文返回,并且對(duì)AST有完全的控制權(quán)。而libClang不同,它通過(guò)封裝好的穩(wěn)定高層C API進(jìn)行訪問,利用Cursor和Token遞歸遍歷,不能對(duì)AST進(jìn)行完全控制。三者的優(yōu)缺點(diǎn)如下:

1. libClanglibClang是針對(duì)Clang的穩(wěn)定高層C語(yǔ)言封裝,當(dāng)你無(wú)需對(duì)AST進(jìn)行完全控制時(shí),libClang是使用最簡(jiǎn)單最合適的工具,應(yīng)該首先考慮使用。其次,它只能作為獨(dú)立工具使用,不能嵌入當(dāng)前項(xiàng)目的編譯流程。

  • 優(yōu)點(diǎn):可以使用XCode或Python進(jìn)行集成開發(fā),擁有穩(wěn)定的高層API,使用簡(jiǎn)單;
  • 缺點(diǎn)不能全量控制AST,不能嵌入編譯流程。

2. Clang插件Clang插件允許在代碼的編譯流程中額外插入一些操作,比如在編譯的過(guò)程中打印特殊字符或者警告,甚至中斷編譯。

  • 優(yōu)點(diǎn):能夠嵌入編譯流程開啟或中斷編譯,打印自定義告警和錯(cuò)誤,并對(duì)AST進(jìn)行全量控制;
  • 缺點(diǎn):代碼編寫復(fù)雜,集成Clang插件會(huì)降低原本的編譯速度。?

3. libToolinglibTooling是一個(gè)基于C的用于編寫?yīng)毩⒐ぞ叩腃lang工具,這點(diǎn)類似于libClang,但是它只能用C編寫并且功能更強(qiáng)大,對(duì)AST能夠全量控制。

  • 優(yōu)點(diǎn):對(duì)工程文件全量的處理,對(duì)AST的全量控制;
  • 缺點(diǎn):不能嵌入編譯流程,對(duì)Clang的升級(jí)較為敏感,API不穩(wěn)定。

這三個(gè)工具,從上到下,兼容性越來(lái)越差,對(duì)Clang升級(jí)變化越來(lái)越敏感,使用越來(lái)越復(fù)雜,但是功能越來(lái)越強(qiáng)大。

Part 03、Clang的具體應(yīng)用 

在和家親中Clang的應(yīng)用正在初步展開,我們使用libClang遍歷項(xiàng)目中的每一個(gè)源文件,找到項(xiàng)目中所有關(guān)于圖片名稱的字符串描述,圖片名稱往往以固定字符串的形式出現(xiàn),從而判斷在我們的工程中,哪些圖片已經(jīng)被使用而哪些已經(jīng)沒有在用了,進(jìn)行包的大小優(yōu)化。

我們使用Clang插件對(duì)已在工程中定義的卻沒有在工程中使用的類、方法進(jìn)行告警提示。方法是:首先利用Clang插件的VisitObjCInterfaceDecl和VisitObjCMethodDecl方法找出工程中所有的類定義和方法定義,再利用VisitObjCMessageExpr和VisitObjCSelectorExpr找到所有的消息發(fā)送,在iOS中方法的調(diào)用是通過(guò)消息發(fā)送的形式進(jìn)行的,對(duì)于那些沒有在消息發(fā)送列表中出現(xiàn)的類和方法,我們認(rèn)為這些類和方法未被使用,從而直接在編譯的時(shí)候進(jìn)行告警提示。將插件在編譯器中集成即可使用。

圖片


責(zé)任編輯:龐桂玉 來(lái)源: 移動(dòng)Labs
相關(guān)推薦

2018-03-06 14:33:21

Windows微軟編譯器

2020-11-03 10:32:22

編譯器工具代碼

2022-03-28 10:25:27

前端文件編譯器

2018-04-13 10:56:14

編譯器工具開發(fā)者

2016-12-12 14:19:59

LLVMClangApple

2010-01-18 10:34:21

C++編譯器

2017-09-01 11:35:37

C++語(yǔ)言編譯器

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語(yǔ)言編譯開發(fā)

2010-01-21 09:11:38

C++編譯器

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者

2010-09-16 15:57:25

Java編譯器

2010-03-02 10:55:47

Linux SkyEy

2009-08-06 14:59:36

C#編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2011-05-18 11:06:25

java編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)