On implementing separate compilation in block-structured languages
Compiler design for efficient code generation and program optimization