一、一些基本概念
-
API:Application Programming Interface 应用程序编程接口(源代码和库之间的接口)
-
ABI:Application Binary Interface 应用程序二进制接口 (应用程序与操作系统之间的底层接口,这个稳定了,也就说明Swift版本语言也就稳定了)
-
Object-C:开发语言
-
Swift:开发语言
-
Clang:作为编译器的前端(说白了就是编译器)
-
SwiftC:作为编译器的前端(说白了就是编译器)
-
LLVM:作为编译器的后端
-
x86:架构
-
ARM:架构
扩展:ABI的稳定,也就意味着Swift语法基本不会有太大的变化了
二、Swift编译流程
- 1.编译器
a.前端:OC的编译器是Clang,Swift的编译器是SwiftC(主要执行词法分析、生成语法树等等)
b.后端:LLVM(主要执行生成对应平台的二进制代码) - 2.编译流程
a.OC:将OC转化为C,然后通过编译器前端Clang进行处理,处理后交给LLVM,最终生成对应架构的二进制代码,就是ARM
b.Swift:Swift代码通过编译器前端SwiftC进行处理,处理后交给LLVM,最终生成对应架构的二进制代码,就是ARM
Swift编译流程详细:
SwiftCode代码 -> Swift AST语法树 -> Raw Swift IL特有中间代码 -> Canonical Swift IL特有简洁中间代码 -> LLVM IR中间代码 -> Assembly汇编代码 -> Executable二进制
三、查看汇编语言
-
SwiftC是编译器的前端,那么这个编译器在我们的电脑哪里呢?
XCode/Contents/Developer/Toolchains/XCodeDefault.xctoolchain/user/bin(一层一层找一下吧,可能直接输入这个路径找不到哦)
-
利用SwiftC的一些操作
1.新建一个Swift命令行项目
2.终端cd到项目文件路径中
3.1.生成语法树:swiftc -dump-ast xxx.swift
3.2.生成SIL最简洁代码:swiftc -emit-sil xxx.swift
3.3.生成LLVM IR代码:swiftc -emit-ir xxx.swift -o xxx.ll
3.4.生成汇编代码:swiftc -emit -assembly main.swift -o main.s(这个很重要,可以看底层它都做了什么事情)
3.5.*** XCode下断点、工具栏选择Debug、Debug Workflow、Always Show Disassembly
- 简单分析汇编语言
1.源码:(OC项目举例,Swift同理哦)
int c = sizeof(int);
2.生成汇编代码:(如何生成,参考上面👆3.5的操作噢~)
0x100000f3b <+27>: movl $0x4, -0x14(%rbp)
3.开始分析:
-0x14(%rbp):这个是变量c的内存空间
$0x4:立即数,4,说白了就是将4赋值给c
4.浅层扩展:
int c = sizeof(int); 等价与 int c = 4;
5.深度扩展:
callq:这代表的是函数调用
movl:mov long - 字长传送 - 32位
movw:mov word:字传送 - 16位
movb:mov byte:字节传送 - 8位
addq:加法指令
网友评论