前言:
本篇為視頻學(xué)習(xí)筆記
目錄:
一、編譯器流程圖/編譯器
二、Swift與OC\C\C++有什么區(qū)別
三、大概了解一下 Swift 編譯流程
四、swiftc (Swift前端編譯器)
一、編譯器流程圖/編譯器
編譯器
- 1.前端: 詞法分析...
- 2.后端: 生成對(duì)應(yīng)平臺(tái)的二進(jìn)制代碼/對(duì)二進(jìn)制代碼進(jìn)行相應(yīng)的優(yōu)化 (LLVM)
二、Swift與OC\C\C++有什么區(qū)別
如果之前C\OC代碼的話,編譯器前端是Clang,對(duì)OC代碼進(jìn)行相應(yīng)的處理。處理完畢后在轉(zhuǎn)交給編譯器的后端LLVM,最終生成對(duì)應(yīng)架構(gòu)的二進(jìn)制代碼。
Swift編譯器前端就不一樣了,編譯器前端用的是swiftc,先用swiftc對(duì)swift代碼進(jìn)行詞法分析、生成語法樹進(jìn)行處理,處理完畢后,再轉(zhuǎn)交給編譯器后端LLVM,生成對(duì)應(yīng)平臺(tái)的二進(jìn)制代碼。
無論是用OC/Swift編譯器后端都是用的LLVM,想運(yùn)行在iOS系統(tǒng)中或是真機(jī)設(shè)備上,最終生成的都是ARM架構(gòu)代碼。
三、大概了解一下 Swift 編譯流程
一開始是你自己編寫的Swift代碼【Swift Code】,然后再根據(jù)swiftc前端編譯器生成語法樹【Swift AST】,接下來有生成Swift特有的中間代碼【Raw Swift IL】,再生成一個(gè)簡(jiǎn)潔的版本(Swift特有的中間代碼)【Canonical Swift IL】。Swift代碼不是一步到位變成二進(jìn)制代碼的,是有一個(gè)流程。中間代碼生成完畢之后,轉(zhuǎn)交給后端(LLVM),生成一個(gè)【LLVM IR】代碼,它是LLVM的中間代碼。LLVM編譯器又會(huì)針對(duì)IR代碼進(jìn)行相應(yīng)的優(yōu)化。優(yōu)化完畢之后,最終轉(zhuǎn)成匯編代碼【Assembly】,匯編代碼最終變成二進(jìn)制代碼【Executable】。
Swift代碼 -> 語法樹 -> 中間代碼 -> 轉(zhuǎn)交給LLVM -> 匯編代碼 -> 二進(jìn)制代碼
四、swiftc (Swift前端編譯器)
打開終端,直接輸入swiftc,發(fā)現(xiàn)是有反應(yīng)的,說明現(xiàn)在電腦上已經(jīng)有這個(gè)指令了
打印一下 swift -help 你會(huì)發(fā)現(xiàn)很清楚Swift compiler,是一個(gè)swift編譯器,后面跟了各種選項(xiàng)。
- swiftc存放在Xcode內(nèi)部
Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
在bin文件夾中上下滾動(dòng),你會(huì)發(fā)現(xiàn)Clang和swiftc都在Xcode內(nèi)部,這說明了OC/Swift的編譯器的那些指令都在Xcode內(nèi)部。
- 一些操作
- 生成語法樹: swiftc -dump-ast main.swift
- 生成最簡(jiǎn)潔的SIL代碼:swiftc -emit-sil main.swift (swift 特有的中間代碼)
- 生成LLVM IR代碼: swiftc -emit-ir main.swift -o main.ll
- 生成匯編代碼: swiftc -emit-assembly main.swift -o main.s
★ 對(duì)匯編代碼進(jìn)行分析,可以真正掌握編程語言的本質(zhì)
生成語法樹: swiftc -dump-ast main.swift
1.打開Xcode新建名為TestSwift一個(gè)命令行項(xiàng)目,會(huì)自動(dòng)為我們生成一個(gè)main.swift
2.選擇main.swift,右鍵show in finder 在終端cd + main.Swift地址
3.明白自己做什么,導(dǎo)出語法樹看看,輸入swiftc -dump-ast main.swift
4.將語法樹導(dǎo)出到另一文件(main.ast)中去,不倒入的話會(huì)在終端中顯示swiftc -dump-ast main.swift -o main.ast
生成最簡(jiǎn)潔的SIL代碼:swiftc -emit-sil main.swift
生成LLVM IR代碼: swiftc -emit-ir main.swift -o main.ll
生成匯編代碼: swiftc -emit-assembly main.swift -o main.s
image.png