编译中的依赖性消解和Bootstrap

项目中要做两种实际编程语言的编译。遇到两个层面的翻译:纯粹语法层面的翻译;基础类型系统的翻译。后者很复杂,有时候需要在目标语言建立初始语言的模拟类库。初始语言类库的各个类之间有非常严重的依赖性,导致模拟类库各个类之间也有严重的依赖性。如何消解依赖性,把工程顺利的Bootstrap起来的问题,就成为一个基础问题。

项目中要做两种实际编程语言的编译。遇到两个层面的翻译:纯粹语法层面的翻译;基础类型系统的翻译。后者很复杂,有时候需要在目标语言建立初始语言的模拟类库。

1、但这个类库具体的形态依赖于怎么翻译;而怎么翻译又反过来依赖模拟类库提供的支持。
2、初始语言类库的各个类之间有非常严重的依赖性,导致模拟类库各个类之间也有严重的依赖性。

实际编程语言的类库都比较庞大,由于这种依赖关系,一方不就绪,另一方就无法运行和调试程序。这种情况下,一个开发团队要怎么样分工合作呢?难道要大家代码都就绪了,全部做一次联调,再去改各自的bug吗?这样显然行不通。如何消解依赖性,把工程顺利的Bootstrap起来的问题,就成为一个基础问题。我们的架构师为此规划了一个迭代、累进的路线,实践证明非常成功。

第一遍:翻译程序没有就绪。首先确定一个起步的API集合,小范围手工实现一些模拟类,提供基本操作和大部分接口,这些接口可以没有给出实现,但都是编译通过的。

第二遍:翻译程序初步就绪。模拟类库自动翻译生成,手工改错。由于第一遍已经生成了一些模拟类,当大家分头开发时,都依赖于第一遍的结果,而不是彼此依赖,这样就把依赖性给消除掉了。

第三遍:翻译程序就绪,模拟类库完全自动翻译生成。

这种Bootstrap的工程思路,是我这次美国之行最大的收获。诚如同事指出,Bootstrap不只是编译技术上才遇到,任何团队运作都会遇到类似的问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注