module的作用和混编机制原理

2,547 阅读3分钟

前几天在学习组件化的时候偶然间发现了很陌生的东西:modulemap、dummy.m、umbrella.h

企业微信截图_160aa323-b05f-45fa-9f88-2b40deaa9550.png

因为缺乏这部分经验,所以产生了疑问:为什么三方库会有这几个文件呢?

  1. dummy.m文件的作用是辅助纯分类库编译的,也就是说,没有这个这个文件的话,只有category的库,没发link。

  2. unbrella.h如果是在OC的库中,里面会存放公开的.h头文件,但是在swift库中什么都没有,猜测可能和文件查找方式有关,毕竟swift没有头文件,当然这只是我的猜测,如果有知道的兄弟请告知一下,这篇文章(OC)也可以了解一下。另外,如果想学习cocoaPods,推荐这个系列文章

  3. modulemap, 看下文

接下来,进入正题,module是什么?有什么用?

Module: clang Module 和 swift Module 是什么,这两个是同一个东西吗?这个技术又是解决什么问题的呢?

swift和OC是两种不同的语言,如何混编的呢?oc和swift接口相互调用形态为什么发生了改变,并且可以正常调用呢?等等一系列的问题都值得学习和研究。

美团的这篇文章会解决你的这些疑问: blog.csdn.net/MeituanTech… 强烈推荐,知识点偏底层,都是平常工作中接触不到的知识,值得学习。

另外有想什么学习的,可以看看文档和源码: clang Module 文档:clang.llvm.org/docs/Module…

官方文档写了这么一段话,感觉很明了,目的是加快编译速度,在结合美团的文章看会更好理解。

模块的二进制表示由编译器根据需要自动生成。当一个模块被导入时(例如,通过一个#include模块的头文件之一),编译器将产生自己的第二个实例,带有新的预处理上下文,以仅解析该模块中的头文件。然后将生成的抽象语法树 (AST) 持久化到模块的二进制表示中,然后将其加载到遇到模块导入的翻译单元中。

模块的二进制表示保存在模块缓存中。模块的导入将首先查询模块缓存,如果所需模块的二进制表示已经可用,则将直接加载该表示。因此,模块的头文件只会在每个语言配置中解析一次,而不是每个使用该模块的翻译单元解析一次。

模块维护对作为模块构建一部分的每个头文件的引用。如果这些头文件中的任何一个发生更改,或者模块所依赖的任何模块发生更改,则该模块将(自动)重新编译。该过程不应该需要任何用户干预。

另外,如果大家还有什么疑问,可以在评论区说一下,毕竟人多力量大嘛。

工作了4年了,之前面了几次大厂都没能进去,有点难过😭。最近想写点技术文章,无奈水平有限,只能站在前人的肩旁上给大家分享一点东西了,也算是记录一下所学的知识。另外大家如果有什么想了解的技术点,可以告诉我,我会尽量找找资料加上自己的理解,给大家分享一下,共同学习。