A compiler is a program that translates a program written in a source language into an equivalent program in a target language. It has two main parts - a front end that handles language-dependent tasks like lexical analysis, syntax analysis, and semantic analysis, and a back end that handles language-independent tasks like code optimization and final code generation. Compiler design involves techniques from programming languages, theory, algorithms, and computer architecture. Regular expressions are used to describe the tokens in a programming language.