美文网首页iOS 开发
iOS ~ 编译 Clang 、swiftc 、LLVM

iOS ~ 编译 Clang 、swiftc 、LLVM

作者: 派大星的博客 | 来源:发表于2019-01-23 14:49 被阅读23次

    推荐阅读:

    https://llvm.org
    https://medium.com/@jyaunches/introduction-to-the-llvm-for-a-ios-engineer-8c00ed0f9ff0
    https://swift.org/compiler-stdlib/#compiler-architecture
    https://medium.com/@JMangia/swift-c-llvm-compiler-optimization-842012568bb7
    https://zhuanlan.zhihu.com/p/49274308
    https://juejin.im/post/5a352bb0f265da433562d5e3
    https://blog.csdn.net/Hello_Hwc/article/details/53557308
    https://developer.apple.com/videos/play/wwdc2018/415/
    https://developer.apple.com/videos/play/wwdc2018/408

    Presentation Slides (PDF) 下载


    图解编译

    “front end” — “back end”.jpeg

    Swift Abstract Syntax Tree (AST)

    • swiftc –dump-ast main.swift

    Swift Intermediate Language (SIL)

    • swiftc –emit-sil main.swift

    LLVM Intermediate Representation (LLVM IR)

    • swiftc –emit-ir main.swift

    Assembly Language

    • swiftc –emit-assembly main.swift

    What is Clang?

    Apple’s official for the C language family
    C
    C++
    Objective-C
    Objective-C++

    编译.png 编译 链接.png

    What is swiftc?

    屏幕快照 2019-01-23 下午12.18.53.png 屏幕快照 2019-01-23 下午12.23.12.png image.png

    在xcode按下cmd+B之后的工作流程:

    image.png
    • 预处理(Pre-process):他的主要工作就是将宏替换,删除注释展开头文件,生成.i文件。
    • 词法分析 (Lexical Analysis):将代码切成一个个 token,比如大小括号,等于号还有字符串等。是计算机科学中将字符序列转换为标记序列的过程。
    • 语法分析(Semantic Analysis):验证语法是否正确,然后将所有节点组成抽象语法树 AST 。由 Clang 中 Parser 和 Sema 配合完成
    • 静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误。
    • 中间代码生成(Code Generation):开始IR中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入。
    • 优化(Optimize):LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。
    • 生成目标文件(Assemble):生成Target相关Object(Mach-o)
    • 链接(Link):生成 Executable 可执行文件
      经过这一步步,我们用各种高级语言编写的代码就转换成了机器可以看懂可以执行的目标代码了。

    What is LLVM?

    The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.

    ⚠️注意

    • 名称“LLVM”本身不是首字母缩略词; 它是项目的全名。

    The LLVM Project 是模块化、可重用的编译器和工具链技术的集合。包含多个子项目。其中包括我们熟悉的ClangLLDB

    • Clang is an "LLVM native" C/C++/Objective-C compiler,
    • The LLDB project builds on libraries provided by LLVM and Clang to provide a great native debugger.

    除了LLVM的官方子项目之外,还有许多其他项目使用LLVM的组件来执行各种任务。通过这些外部项目,您可以使用LLVM来编译Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其他语言。LLVM的主要优势在于其多功能性,灵活性和可重用性,这就是它被用于各种不同任务的原因:从轻量级JIT编译嵌入式语言(如Lua)到编译Fortran代码(用于大型超级)电脑。

    相关文章

      网友评论

        本文标题:iOS ~ 编译 Clang 、swiftc 、LLVM

        本文链接:https://www.haomeiwen.com/subject/rarjjqtx.html