In a nutshell:
A compiler takes your source programming code and converts it into an executable form that the computer can understand. This is a very broad explanation though, because some compilers only go so far as to convert it into a binary file that must then be "linked" with several other libraries of code before it can actually execute. Other compilers can compile straight to executable code. Still other compilers convert it to a sort of tokenized code that still needs to be semi-interpreted by a virtual machine, such as Java.
An interpreter does not compile code. Instead, it typically reads a source code file statement by statement and then executes it. Most early forms of BASIC were interpeted languages.
An assembler is similar to a compiler, except that it takes source code written in "Assembly Language", which is just shorthand for the actual machine/processor specific instructions, values, and memory locations, and it converts those instructions to the equivalent machine language. Very fast and small executable code but very tedious to write.
Incidentally, many compilers, especially older C compilers, for example, actually convert the C source code to assembly language and then pass it through an assembler. The benefit is that someone adept at assembly can tweak the compiler-generatd assembler code for speed or size.