How does a compiler work?