一、概述
本系列文章旨在复习Swift5
核心语法且适当进行底层原理探索,属于阶段性复习和巩固,以供日后进一步探索Swift
语言的底层原理做铺垫。
整个系列文章如下,每一文章知识点独立成篇,欢迎各位按需或按兴趣点击阅读:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
二、Swift简介
1. Swift
在学习Swift之前,我们先来了解下什么是Swift
- 在Swift刚发布那会,百度\Google一下Swift,出现最多的搜索结果是 p美国著名女歌手
Taylor Swift
,中国歌迷称她为“霉霉” - 现在的搜索结果以Swift编程语言相关的内容居多
- Swift是
Apple
在2014年6月WWDC
发布的全新编程语言,中文名和LOGO是”雨燕“
2. Swift之父Chris Lattner
- Swift之父是
Chris Lattner
- 是
Clang
编译器的作者,LLVM
项目的主要发起人 - 从Apple离职后,先后跳槽到Tesla、Google
- 目前在Google Brain从事AI研究
- 是
- 如果你想了解一下LLVM、Clang等知识,也可以参考一下我这篇文章:
- 探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM、Xcode编译的过程】
三、Swift版本
Swift历时8年,从Swift 1.*
更新到Swift 5.*
,经历了多次重大改变,ABI
终于稳定
- API(Application Programming Interface):应用程序编程接口
源代码和库之间
的接口
- ABI(Application Binary Interface):应用程序二进制接口
- 应用程序和操作系统之间的底层接口
- 涉及的内容有:
目标文件格式
、数据类型的大小
/布局
/对齐
,函数调用约定
等
- 随着ABI的稳定,Swift语法基本不会再有太大的变动,此时正是学习Swift的最佳时刻
- 截止至2022年11月,目前最新版本:
Swift5.8.x
- Swift完全开源: github.com/apple/swift 主要采用C++编写
- Swift是完全开源的,下载地址:github.com/apple/swift
四、Swift编译原理
1. 了解LLVM项目
LLVM
项目的架构如图: 从上图我们可以清晰看到,整个程序编译链可以划分为三部分:编译器前端
(左边部分)、优化器
(中间部分)、编译器后端
(右边部分)。(从我的这篇文章可以更详细了解编译相关的知识:计算机编译原理)
- 编译器前端(Frontend) :
词法分析
、语法分析
、语义分析
、生成中间代码llvm-ir
- 优化器(Optimizer) :对中间代码进行
优化
、改造
,使之变成性能更加高效的中间代码llvm-ir(内存空间、执行效率) - 编译器后端(Backend) :生成
指定硬件架构的可执行文件
对编译器王者LLVM
的进一步认识:
- 使用统一的中间代码: 不同的编译器前端、编译器后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
- 只需实现一个前端: 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
- 只需实现一个后端: 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
- 通用优化器: 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
2. 编译流程
我们知道OC的编译器前端是Clang
,而Swift的编译器前端是swiftc
通过LLVM编译链,不同的编译型语言的编译器前端可能不同,但在同一个硬件架构的硬件中,最终都会通过同一个编译器的后端生成二进制代码
整个编译流程如下图所示
- 代码编辑/阅读阶段:
- Swift Code: 我们编写的Swift代码
- 编译器前端工作阶段:
- Swift AST: Swift语法树
- Raw Swift IL: Swift特有的中间代码
- 优化器工作阶段:
- Canonical Swift IL: 更简洁的Swift特有的中间代码
- LLVM IR: LLVM的中间代码
- 编译器后端工作阶段:
- Assembly: 汇编代码
- Executable: 二进制可执行文件
关于Swift编译流程的详细讲解可以参考以下网址:swift.org/swift-compi…
3. swiftc
我们打开终端,输入swiftc -help
,会打印出相关指令,这也说明了swiftc
已经存在于Xcode中
我们可以在应用程序中找到Xcode
,然后右键显示包内容
,通过该路径找到swiftc
路径:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
4. SwiftC
命令行指令
// 假设原始文件为main.swift
// 分析输出AST
swiftc main.swift -dump-parse
// 分析并且检查类型输出AST
swiftc main.swift -dump-ast
// 生成中间体语言(SIL),未优化
swiftc main.swift -emit-silgen -o main.sil
// 生成中间体语言(SIL),优化后的
swiftc main.swift -emit-sil -o main.sil
// 生成优化后的中间体语言(SIL),并将结果导入到main.sil文件中
swiftc main.swift -emit-sil -o main.sil
// 生成优化后的中间体语言(SIL),并将sil文件中的乱码字符串进行还原,并将结果导入到main.sil文件中
swiftc main.swift -emit-sil | xcrun swift-demangle > main.sil
// 生成LLVM中间体语言 (.ll文件)
swiftc main.swift -emit-ir -o main.ir
// 生成LLVM中间体语言 (.bc文件)
swiftc main.swift -emit-bc -o main.bc
// 生成汇编
swiftc main.swift -emit-assembly -o main.s
// 编译生成可执行.out文件
swiftc main.swift -o main.o
5.更详尽的iOS编译相关的知识
在本篇文章中,只是粗略介绍Swift编译,若您想了解 更详尽的iOS编译相关的知识,可以参考我这篇文章:探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM、Xcode编译的过程】
五、Swift中的函数派发方式
Swift既有静态语言特性,又有动态语言特性。它的有几种函数派发方式
- 静态派发
- 值类型(enum、struct),在编译器就决定了其属性、方法的内存地址。
- 使用的时候直接寻址调用
- 动态派发
-
- 继承自OC的NSObject类,共用一套Runtime,走objcmsgSend的消息派发
-
- 底层是基于 C++写的,有虚函数表,在表中找到函数的实现,进行动态派发 参考文章
-
- Swift 函数派发机制
- Swift的静态派发和动态派发机制
专题系列文章
1. 前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数
、枚举
、可选项
、结构体
、类
、闭包
、属性
、方法
、swift多态原理
、String
、Array
、Dictionary
、引用计数
、MetaData
等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案