Collections of tested and working pieces can be combined into librar ies for use by other programmers. As each piece is created, the complexity of the other pieces is hidden. Compiler debugging features have improved significantly over time. Early compilers only generated machine code, and the programmer inserted print statements to see what was going on. This is not always effective.
Modern compilers can insert information about the source code into the executable program.
This information is used by powerful source-level debugger s to show exactly what is happening in a program by tracing its progress through the source code. Most compilers work with files, reading and writing them in each step of the compilation process. For small programs, this can seem as responsive as an interpreter. The pre-processed code is often written to an intermediate file. Compilers usually do their work in two passes.