We may earn an affiliate commission when you visit our partners.
Course image
Dan Grossman

[As described below, this is Part B of a 3-part course. Participants should complete Part A first -- Part B "dives right in" and refers often to material from Part A.]

Read more

[As described below, this is Part B of a 3-part course. Participants should complete Part A first -- Part B "dives right in" and refers often to material from Part A.]

This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course uses the languages ML, Racket, and Ruby as vehicles for teaching the concepts, but the real intent is to teach enough about how any language “fits together” to make you more effective programming in any language -- and in learning new ones.

This course is neither particularly theoretical nor just about programming specifics -- it will give you a framework for understanding how to use language constructs effectively and how to design correct and elegant programs. By using different languages, you will learn to think more deeply than in terms of the particular syntax of one language. The emphasis on functional programming is essential for learning how to write robust, reusable, composable, and elegant programs. Indeed, many of the most important ideas in modern languages have their roots in functional programming. Get ready to learn a fresh and beautiful way to look at software and how to have fun building it.

The course assumes some prior experience with programming, as described in more detail in the first module of Part A. Part B assumes successful completion of Part A.

The course is divided into three Coursera courses: Part A, Part B, and Part C. As explained in more detail in the first module of Part A, the overall course is a substantial amount of challenging material, so the three-part format provides two intermediate milestones and opportunities for a pause before continuing. The three parts are designed to be completed in order and set up to motivate you to continue through to the end of Part C.

Week 1 of Part A has a more detailed list of topics for all three parts of the course, but it is expected that most course participants will not (yet!) know what all these topics mean.

Enroll now

What's inside

Syllabus

Introduction, Course-Wide Information, and Software Installation (Start Here)
Welcome! Start here! Learn about this course and how it's organized.
Read more
Section 5 and Homework 4 (First Module with Racket)
Let's get started programming with Racket and then learning idioms related to delaying evaluation. The welcome message has a few additional comments about picking up a new language and how to approach the homework assignment, so let's get started...
Section 6 and Homework 5 (Second Module with Racket)
Welcome to the second week of Part B where we will focus on (a) building data structures in dynamically typed languages and (b) implementing programming languages with interpreters. Most of the programming assignment is focused on (b) -- implementing a small programming language that has function closures. As usual, start with the welcome message and enjoy!
Section 7 Including a Quiz
In the last module of Part B we will use our experience programming in ML and Racket to compare and contrast static typing and dynamic typing. This is not only the most important difference between these two languages, but it is a fundamental topic in the study of programming languages. Learning it can help you program more effectively in both kinds of languages. After completing this week's quiz, don't forget to watch the Part B Wrap-Up and Part C Preview video.

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Covers topics in functional programming, which is an important and widely used paradigm
Examines benefits of static typing and dynamic typing, while contrasting the two
Taught by a professor from Brown University, a recognized institution for its work in computer science
Emphasizes teaching participants to be more effective in programming in any language
Structured with three progressive parts, providing intermediate milestones
Starts with a welcome module to introduce course to new students and their different approaches to learning

Save this course

Save Programming Languages, Part B to your list so you can find it easily later:
Save

Reviews summary

Highly rated pl course

Learners say this engaging course will help them solidify their understanding of programming languages. Featuring challenging assignments and a knowledgeable instructor, students leave the course praising its clear explanations and well-structured content. Students particularly recommend this course for those who want to gain a deeper understanding of functional programming and type theory.
This course also covers type theory concepts.
"F​antastic course on functional programming, programming languages, and type theory."
"This course has greatly helped shape my views on programming."
This course has a well-thought-out structure and engaging lectures.
"Wonderfully-structured class, the assignments and exams are well-thought-out."
This course teaches functional programming concepts in Racket.
"This course presents a beautiful contrast between static and dynamic Type Systems."
"Week's 2 homework is challenging and rewarding."
"I learned the Racket programming language and functional programming in general."
Assignments are challenging but worthwhile.
"The assignment is a bit hard but worthwhile if you manage to finish it"
"Fairly tough assignments but a great course!!"
"I really the discussion about the static checking and dynamic checking."
"If you really wanna get what programming languages are about, give this one a whirl! Great homework assignments and solid videos."
"The second assignment is challenging but very interesting."
"The second assignment where you write an interpreter will take a few days, but you'll understand how closures work in practice."
The instructor uses clear explanations to convey technical concepts.
"Unlike other instructors, Dan does not mindlessly overload with technical jargon as if that's the only way to communicate."
"Dan introduces it in a very simple way."
"I appreciate how Dan always utilizes simple vocabulary to explain technical concepts."
The instructor is knowledgeable and articulate.
"I watch the video lectures as supplements for a course I am taking at my university, which happens to be based on this course. I feel compelled to say that this is one of the best courses I have ever taken and Dan Grossman is the best instructor I have ever had."
"Dan Grossman is an excellent teacher as well. I can't recommend this course enough."
"Another Fantastic more of a journey than a course, from (in my opinion) one of the greatest teachers in th world. Thanks for everyone that helped letting this course come out to life. I shed tears (from happiness) when I finish every course taught by this teacher. It's an amazing experience."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Programming Languages, Part B with these activities:
Organize and Review Course Materials
Staying organized and reviewing materials regularly will help you retain the information and perform better on assessments.
Show steps
  • Create a system for organizing notes, assignments, and other course materials, both digital and physical.
  • Regularly review your notes and materials to reinforce your understanding and identify areas where you need further clarification.
  • Use flashcards or other techniques to memorize key concepts and definitions.
Find a Mentor in Functional Programming
A mentor can provide valuable guidance and support throughout your learning journey.
Browse courses on Mentorship
Show steps
  • Attend meetups or conferences related to functional programming and networking with professionals in the field.
  • Reach out to professors, researchers, or industry experts who specialize in functional programming and express your interest in mentorship.
  • Clearly define your goals and expectations for mentorship and communicate them to potential mentors.
Review Introduction to Computer Science
Review of the core concepts of computer science will lay a helpful foundation for this course.
Show steps
  • Review basic programming concepts using an online tutorial or textbook.
  • Complete practice problems and exercises to reinforce your understanding.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Read Structure and Interpretation of Computer Programs
This classic text provides a comprehensive and in-depth exploration of foundational concepts in computer science and programming, including functional programming.
Show steps
  • Read through the chapters and work through the exercises to grasp the fundamentals of programming and functional programming paradigms.
  • Discuss the concepts with classmates or online forums to enhance your understanding and gain different perspectives.
  • Apply the knowledge gained from the book to your coding projects and assignments.
Practice with Racket
Practice is key to understanding the functional programming concepts taught in this course, and Racket is a great language for practicing.
Browse courses on Racket
Show steps
  • Solve coding problems using Racket, focusing on concepts like recursion, higher-order functions, and lazy evaluation.
  • Participate in online coding challenges or contribute to open-source Racket projects.
Explore Functional Programming Concepts
This course provides a solid foundation in functional programming, so taking the time to explore these ideas further will enhance your learning experience.
Browse courses on Functional Programming
Show steps
  • Find online tutorials or courses that cover advanced functional programming topics like monads, category theory, and type systems.
  • Watch videos or read articles about real-world applications of functional programming in industry.
  • Experiment with different functional programming languages like Haskell, OCaml, or F# to compare and contrast their features.
Build a Functional Programming Project
Applying what you've learned to a practical project will solidify your understanding and demonstrate your skills.
Browse courses on Functional Programming
Show steps
  • Identify a problem or idea that can be solved using functional programming techniques.
  • Design and implement your project using a functional programming language of your choice.
  • Test and refine your project to ensure it meets your requirements and demonstrates functional programming principles.
  • Document your project, including a description of the problem, your approach, and any challenges you encountered.

Career center

Learners who complete Programming Languages, Part B will develop knowledge and skills that may be useful to these careers:
Software Developer
A Software Developer designs, develops, and maintains software applications. This course is an excellent fit for this role because it provides a comprehensive understanding of programming languages and their design principles, which are essential for developing robust and efficient software applications.
Machine Learning Engineer
A Machine Learning Engineer designs and develops machine learning algorithms and models. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing machine learning algorithms.
Artificial Intelligence Engineer
An Artificial Intelligence Engineer designs, develops, and maintains artificial intelligence systems. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing AI algorithms.
Data Scientist
A Data Scientist analyzes data to extract insights and develop predictive models. This course may be useful for this role because it provides a foundation in programming languages and data structures, which are essential for manipulating and analyzing large datasets.
Computer Systems Analyst
A Computer Systems Analyst analyzes and designs computer systems. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for designing and implementing efficient computer systems.
Blockchain Developer
A Blockchain Developer designs and develops blockchain-based applications and systems. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing blockchain-based systems.
Cloud Architect
A Cloud Architect designs and implements cloud computing solutions. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for developing and managing cloud-based applications and services.
DevOps Engineer
A DevOps Engineer designs and implements DevOps processes and tools. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for developing and managing DevOps tools and pipelines.
Database Administrator
A Database Administrator designs, implements, and maintains databases. This course may be useful for this role because it provides a deep understanding of data structures and their implementation, which are essential for designing and managing efficient databases.
Information Security Analyst
An Information Security Analyst designs, implements, and maintains information security systems. This course may be useful for this role because it provides a strong foundation in programming languages and their implementation, which are essential for developing secure and reliable security systems.
Game Developer
A Game Developer designs and develops video games. This course may be useful for this role because it provides a strong foundation in programming languages and their implementation, which are essential for developing complex and engaging game applications.
Network Engineer
A Network Engineer designs, implements, and maintains computer networks. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for developing and managing efficient networks.
Web Developer
A Web Developer designs and develops websites and web applications. This course may be useful for this role because it provides a foundation in programming languages and their implementation, which are essential for building dynamic and interactive web applications.
Computer and Information Systems Manager
A Computer and Information Systems Manager plans, coordinates, and directs computer-related activities in an organization. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation.
Computer and Information Research Scientist
A Computer and Information Research Scientist designs, develops, and evaluates computer and information systems. This course may be useful for this role because it provides a strong foundation in programming languages and their design.

Reading list

We've selected 14 books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Programming Languages, Part B.
Covers advanced topics in type theory and programming languages, including type systems, lambda calculus, and semantics. It valuable resource for those who want to gain a deeper understanding of the theoretical foundations of programming languages.
This book, often referred to as SICP, widely-used textbook that delves into the foundations of computer science and programming, including topics such as data structures, algorithms, and programming paradigms. It provides a solid theoretical basis for the concepts covered in the course.
Provides a comprehensive and up-to-date overview of programming languages and their compilers. It good resource for those who want to gain a deeper understanding of the design and implementation of programming languages.
Guides readers through the process of building interpreters for various programming languages, including a functional language. It complements the course's emphasis on the implementation of programming languages and provides practical insights into how interpreters work.
Provides a comprehensive overview of compiler implementation, using the ML programming language. It valuable resource for those who want to gain a deeper understanding of the process of translating high-level code into machine code.
This comprehensive textbook covers a wide range of programming language concepts, including syntax, semantics, type systems, and programming paradigms. It provides a more general overview of programming languages than the course's focus on functional programming.
Presents a collection of case studies in artificial intelligence programming using Common Lisp, a dialect of Lisp that is similar to Racket, one of the languages used in the course. It provides examples of how to apply functional programming techniques to solve real-world problems.
Provides a concise and accessible introduction to programming languages, covering core concepts such as syntax, semantics, types, and evaluation. It good starting point for those who are new to the field.
Focuses on the practical aspects of programming in Haskell, a purely functional programming language. It provides a hands-on approach to learning the language and its features, which can be beneficial for understanding the concepts covered in the course.
Provides a comprehensive overview of the Lisp programming language, covering both its history and its modern incarnations. It valuable resource for those who want to gain a deeper understanding of the Lisp family of languages, including Racket.
Focuses on the principles and techniques for designing effective software programs. It valuable resource for those who want to improve their programming skills and learn how to write more maintainable and extensible code.
Uses a simplified version of the Scheme programming language to introduce core computer science concepts. It good resource for gaining a deeper understanding of the foundations of programming.
Provides a detailed introduction to the Ruby programming language, which is one of the languages used in the course. It practical guide that covers both the basics and more advanced topics, including object-oriented programming and metaprogramming.
Provides an introduction to the Forth programming language, which is known for its simplicity and efficiency. It good resource for those who want to learn a different programming paradigm and gain insights into low-level programming.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Here are nine courses similar to Programming Languages, Part B.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2024 OpenCourser