This course is about the grammatical structure of programming languages, different levels of machines (or automata), different levels of languages (regular language associated to finite-state automata, context-free language associated with push-down automata, and languages associated to Turing machines), decidability, time complexity, and NP-Completeness.