1. A method of generating an intermediate representation of program code, the method comprising the computer implemented steps of: generating a plurality of register objects representing abstract registers, a single register object representing a respective abstract register; and generating expression objects each representing a different element of said program code as that element arises in the program code, each expression object being referenced by a register object to which it relates either directly, or indirectly via references from other expression objects.