本文主要了解什么是Swift驮审,有哪些優(yōu)勢。了解Swift編譯流程窿撬。
主要內(nèi)容:
- 了解Swift
- 編譯流程
1. 了解Swift
Swift是Apple在2014年6月WWDC發(fā)布的全新編程語言,中文名和logo是“雨燕”。
Swift是一種高性能的系統(tǒng)編程語言撇叁。它擁有干凈而現(xiàn)代的語法,提供了對現(xiàn)有C和Objective-C代碼和框架的無縫訪問畦贸,并且默認(rèn)是內(nèi)存安全的陨闹。
盡管受到Objective-C和其他語言的啟發(fā),Swift本身并不是c衍生語言薄坏。作為一門完整而獨(dú)立的語言趋厉,Swift包下了流控制、數(shù)據(jù)結(jié)構(gòu)和函數(shù)等核心特性胶坠,以及對象君账、協(xié)議、閉包和泛型等高級結(jié)構(gòu)涵但。Swift更多的使用模塊杈绸,消除了對header的需要和它們帶來的代碼重復(fù)。初學(xué)者可以不用了解C或OC矮瘟,直接學(xué)習(xí)Swift瞳脓。
Swift的語法更加簡潔,得益于編譯器的強(qiáng)大澈侠,語法簡潔功能又強(qiáng)大劫侧。同時(shí)Swift是一門類型安全的語言,在安全方面下了很大的功夫。
Swift提供了Playground進(jìn)行代碼預(yù)覽烧栋,可以很方便的學(xué)習(xí)語法写妥。
Swift和OC可以混編,更方便過渡审姓。
Swift完全開源:https://github.com/apple/swift,主要采用C++編寫
2. 編譯流程
2.1 編譯器架構(gòu)
編譯過程和OC基本一樣珍特,僅僅是前端編譯器不一樣。因此詳細(xì)過程可以查看博客編譯流程詳細(xì)認(rèn)識
- 前端編譯器swiftc將源代碼生成語法樹魔吐,再生成IL扎筒,之后輸出為LLVM通用的IR。
- 優(yōu)化器LLVM Optimizer進(jìn)行各種優(yōu)化酬姆,改善代碼運(yùn)行時(shí)間嗜桌。再次輸出IR
- 后端編譯器LLVM Code Generator接收到IR,將代碼映射到目標(biāo)指令集辞色,生成二進(jìn)制代碼骨宠。
可以看出來,LLVM的設(shè)計(jì)理念就是前后端分離相满。只要提供不同的前端編譯器就可以兼容不同的語言层亿。只要提供不同的后端編譯器,就可以兼容不同的硬件架構(gòu)雳灵。使用中間語言IR做到兼容棕所。
2.2 編譯詳細(xì)過程
創(chuàng)建一個(gè)簡單的Swift源文件,下面將編譯過程執(zhí)行一遍悯辙,具體的查看每一步的運(yùn)行結(jié)果
import Foundation
let i = 1
let j = 2
i + j
2.2.1 生成語法樹
swiftc -dump-ast main.swift
說明:
- 語法分析程序判斷程序在結(jié)構(gòu)上是否正確琳省,它的任務(wù)是驗(yàn)證語法是否正確
- 在詞法分析的基礎(chǔ)上將單詞序列組合成各類此法短語,如程序躲撰、語句针贬、表達(dá)式 等等
- 然后將所有節(jié)點(diǎn)組成抽象語法樹AST(Abstract Syntax Tree)
- 這里還會將警告報(bào)錯(cuò)顯示出來,比如我只進(jìn)行了運(yùn)算但是沒有賦值拢蛋,所以會有 is unused的警告
- 大體分為三部分桦他,第一部分是i的定義,第二部分是j的定義谆棱,第三部分是加法運(yùn)算
- 加法運(yùn)算可以看到是調(diào)用了一個(gè)函數(shù)類型為
(Int, Int) -> Int
的函數(shù)來執(zhí)行的快压,而該函數(shù)在后面又進(jìn)行說明是.+。參數(shù)傳遞的是i和j垃瞧。 - 因此對語法樹的簡單分析可以看到就是針對所有的結(jié)構(gòu)進(jìn)行語法檢查蔫劣。最后形成一個(gè)抽象語法樹
2.2.2 生成IL代碼
swiftc -emit-sil main.swift
說明:
- 這里生成的IL代碼,和匯編很類似个从,這里僅僅簡單了解脉幢,也沒必要對每條語句進(jìn)行分析歪沃。
- 大體上可以看到是在寄存器上對i和j進(jìn)行存儲,之后取出進(jìn)行計(jì)算嫌松。
2.2.3 生成IR代碼
swiftc -emit-ir main.swift -o main.ll
說明:
- 執(zhí)行后沪曙,會得到一個(gè)main.ll文件
- 在文件中就是IR代碼。這里也是和匯編類似萎羔。
- 將語法樹自頂向下遍歷逐步翻譯成LLVM IR液走。
- 拿到IR后,就可以讓后端編譯器執(zhí)行贾陷,最后會變成二進(jìn)制文件育灸。
2.2.4 生成匯編代碼
swiftc -emit-assembly main.swift -o main.s
說明:
- 這里為了簡單,把加法運(yùn)算刪掉了昵宇。
- 只查看兩個(gè)值的定義。通過movq給i和j分別賦值
- 關(guān)于匯編的認(rèn)識后面文章會分析儿子,這里僅簡單的查看
2.2.5 生成二進(jìn)制文件
swiftc -o main.out main.swift
說明:
- 對匯編文件進(jìn)行匯編操作就得到了目標(biāo)文件(.o文件)
- 匯編器將匯編代碼轉(zhuǎn)換為機(jī)器代碼瓦哎,最后輸出目標(biāo)文件(object file)