网站收录大全,销售推广,无锡app定制,最好看免费观看高清大全新员工前言
计算机语言分为机器语言、汇编语言和高级语言。
可以将高级语言分为两种#xff1a;编译语言和解释型语言#xff08;直译式语言#xff09;。
解释型语言#xff08;逐步进行解释执行#xff09;
解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态…前言
计算机语言分为机器语言、汇编语言和高级语言。
可以将高级语言分为两种编译语言和解释型语言直译式语言。
解释型语言逐步进行解释执行
解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行即解释一条代码执行一条代码。
优点可移植好因为只需要各种系统有解释器便可运行不需要乱七八糟的系统库支持
缺点执行速度慢因为相比直接执行多了一个翻译过程。
典型语言phpjavascript
编译型语言一次性翻译
编译型语言的程序只要经过编译器编译之后每次运行程序都可以直接运行不需要再次“翻译”。
优点执行速度快
缺点可移植性差因为编译需要对操作系统的库做出链接所以程序运行时需要用到特定的系统库
典型语言objective-cswift
编译链接过程
预处理处理macro 宏如#define import 头文件替换及处理其他的预编译指令产生.i文件。都是以#号开头编译把预处理完的一系列文件进行一系列词法、语法、语义分析并且优化后生成相应的汇编代码产生.s文件。汇编汇编器将汇编代码生成机器指令输出目标文件产生.o文件。根据汇编指令和机器指令的对照表一一翻译就可以了链接在一个文件中可能会到其他文件因此还需要将编译生成的目标文件和系统提供的文件组合到一起这个过程就是链接。经过链接最后生成可执行文件。
经过编译和链接才会把写的代码转换成计算机能识别的二进制指令。
iOS编译是啥 编译其实是一个用代码解释代码的过程。在 Objective-C 和 Swift 的编译过程中用来解释代码的使用的是Low Level Virtual Machine 的编译器开发工具套件LLVM。简单的说LLVM 是一个项目其作用就是提供一个广泛的工具可以将任何高级语言的代码编译为任何架构的 CPU 都可以运行的机器代码。它将整个编译过程分类了三个模块前端、公用优化器、后端。 前端对目标语言代码进行语法分析语义分析生成中间代码。在这个过程中会进行类型检查如果发现错误或者警告会标注出来在哪一行。我们在开发的过程中其实 Xcode 也会使用前端工具对你的代码进行分析并实时的检查出来某些错误。前端是针对特定语言的如果需要一个新的语言被编译只需要再写一个针对新语言的前端模块即可。公用优化器将生成的中间文件进行优化去除冗余代码进行结构优化。后端后段将优化后的中间代码再次转换变成汇编语言并再次进行优化最后将各个文件代码转换为机器代码并链接。链接是指将不同代码文件编译后的不同机器代码文件合并成一个可执行文件。 clang 是 LLVM 的一个前端它的作用是针对 C 语言家族的语言进行编译像 c、c、Objective-C。而 Swift 则自己实现了一个前端来进行 Swift 编译优化器和后端依然是使用 LLVM 来完成。 Xcode 在编译 iOS 项目的时候使用的正是 LLVM。其实我们在编写代码以及调试的时候也在使用 LLVM 提供的功能例如代码高亮clang、实时代码检查clang、代码提示clang、debug 断点调试LLDB这些都是 LLVM 前端提供的功能。而对于后端来说我们接触到的就是关于 arm64、armv7、armv7s 这些 CPU 架构了。
我们的项目是一个 target一个编译目标它拥有自己的文件和编译规则在我们的项目中可以存在多个子项目这在编译的时候就导致了使用了 Cocoapods 或者拥有多个 target 的项目会先编译依赖库。
iOS编译干了啥
写入辅助文件将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件方便后面使用并且创建一个 .app 包后面编译后的文件都会被放入包中。运行预设脚本Cocoapods 会预设一些脚本当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到。编译文件针对每一个文件进行编译生成可执行文件 Mach-O这过程涉及 LLVM 的完整流程包括前端、优化器、后端。链接文件将项目中的多个可执行文件合并成一个文件。拷贝资源文件将项目中的资源文件拷贝到目标包。编译 storyboard 文件storyboard 文件也是会被编译的。链接 storyboard 文件将编译后的 storyboard 文件链接成一个文件。编译 Asset 文件我们的图片如果使用 Assets.xcassets 来管理图片那么这些图片将会被编译成机器码除了 icon 和 launchImage。运行 Cocoapods 脚本将在编译项目之前已经编译好的依赖库和相关资源拷贝到包中。对包进行签名完成打包
在上述流程中2 - 9 步骤的数量和顺序并不固定这个过程可以在Build Phases中指定。Phases阶段、步骤这个选项Tab在Xcode中的意思就是编译步骤。其实在Xcode中我们不仅可以设定整个编译步骤和顺序还可以对编译规则Build Rules和具体步骤的参数Build Settings进行设定。
iOS整个编译链接过程 预处理Prepressing
处理macro 宏 import 头文件替换及处理其他的预编译指令产生.i文件都是以#号开头。规则如下
#define删除并展开对应宏定义。处理所有的条件预编译指令。如#if/#ifdef/#else/#endif。#include/#import包含的文件递归插入到此处。删除所有的注释//或/**/。添加行号和文件名标识编译调试会用到。
编译Compilation
这个过程就是把上面的main.i文件进行词法分析、语法分析、静态分析优化生成相应的汇编代码最终生成main.s文件。
词法分析把源代码的字符序列分割成一个个token关键字、表示符、字面量、特殊符号比如把标识符放到符号表里面。语法分析生成抽象语法树AST此时运算符号的优先级确定了有些符号具有多重含义也确定了比如*是乘号还是对指针取内容表达式不合法、括号不匹配等等都会报错。静态分析分析类型声明和匹配问题。比如整型和字符串相加肯定会报错。 中间语法生成CodeGen根据AST自上向下逐步翻译成LLVM IR并且对在编译期就可以确定的表达式进行优化比如代码里面的a13可以优化成a4。假如开启了bitcode目标代码生成与优化根据中间语法生成依赖具体机器的汇编语言并优化汇编语言。这个过程中假如有变量且定义在同一个编译单元里那么就给这个变量分配空间确定变量的地址。假如变量或者函数不定义在这个编译单元里面那就等到链接的时候才能确定地址。
汇编Assembly
将main.s文件编译成main.o文件。(也就是我们常说的目标文件)
这个过程就是把上面得到的main.s文件里面的汇编指令翻译成机器指令最终生成等到main.o
链接Linking
这个过程就是将main.o编译成对应的Mach-O文件也就是我们常说的可执行文件。链接的本质就是把一个或多个目标文件和需要的库静态库/动态库如果需要的话组合成一个文件Mach-O可执行文件。