A program that transforms input data in some way before it is read by the main program. In the case of a compiler, the input is source code. The main advantage of using a preprocessor is that it is possible to change the specification of the input data without changing the main program. The separation can also help to make the system's overall behaviour easier to understand. The disadvantage is that performance may be reduced by the extra input and output performed between the two programs.