iOS編譯原理

What is LLVM?

LLVM編譯

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.

  • The LLVM Project 是模塊化、可重用的編譯器和工具鏈技術(shù)的集合
  • LLVM 包含多個(gè)子項(xiàng)目。其中包括我們熟悉的Clang雌澄、LLDB

command+B 后做了什么脸哀?

Clang編譯流程

前端

  • 預(yù)處理(Pre-process):他的主要工作就是將宏替換嫁乘,刪除注釋展開(kāi)頭文件,生成.i文件球碉。
  • 詞法分析(Lexical Analysis):將代碼切成一個(gè)個(gè) token蜓斧,比如大小括號(hào),等于號(hào)還有字符串等睁冬。是計(jì)算機(jī)科學(xué)中將字符序列轉(zhuǎn)換為標(biāo)記序列的過(guò)程挎春。
  • 語(yǔ)法分析(Semantic Analysis):驗(yàn)證語(yǔ)法是否正確,然后將所有節(jié)點(diǎn)組成抽象語(yǔ)法樹(shù) AST 豆拨。Clang 中 Parser 和 Sema 配合完成
  • 靜態(tài)分析(Static Analysis):使用它來(lái)表示用于分析源代碼以便自動(dòng)發(fā)現(xiàn)錯(cuò)誤直奋。
  • 中間代碼生成(Code Generation):開(kāi)始IR中間代碼的生成了,CodeGen 會(huì)負(fù)責(zé)將語(yǔ)法樹(shù)自頂向下遍歷逐步翻譯成 LLVM IR施禾,IR 是編譯過(guò)程的前端的輸出后端的輸入脚线。

后端

  • 優(yōu)化(Optimize):LLVM 會(huì)去做些優(yōu)化工作,在 Xcode 的編譯設(shè)置里也可以設(shè)置優(yōu)化級(jí)別-01弥搞,-03邮绿,-0s,還可以寫(xiě)些自己的 Pass攀例,官方有比較完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 船逮。如果開(kāi)啟了 bitcode 蘋(píng)果會(huì)做進(jìn)一步的優(yōu)化,有新的后端架構(gòu)還是可以用這份優(yōu)化過(guò)的 bitcode 去生成粤铭。
  • 生成目標(biāo)文件(Assemble):蘋(píng)果平臺(tái)生成Mach-O
  • 鏈接(Link):生成 Executable 可執(zhí)行文件挖胃。

What is Clang?

Apple’s official for the C language family
C
C++
Objective-C
Objective-C++

C編譯1
C編譯2

What is Swiftc?

The Swift compiler is principally responsible for translating Swift source code into efficient, executable machine code. However, the Swift compiler front-end also supports a number of other tools, including IDE integration with syntax coloring, code completion, and other conveniences.

  • Swift編譯器主要負(fù)責(zé)將Swift源代碼翻譯成高效、可執(zhí)行的機(jī)器碼
  • Swift編譯器前端還支持許多其他工具梆惯,包括與語(yǔ)法著色酱鸭、代碼完成和其他便利集成的IDE
  • 最終輸出LLVM IR至LLVM后端,持續(xù)優(yōu)化并生成機(jī)械碼
Swift編譯1.png
  • 采用模塊化編譯而非引用編譯
  • 同一模塊編譯流程中只有詞法分析(Parsing)是重復(fù)執(zhí)行的
  • 同一模塊下多文件詞法分析結(jié)果將會(huì)共享加袋,即無(wú)需聲明式的引用文件
Swift編譯2.png
  • swift編譯器將clang作為一個(gè)共享庫(kù)的方式引用凛辣,用于混編oc代碼

Swiftc主要編譯流程

Swift編譯流程
  • Parsing: The parser is a simple, recursive-descent parser (implemented in lib/Parse) with an integrated, hand-coded lexer. The parser is responsible for generating an Abstract Syntax Tree (AST) without any semantic or type information, and emit warnings or errors for grammatical problems with the input source.

  • Semantic analysis: Semantic analysis (implemented in lib/Sema) is responsible for taking the parsed AST and transforming it into a well-formed, fully-type-checked form of the AST, emitting warnings or errors for semantic problems in the source code. Semantic analysis includes type inference and, on success, indicates that it is safe to generate code from the resulting, type-checked AST.

  • Clang importer: The Clang importer (implemented in lib/ClangImporter) imports Clang modules and maps the C or Objective-C APIs they export into their corresponding Swift APIs. The resulting imported ASTs can be referred to by semantic analysis.

  • SIL generation: The Swift Intermediate Language (SIL) is a high-level, Swift-specific intermediate language suitable for further analysis and optimization of Swift code. The SIL generation phase (implemented in lib/SILGen) lowers the type-checked AST into so-called “raw” SIL. The design of SIL is described in docs/SIL.rst.

  • SIL guaranteed transformations: The SIL guaranteed transformations (implemented in lib/SILOptimizer/Mandatory) perform additional dataflow diagnostics that affect the correctness of a program (such as a use of uninitialized variables). The end result of these transformations is “canonical” SIL.

  • SIL Optimizations: The SIL optimizations (implemented in lib/Analysis, lib/ARC, lib/LoopTransforms, and lib/Transforms) perform additional high-level, Swift-specific optimizations to the program, including (for example) Automatic Reference Counting optimizations, devirtualization, and generic specialization.

  • LLVM IR Generation: IR generation (implemented in lib/IRGen) lowers SIL to LLVM IR, at which point LLVM can continue to optimize it and generate machine code.

參考文獻(xiàn):

What is Swift Compiler
Modules

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市职烧,隨后出現(xiàn)的幾起案子扁誓,更是在濱河造成了極大的恐慌防泵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗敢,死亡現(xiàn)場(chǎng)離奇詭異捷泞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)寿谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)锁右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人讶泰,你說(shuō)我怎么就攤上這事咏瑟。” “怎么了痪署?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵码泞,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狼犯,道長(zhǎng)余寥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任悯森,我火速辦了婚禮宋舷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓢姻。我一直安慰自己祝蝠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布汹来。 她就那樣靜靜地躺著续膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪收班。 梳的紋絲不亂的頭發(fā)上坟岔,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音摔桦,去河邊找鬼社付。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邻耕,可吹牛的內(nèi)容都是我干的鸥咖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兄世,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啼辣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起御滩,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸥拧,失蹤者是張志新(化名)和其女友劉穎党远,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體富弦,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沟娱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕柜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片济似。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盏缤,靈堂內(nèi)的尸體忽然破棺而出砰蠢,到底是詐尸還是另有隱情,我是刑警寧澤唉铜,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布娩脾,位于F島的核電站,受9級(jí)特大地震影響打毛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俩功,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一幻枉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诡蜓,春花似錦熬甫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豺谈,卻和暖如春郑象,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茬末。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工厂榛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丽惭。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓击奶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親责掏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柜砾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 2000年,伊利諾伊大學(xué)厄巴納-香檳分校(University of Illinois at Urbana-...
    星光社的戴銘閱讀 15,892評(píng)論 8 180
  • 關(guān)鍵詞: , , , , , , 編譯器 把一種編程語(yǔ)言(原始語(yǔ)言)轉(zhuǎn)換為另一種編程語(yǔ)言(目標(biāo)語(yǔ)言)的程序叫做編譯...
    Jack1105閱讀 1,186評(píng)論 0 4
  • 引言 維基百科: 編譯語(yǔ)言(英語(yǔ):Compiled language)是一種以編譯器來(lái)實(shí)現(xiàn)的編程語(yǔ)言换衬。它不像解釋型...
    素還真人閱讀 2,254評(píng)論 0 7
  • 引言 維基百科:編譯語(yǔ)言(英語(yǔ):Compiled language)是一種以編譯器來(lái)實(shí)現(xiàn)的編程語(yǔ)言痰驱。它不像解釋型語(yǔ)...
    Flame_Dream閱讀 8,561評(píng)論 5 52
  • Swift編譯 Swift編譯究竟是一個(gè)怎樣的過(guò)程呢证芭?從Swift語(yǔ)言到cpu能夠識(shí)別的機(jī)器碼這之間究竟經(jīng)過(guò)了哪些...
    HotPotCat閱讀 744評(píng)論 0 2