On this slice I want to compare the architecture of our program slicer with that of conventional compilers.
On the left hand side we have separate compilation at the compiler level. Modules define their interfaces by exporting items. These interfaces can be stored in symbol files. The symbol files can in turn be reused for type-checking across module boundaries when importing these modules.
On the right hand side we have separate computation of slicing information at the slicing level. Modules can be processed one at a time, the computed slicing information is stored in a slicing repository and reused when importing other modules.