• Course Introduction

      This course is an upper division computer science course that studies the design of programming languages. While most of the industry uses either procedural or object-oriented programming languages, there are entire families of other languages with certain strengths and weaknesses that make them attractive to a variety of problem domains.  It is important to know about these less well-known yet powerful languages if you find yourself working in an area that could utilize their strengths.  In this course, we will discuss the entire programming language family, starting with an introduction to programming languages in general and a discussion of the features and functionality that make up the modern programming language.  From there, each unit will discuss a different family of programming languages, including Imperative, Object-Oriented, Functional, Scripting, and, Logical. For each language, you will learn about its computational model, syntax, semantics, and pragmatic considerations that shape the language. By the end of this course, you will be able to intelligently discuss each of these programming paradigms, their respective strengths and weaknesses, and the reasons why you would opt to use one over the others in a given situation. You will also have opportunities to delve into the details of the design and evolution of several specific programming languages, including Scheme, Haskel, Java, C++, C#, Perl, Python, and Prolog.

    • Unit 1: Introduction to Programming Languages

      Programming languages are not very different from spoken languages. Learning any language requires an understanding of the building blocks and the grammar that govern the construction of statements in that language. This unit will serve as an introduction to programming languages, taking you through the history of programming languages. We will also learn about the various universal properties of all programming languages and identify distinct design features of each programming language. By the end of this unit, you will have a deeper understanding of what a programming language is and the ability to recognize the properties of programming languages.

      Completing this unit should take you approximately 17 hours.

    • Unit 2: Types

      In this unit, you will learn about types, a method of enforcing levels of abstraction in programs. Data in programs come in many types: real number, integers, characters, lists, etc. A type error occurs when an operation is applied to an inappropriate data type. A type system consists of a set of types, and a set of programs to analyze types and type judgment. You will also learn about the basics of static typing, type checking and type inference.

      Completing this unit should take you approximately 19 hours.

    • Unit 3: Functional Programming

      Functional programming is not used very frequently in the industry, yet it is very powerful. Functional programming treats computation as the evaluation of mathematical functions. Functional programming languages are deeply rooted in lambda calculus.

      Whereas older Functional Programming languages were typically designed with a specific purpose in mind, newer Functional Programming languages are more "general purpose" and are more widely applicable. In this unit, we will discuss Functional Programming's place in the programming languages world, first taking a look at exactly what constitutes a Functional Programming language. We will conclude the unit with a discussion of some of the more prevalent features in Functional Programming. By the end of this unit, you will be able to identify Functional Programming languages and, more importantly, instances in which a Functional Programming language would be most beneficial.

      Completing this unit should take you approximately 21 hours.

    • Unit 4: Imperative Programming

      An imperative language uses a series of statements, contained in blocks or functions, to control a created state and, ultimately, produce a desired output. Imperative languages and, by extension, procedural languages, are extremely common and are frequently used to teach novices how to program. This unit will define Imperative Programming and identify the language's key properties before moving on to address common control structures such as conditionals, loops, and case statements. By the end of this unit, you will understand how imperative programming languages work and be able to identify their common properties (and the ways in which those properties are employed in imperative programming).

      Completing this unit should take you approximately 4 hours.

    • Unit 5: Object-Oriented Programming

      Object-Oriented programming languages are widely used in both government and industry, thanks to the popularity of Java and its older brethren, C++. Object-Oriented Programming has many practical advantages over other programming paradigms. It is considered an upgrade over the once-dominant Procedural Programming scheme. This unit will present an overview of Object-Oriented Programming, including examples of the two most popular languages mentioned above. Next, we will discuss some of the distinctive properties of Object-Oriented Programming, discussing the ways in which it differs from other schemes and why it is considered an improvement over older designs. By the end of this unit, you will be able to describe Object-Oriented Programming and identify the main properties of and advantages to using Object-Oriented Programming.

      Completing this unit should take you approximately 14 hours.

    • Unit 6: Scripting Languages

      Scripts are everywhere in computer science. Any job in the computer science field will require you to write a script at some point or another, whether that script sets up the runtime environment for an application or automates the build process. Scripting languages are primarily designed for "gluing", i.e. connecting components. We will first learn the basics of scripting, learning in particular how scripts are useful. You will then learn about the wide-ranging family of scripting languages and the properties that those languages tend to share. By the end of this unit, you will be able to define scripting and identify situations in which a script would be most useful.

      Completing this unit should take you approximately 27 hours.

    • Unit 7: Logical Programming

      The relationship between mathematical logic and computer science runs deep. As such, there are a number of programming language tools that enable you to rapidly code efficient logic systems for deployment in a variety of high-tech arenas, such as Artificial Intelligence, Textual Analysis, and so on.

      In this unit, you will learn about Logical Programming (also known as Declarative Programming) and why you would use it to solve these sorts of problems. We will discuss the fundamental features of Logical Programming and identify what distinguishes Logical Programming from other programming paradigms. By the end of this unit, you will be able to identify the problem domain that Logical Programming covers and recognize when you should take advantage of Logical Programming's considerable power.

      Completing this unit should take you approximately 9 hours.

    • Final Exam