CSCE 5450: Programming Languages - Spring 2017
Instructor: Paul Tarau, Professor - see my home page for contact info and office hours.
Grader: you can contact him via blackboard
Midterm exam: Tuesday, February 21 open net
Final exam: TBD cumulative, open net
Description and Objectives:
A comprehensive programming language course, with emphasis on programming paradigms and language processors - and some of their formal models like Predicate Logic and Lambda Calculus. Hands-on work with implementations of key concepts (recursion, inheritance, unification, backtracking, type inference, infinite and lazy data objects, threads. The course also provides a glimpse at salient features of modern object oriented languages and an overview of language implementation techniques, run-time systems and memory management in an efficient procedural language.
- From Turing machines and Lambda calculus to today's programming languages
- Programming Paradigms: logic, functional, object oriented, imperative
- Language Processors: Interpreters and Virtual Machines, Compilers
- Domain Specific (DSLs) and Internet Programming Languages
Functional Programming Languages (Haskell)
- Intro to Haskell
- Programming with Recursive Functions and Lists
- Higher Order Functions
- Working with Fold, Map, Zip
- Polymorphism, Type inference
- Recursive Data Types and Pattern Matching in Haskell
- List Comprehensions
- Lazy Evaluation, Computing with Infinite Lists
- Lambda Calculus, De Bruijn Indices
- Simply-typed Lambda Terms, Type Checking vs. Inference
- Evaluation of Lambda Terms, Normalization
Logic Programming Languages (Prolog)
- Intro to Prolog: Facts and Rules, Recursion, Lists and Compound Terms, Arithmetic
- Propositional and Predicate logic
- Unification and Horn Clause Resolution in Prolog
- Non-determinism and Backtracking
- Case study: solving cryptarithmetic puzzles
- Definite Clause Grammars, Parsing and Generation
- Problem solving with Prolog
- Runtime Code Generation: the dynamic database
- Higher order Predicates and Meta-interpreters
- Generating Lambda Terms in Prolog
- Type inference for simply-typed Lambda Terms in Prolog
Object Oriented Programming (Java+Scala+Swift)
- Static vs. Dynamic Aspects
- Classes, Instances, Objects L
- Overview of Java 8
- Overview of Scala
- Overview of Swift
- Collections, Iterators and IO operations
- Reflection and Serialization
Low Level Imperative Programming (C)
- Basics: assignment, function calls,, lexical scoping, memory representations, stack and heap L24
- Implementing dynamic memory management and garbage collection
- Implementing high-level programming languages in C
- Event driven programming, Coroutining, Futures, Multi-threading
- Distributed Programming, Message Passing, Coordination
Future Trends in Programming Language Design
Prerequisites: Data Structures
Recommended books and online materials:
- Tucker & Noonan: Programming Languages, Principles and Paradigms, McGraw Hill
- The Art of Prolog by Sterling and Shapiro, MIT Press
- Doets & van Eijck: The Haskell Road to Logic, Math and Programming
- Harper’s draft PL book
- Java for Students: Douglas Bell & Mike Parr, Prentice Hall
- 2 Individual Exams: 30%+30%
- Team Project and Assignments (groups of 2-3): 40%
Software, tutorials and related links:
- Understand the concepts of programming languages, with emphasis on programming paradigms and language processors.
- Have a practical understanding of commonalities and differences between major programming paradigms.
- Understand the key object oriented, logic and functional programming concepts.
- Understand the key concepts of event driven and concurrent programming.
- Understand the use and implementation of modern programming language concepts like recursion, inheritance, reflection, unification, backtracking, type inference, infinite data objects, and threads.
- Have some familiarity with domain-specific languages with emphasis on Internet programming languages.