History of Programming languages. Syntax and semantics. Data types, scoping, procedures, argument passing methods, procedure implementation. Basic categories of programming languages: imperative, object-oriented, logic, functional, parallel (main characteristics of each category and presentation of the main languages). Theoretical issues in programming languages. Techniques for transforming and optimizing programs. Proving program correctness using logic (Floyd-Hoare logic). Untyped Lambda Calculus: conversions, normal forms, Church-Rosser theorem, expressive power, applications in programming languages. Typed Lambda Calculus. Theory of types and type-checking.