FBI is Fragile binary interface problem
背景
最近阅读MacOS 的历史,然后介绍到 Apple 最长的一段迁移, 64Bit 的支持,从中提到Objective-C 这样的面向对象语言(OOP)在系统层面(或者软件层面时)面临的一个巨大考验,FBI。
FBI
FBI 全称 Fragile binary interface problem, 中文解释,弹性/韧性 解决易碎二进制接口问题。
例子
Fragile binary interface problem是面向对象编程语言的通病 如果在程序中引入了外部库 我们的的程序中使用并继承了该外部库中的类 如果外部库有改动 我们必须重新编译所有该类的继承树 而这类问题被称为脆弱的基类 (Fragile base class) 所谓易碎接口嘛,是现代程序语言的一个通用问题,它的全称叫做 Fragile Binary Interface 。
简单来说呢,就是 Swift 以及当前的大多数主流开发语言中的类的属性,在底层都是通过偏移来访问的,比如 book.name, 我们在程序中访问一个对象的属性非常直观。 但他在编译后,实际上是这样的形式location(book) + offset(name) 。访问 name 属性是通过 book 对象所在的内存地址加上一个偏移来实现的。 那么 Swift 中的类在编译后,会将它所有的属性的偏移值也都计算出来。这样会加快程序在运行时的执行速度,因为不需要在运行时再计算这些偏移量了。
如果所有的类之间没有任何关联就不会有什么问题,但在实际中,我们使用类都会有继承关系。假如我们的主项目中引用了一个外部的库,我们主程序中继承了这个外部库中的类。那么如果这个库中有任何改动,我们都必须重新编译所有的类继承树上面的代码,否则在我们主程序的子类中,就会发生偏移计算错误。 简单来说呢,如果 Swift 能把 Fragile Binary Interface 处理好的话,对我们开发者最直观的感受就是: 编译速度加快。
解决方案
思路就是从偏移表开始。
1
2
3
1. Net 通过中间文件,列出编译阶段的偏移量和其他信息,成为元数据。然后,链接器在将库加载到应用程序使用此信息(元数据)进行自我更正。
2. C++ 确定位置的依赖,通过插入一些“占位符”(这里笼统的概述这个操作过程)对象,以防将来需要添加额外的功能。代价就是占用更多的内存。
3. Objective-C 2.0 (为了Mac os X 的 64Bit),提供非脆弱可扩展级别的实例变量作为中间访问。
不难看出都是通过中间层的方式做了编译问题的解决方案。
详细介绍wiki: Fragile binary interface problem