站在汇编角度深入了解 Swift(一)

936 阅读1分钟

API & ABI

  • API(Application Programming Interface): 应用程序编程接口

    • 源代码与库之间的接口
  • ABI(Application Binary Interface): 应用程序二进制接口

    • 应用程序与操作系统之间的底层接口
    • 涉及的内容有:目标内容格式、数据类型的大小、布局、对齐,函数调用约定等等

swiftc

  • swiftc 存放在 Xcode 内部
Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
  • 一些操作
    • 生成语法树
    swiftc -dump-ast main.swift
    
    • 生成最简洁的 SIL 代码
    swiftc -emit-sil main.swift
    
    • 生成 LLVM IR 代码
    swiftc -emit-ir main.swift -o main.ll
    
    • 生成汇编代码
    swiftc -emit-assembly main.swift -o main.s
    

常量

  • 只能赋值一次
  • 不要求在编译器确定,但使用之前必须赋值一次
  • 常量、变量在初始化之前都不能使用,这个在 OC 中是可以的
let a = 10
let b: Int
func B() -> Int {
    return 20
}
b = B()

标识符

  • 不能以数字开头,不能包含空白字符、制表符、箭头等特殊字符
  • 除上述所说,几乎可以使用任何字符
let 🐮🍺 = "NB"
...

常见的数据类型

思考:为什么在 swift 中连类似Int这种基本数据结构都设计成结构体?这样甚至可以给其添加一些方法,使我们的代码更具可以性和扩展性。 这样就可以给整形

  • 值类型
    • 枚举(enum): Optional
    • 结构体(struct): Bool、Int、Float、Double、Character、String、Arrary、Dictionary、Set
  • 引用类型
    • 类(class)

字面量

就是像字符串、数字...这种

let a = 1 + 2
...

元组

思考:这个数据结构是什么样的?

Swift 里面 Void 就表示一个空的元组
public typealias Void = ()

let error = (404, "Not Found")
error.0
error.1