易写易库(EXEK)进展情况(2)(2008.8.23)
经过前几天的努力,已经完成了“保证支持库的向下兼容性”的处理,并通过了初步测试。
为什么要保证“支持库的向下兼容性”呢?不保证支持库向下兼容性会有什么后果呢?具体原因又有什么呢?采取什么方案应对呢?这都是值得我们探讨和解决的问题。
不保证支持库向下兼容性的后果
我们开发的一个易语言支持库,发布了版本1.0,后来升级为2.0,如果2.0版本和1.0版本不兼容,将导致以下结果:
- 使用1.0版本支持库编写的易语言源程序,打开后一片混乱,无法编译
- 使用1.0版本支持库编译的易语言可执行程序,无法正常运行
导致支持库不向下兼容的原因
通过易语言支持库开发手册,我们知道,支持库中的所有命令和方法定义信息都集中依次存储在一个连续的内存块中(命令/方法信息定义数组),它们的相对位置非常重要;而在易语言源代码文件和易语言编译出的EXE文件中,记录的正是命令或方法在该内存块中的索引位置。在支持库升级时,如果不小心在该命令/方法信息定义数组中间插入了一个或多个命令或方法,必然导致后面的命令或方法的索引位置发生变化。最终的结果是,易语言源程序或EXE程序中本来记录的是命令或方法A的索引,支持库升级后,该索引却指向了命令或方法B。支持库不再向下兼容的现象,就这样发生了。
数据类型信息的定义,也存在相似的问题。
修改命令或方法的参数定义信息,或修改数据类型的成员定义信息,以及其它等等,都可能导致影响支持库的向下兼容性,但这并不是很大的问题,只要支持库开发者稍加留意即可避免。
如何保证支持库向下兼容
简单的说,就是只在命令或方法定义信息数组的最后添加新的命令或方法,只在数据类型地的定义信息数组的最后添加新的数据类型。
使用C/C++或汇编开发易语言支持库时,之所以没有特别提出“保证支持库兼容性”问题,是因为开发太底层,所有这些细节都由支持库开发者来保证,保证不了就是开发者的责任。而使用“易写易库(EXEK)”开发易语言支持库时,因为进行了更高层次上的封装,例如把每个数据类型的方法都分别定义在一起而又保持逻辑上的独立,必须进行这方面的处理。
解决方案
我最终采取的解决方案是,在定义时为每个方法或命令指定一个整数型“版本号”,在最终生成支持库定义信息时,对所有版本号进行排序,按从小到大的顺序依次添加到信息定义数组中。这来,在升级支持库时,只要开发者提供比上次更大一些的版本号,即可保证支持库向下兼容性。在实践中,该“版本号”可以采用“年月日时”的格式,如:2008080820,无需再记忆其它附加信息。