Techniques for Automatic Program Translation