Formal languages provide the theoretical underpinnings for the study of programming languages as well as the foundations for compiler design. They are important in such areas as data transmission and compression, computer networks, etc. This book combines an algebraic approach with algorithmic aspects and decidability results and explores applications both within computer science and in fields where formal languages are finding new applications such as molecular and developmental biology. It contains more than 600 graded exercises. While some are routine, many of the exercises are in reality supplementary material. Although the book has been designed as a text for graduate and upper-level undergraduate students, the comprehensive coverage of the subject makes it suitable as a reference for scientists.