Swift簡介
在學(xué)習(xí)Swift之前,我們先來了解下什么是Swift
Swift是Apple 在2014年6月WWDC 發(fā)布的全新編程語言,中文名和LOGO是”雨燕“
Swift之父是Chris Lattner ,也是Clang 編譯器的作者,LLVM 項(xiàng)目的主要發(fā)起人
Swift版本
Swift歷時(shí)七年,從Swift 1.* 更新到Swift 5.* ,經(jīng)歷了多次重大改變,ABI 終于穩(wěn)定
API(Application Programming Interface):應(yīng)用程序編程接口
ABI(Application Binary Interface):應(yīng)用程序二進(jìn)制接口
- 應(yīng)用程序和操作系統(tǒng)之間的底層接口
- 涉及的內(nèi)容有:目標(biāo)文件格式、數(shù)據(jù)類型的大小/布局/對齊,函數(shù)調(diào)用約定等
Swift是完全開源的,下載地址:https://github.com/apple/swift
Swift編譯原理
LLVM編譯器
LLVM編譯器一般分為前端和后端
- 前端:主要進(jìn)行詞法分析,生成語法樹
- 后端:生成對應(yīng)平臺的二進(jìn)制代碼
編譯流程
我們知道OC的前端是通過Clang 進(jìn)行編譯的,Swift的前端是通過swiftc 來編譯的
不同語言的前端可能不同,但最終都會通過編譯器的后端生成對應(yīng)平臺的二進(jìn)制代碼

整個(gè)編譯流程如下圖所示

- Swift Code:我們編寫的Swift代碼
- Swift AST:Swift語法樹
- Raw Swift IL:Swift特有的中間代碼
- Canonical Swift IL:更簡潔的Swift特有的中間代碼
- LLVM IR:LLVM的中間代碼
- Assembly:匯編代碼
- Executable:二進(jìn)制代碼
關(guān)于Swift編譯流程的詳細(xì)講解可以參考以下網(wǎng)址:https:///swift-compiler/#compiler-architecture
swiftc
我們打開終端,輸入swiftc -help ,會打印出相關(guān)指令,這也說明了swiftc 已經(jīng)存在于Xcode中

我們可以在應(yīng)用程序中找到Xcode ,然后右鍵顯示包內(nèi)容 ,通過該路徑找到swiftc
路徑:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin


swiftc的基本操作演練
下面我們可以通過一些swiftc 的一些基本操作來了解
1.我們先新建一個(gè)Swift的命令行項(xiàng)目


2.然后打開終端,cd 到main.swift 路徑

3.然后我們輸入swiftc -dump-ast main.swift ,來查看下生成的語法樹

4.我們還可以輸入swiftc -emit-sil main.swift 生成最簡潔的SIL代碼

5.我們還可以輸入swiftc -emit-ir main.swift 生成LLVM IR中間代碼

6.我們還可以輸入swiftc -emit-assembly main.swift 生成匯編代碼

Swift基礎(chǔ)語法
Swift中打印輸入:print("Hello World")
Swift中一句代碼是可以省略分號的,但是如果多句代碼寫在一行,需要用分號隔開
Swift不用編寫main函數(shù) ,會以全局范圍內(nèi)的首句可執(zhí)行代碼作為入口來執(zhí)行
通過反匯編我們可以看到底層會執(zhí)行main函數(shù)

常量和變量
常量:
1.用let 定義常量,常量只能賦值一次
不用特意指明類型,編譯器會自動(dòng)進(jìn)行推斷
let a: Int = 10
let b = 20
2.它的值不要求在編譯過程中確定,但使用之前必須賦值一次
這樣寫確定了a的類型,之后再去賦值,也不會報(bào)錯(cuò)
let a: Int
a = 10
用函數(shù)給常量賦值也可以,函數(shù)是在運(yùn)行時(shí)才會確定值的,所以只要保證使用之前賦值了就行
func getNumber() -> Int {
return 10
}
let a: Int
a = getNumber()
如果沒有給a確定類型,也沒有一開始定義的時(shí)候賦值,就會像下面這樣報(bào)錯(cuò)

變量:
1.用var 定義變量
var b = 20
b = 30
2.常量、變量在初始化之前,都不能使用

注釋
1.Swift中有單行注釋和多行注釋
注釋之間嵌套也沒有問題
// 單行注釋
/*
多行注釋
/*
多行注釋
*/
/*
// 注釋嵌套
*/
2.Playground 里的注釋支持Markup 語法(同Markdown)
Markup 語法只在Playground 里有效,在項(xiàng)目中無效
//: # 一級標(biāo)題
/*:
## 基礎(chǔ)語法
*/
可以通過Editor -> Show Raw Markup 來預(yù)覽

預(yù)覽的效果如下

標(biāo)識符
1.標(biāo)識符(比如常量名、變量名、函數(shù)名)幾乎可以使用任何字符
let
|