编译Swift源文件
创建main.swift
, 输入如下代码
print("Hello world!")
# 编译 main.swift, -o 设置生成的可执行程序名字
swiftc main.swift -o hello
# 执行hello可执行程序,输出"Hello world!"
./hello
-D
设置条件编译标志
为true
#if(DEBUG)
print("debug mode")
#endif
print("Hello world!")
# 设置条件编译DEBUG并执行程序
swiftc main.swift -D DEBUG && ./main
编译多个Swift文件
# point.swift
struct Point {
let x: Int
let y: Int
}
# main.swift
#if(DEBUG)
print("debug mode")
#endif
let p = Point(x: 4, y: 20)
print("Hello world!", p.x, p.y)
swiftc point.swift main.swift -o point-app
# 输出Hello world! 4 20
./point-app
-v
添加 -v(verbose) 参数输出 swiftc 详细执行过程
swiftc point.swift main.swift -o point-app -v
- usr/bin/swift 分别编译 main.swift point.swift
- usr/bin/ld
链接
两个目标文件.o
, 生成可执行程序point-app
编译 – 前后端分离
不同语言使用不同的编译器前端
, 方便扩展新语言
- C -> Clang/GCC
- Objective-C -> Clang
- Swift -> swiftc
- others….
生成统一的 LLVM IR文件
交给统一的编译器后端
LLVM 编译成各个架构的可执行程序, 如ARM x86等
编译详细过程
- 语法分析生成
抽象语法树(AST)
swiftc -dump-ast main.swift
- 生成
中间层代码(SIL)
swiftc -emit-sil main.swift
- llvm中间表示层(IR)
swiftc -emit-ir main.swift
- 生成汇编代码
swiftc -emit-assembly main.swift
5. 生成目标文件 .o
swiftc main.swift -o main.o
swiftc point.swift -o point.o
- 链接生成可执行程序
ld main.o point.o -o main
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END