媒介
一般可以将编程说话分为两种,编译说话和直译式说话。
像C++,Objective C都是编译说话。编译说话在履行的时刻,必须先经由过程编译器生成机械码,机械码可以直接在CPU上履行,所以履行效力较高。
像JavaScript,Python都是直译式说话。直译式说话不须要经由编译的过程,而是在履行的时刻经由过程一个中心的说冥器将代码解释为CPU可以履行的代码。所以,较编译说话来说,直译式说话效力低一些,然则编写的更灵活,也就是为啥JS大年夜法好。
iOS开辟今朝的常用说话是:Objective和Swift。二者都是编译说话,换句话说都是须要编译才能履行的。二者的编译都是依附于Clang + LLVM. 篇幅限制,本文只存眷Objective C,因为道理上大年夜同小异。
可能会有同窗想问,我不懂编译的过程,写代码也没问题啊?这点我是不否定的。然则,充分懂得了编译的过程,会对你的开辟大年夜有赞助。本文的最后,会以以下几个例子,来讲解若何合劳顿用XCode和编译
- __attribute__
- Clang警告处理
- 预处理
- 插入编译期脚本
- 进步项目编译速度
对于不想看我啰里笆攀缆讲一大年夜堆道理的同窗,可以直接跳到本文的最后一个章节。
iOS编译
平日,当项目很大年夜,源代码和三方库惹人很多的时刻,我们会发明编译的速度很慢。在懂得了XCode的编译过程后,我们可以大年夜以下角度来竽暌古化编译速度:
编译器前端
编译器前端的义务是进行:语法分析,语义分析,生成中心代码(intermediate representation )。在这个过程中,会进行类型检查,如不雅发明缺点或者警告会标注出来在哪一行。
编译器后端
编译器后端会进行机械无关的代码优化,生成机械说话,并且进行机械相干的代码优化。iOS的编译过程,后端的处理如下
- LVVM优化器会进行BitCode的生成,链接期优化等等。
履行一次XCode build的流程
当你在XCode中,选择build的时刻(快捷键command+B),会履行如下过程
- 编译信息写入帮助文件,创建编译后的文件架构(name.app)
- 处理文件打包信息,例如在debug情况下
- Entitlements:
- {
- "application-identifier" = "app的bundleid";
- "aps-environment" = development;
- }
- 履行CocoaPod编译前脚本
- 例如对于应用CocoaPod的工程会履行CheckPods Manifest.lock
- 编译各个.m文件,应用CompileC和clang敕令。
经由过程这个编译的敕令,我们可以看到
-x objective-c 指定了编译的说话
-arch x86_64制订了编译的架构,类似还有arm7等
-fobjc-arc 一些列-f开首的,指定了采取arc等信息。这个也就是为什么你可以对零丁的一个.m文件采取非ARC编程。
http://blog.csdn.net/hello_hwc/article/details/50036323
– .o 文文件,也就是上文提到的.m文件编译后的结不雅。
-Wno-missing-field-initializers 一系列以-W开首的,指的是编译的警告选项,经由过程这些你可以定制化编译选项
-DDEBUG=1 一些列-D开首的,指的是预编译宏,经由过程这些宏可以实现前提编译
-iPhoneSimulator10.1.sdk 制订了编译采取的iOS SDK版本
-I 把编译信息写入指定的帮助文件
-F 链接所须要的Framework
-c ClassName.c 编译文件
-o ClassName.o 编译产品
- 链接须要的Framework,例如Foundation.framework,AFNetworking.framework,ALiPay.fframework
- 编译xib文件
- 拷贝xib,图片等资本文件到结不雅目次
- 编译ImageAssets
- 处理info.plist
- 履行CocoaPod脚本
- 拷贝Swift标准库
- 创建.app文件和对其签名
IPA包的内容
例如,我们经由过程iTunes Store下载微信,然后获得ipa安装包,然后实际看看其安装包的内容。
- 右键ipa,重定名为.zip
- 双击zip文件,解紧缩后会获得一个文件夹。所以,ipa包就是一个通俗的紧缩包。
- 右键图中的WeChat,选择显示包内容,然后就可以或许看到实际的ipa包内容了。
经由过程XCode的Link Map File,我们可以窥测二进制文件中构造。
推荐阅读
早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 >>>详细阅读
本文标题:iOS编译过程的原理和应用
地址:http://www.17bianji.com/lsqh/34703.html
1/2 1