美文网首页
swift编译成可执行文件过程

swift编译成可执行文件过程

作者: 余晖依旧耀眼 | 来源:发表于2021-12-31 11:26 被阅读0次

    1、swift code编译过程

    1.1、流程图

    image.png

    1.2、转换成对应流程的代码指令

    //main可以换成任何.swift文件,只是拿main当例子
    
    // 分析输出AST
    swiftc main.swift -dump-parse
    
    // 分析并且检查类型输出AST 
    swiftc main.swift -dump-ast 
    
    // 生成中间体语言(SIL),未优化 
    swiftc main.swift -emit-silgen 
    
    // 生成中间体语言(SIL),优化后的 
    swiftc main.swift -emit-sil 
    
    // 生成LLVM中间体语言 (.ll文件) 
    swiftc main.swift -emit-ir 
    
    // 生成LLVM中间体语言 (.bc文件) 
    swiftc main.swift -emit-bc 
    
    // 生成汇编
    swiftc main.swift -emit-assembly 
    
    // 编译生成可执行.out文件 
    swiftc -o main.o main.swift 
    

    1.3、swiftc指令

    我们可以在终端上查看swiftc的各种指令

    swiftc -h
    
    image.png

    常见的swiftc指令的用处

      -dump-ast             语法和类型检查,打印AST语法树
      -dump-parse           语法检查,打印AST语法树
      -dump-pcm             转储有关预编译Clang模块的调试信息
      -dump-scope-maps <expanded-or-list-of-line:column>
                             Parse and type-check input file(s) and dump the scope map(s)
      -dump-type-info        Output YAML dump of fixed-size types from all imported modules
      -dump-type-refinement-contexts
                             Type-check input file(s) and dump type refinement contexts(s)
      -emit-assembly         Emit assembly file(s) (-S)
      -emit-bc               输出一个LLVM的BC文件
      -emit-executable       输出一个可执行文件
      -emit-imported-modules 展示导入的模块列表
      -emit-ir               展示IR中间代码
      -emit-library          输出一个dylib动态库
      -emit-object           输出一个.o机器文件
      -emit-pcm              Emit a precompiled Clang module from a module map
      -emit-sibgen           输出一个.sib的原始SIL文件
      -emit-sib              输出一个.sib的标准SIL文件
      -emit-silgen           展示原始SIL文件
      -emit-sil              展示标准的SIL文件
      -index-file            为源文件生成索引数据
      -parse                 解析文件
      -print-ast             解析文件并打印(漂亮/简洁的)语法树
      -resolve-imports       解析import导入的文件
      -typecheck             检查文件类型
    

    2、代码实践

    2.1、创建一个类

    class YYPersonClass {
        var age : Int = 18
        var name : String = "zhangsan"
    }
    let p = YYPersonClass()
    

    2.2、生成sil和ir

    在xcode中配置脚本运行target(当然你也可以通过终端编译),过程如下


    image.png
    image.png
    image.png

    生成SIL的脚本代码

    #swiftc -emit-sil ${SRCROOT}/xxx.swift > ./xxx.sil && open xxx.sil
    #${SRCROOT}/xxx.swift > :需要编译成sil的.swift文件
    #open xxx.sil :编译成功后 打开xxx.sil文件
    swiftc -emit-sil ${SRCROOT}/StructAndClass/main.swift > ./main.sil && open main.sil
    
    #如果是带UIKit的需要使用下面的脚本
    #ios13.1 13.1是你的xcode版本
    #swiftc -emit-sil -target x86_64-apple-ios13.1-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ${SRCROOT}/YYSwiftTest/ViewController.swift > ./ViewController.sil && open ViewController.sil
    

    编译后的sil代码

    image.png

    生成IR的脚本代码

    #swiftc -emit-ir ${SRCROOT}/xxx.swift > ./xxx.sil && open xxx.sil
    #${SRCROOT}/xxx.swift > :需要编译成sil的.swift文件
    #open xxx.sil :编译成功后 打开xxx.sil文件
    swiftc -emit-sil ${SRCROOT}/StructAndClass/main.swift > ./main.ll && open main.ll
    
    #如果是带UIKit的需要使用下面的脚本
    #ios13.1 13.1是你的xcode版本
    #swiftc -emit-ir -target x86_64-apple-ios13.1-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ${SRCROOT}/YYSwiftTest/ViewController.swift > ./ViewController.ll && open ViewController.ll
    

    编译后生成的.ll


    image.png

    相关文章

      网友评论

          本文标题:swift编译成可执行文件过程

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