An assembler translates assembly language instructions into machine code through a one-to-one mapping. An interpreter directly executes program source code line by line without compiling. A compiler translates high-level language source code into an executable machine code program.