1) Intermediate code is generated between the front-end and back-end of a compiler to make the compiler reusable for different target machines. It eliminates the need for a new full compiler for each machine.
2) Intermediate code representations include high-level IR close to the source language and low-level IR close to the target machine. Common representations are three-address code using quadruples, triples, or indirect triples.
3) Three-address code converts source instructions into a simple format of assigning values to variables or jumping based on conditions using at most two sources and one operator per instruction. This makes intermediate code easy to optimize and translate to machine code.