# Principles of Programming Languages

## Overview

POPL is meant as a precursor for Compiler Construction. This course takes you through the design of programming languages and programming grammars. It also covers programming paradigms like functional programming ([`LISP`](https://bit.ly/2hcgoMq), logic programming ([`Prolog`](https://en.wikipedia.org/wiki/Prolog)) and `C++`. You will also learn the various data structures and ideas involved in the backend of these languages such as `activation records`, `tail recursion`, etc.

## Navigation

* [Prerequisites](#prerequisites)
* [Textbooks](#textbooks)
* [Videos](#videos)
* [Websites](#websites)

## Prerequisites

This course is a prerequisite for:

* [Compiler Construction](https://bpdc-acm.gitbook.io/openlib-cs/courses/csf363)

This course has the following prerequisites:

* [Computer Programming](https://bpdc-acm.gitbook.io/openlib-cs/courses/csf111)

## Textbooks

| Title                                                                                                                                 | Author(s)                                                    |   Edition   |
| ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | :---------: |
| [Introduction to Programming Languages](https://drive.google.com/file/d/1hK8wL2KtNPtpocwHlogaUOnCWRwq8FZ9/view?usp=sharing)           | Arvind Kumar Bansal                                          |  5th (2014) |
| [Fundamentals of Programming Languages](https://drive.google.com/file/d/1MFnF-ADG8Q7hGNN0L15DRnkMHqmdR0oQ/view?usp=sharing)           | Ellis Horowitz                                               |  2nd (1984) |
| [Programming Languages : Principles and Practice](https://drive.google.com/file/d/1vWsMkAeMeVybZw0KidUIs19W2EOWQYU3/view?usp=sharing) | Kenneth C. Louden & Kenneth A. Lambert                       |  3rd (2011) |
| [Programming Language Design Concepts](https://drive.google.com/file/d/1eJ2lWu91j4GCYCCWxZdogakeFmqmAgjx/view?usp=sharing)            | David A. Watt & William Findlay                              |  2nd (2004) |
| [Concepts of Programming Languages](https://drive.google.com/file/d/1CPYmIegnpRCKtjqOALLp9kmyUaYEfv1i/view?usp=sharing)               | Robert W. Sebesta                                            | 11th (2016) |
| [Compilers : Principles, Techniques & Tools](https://drive.google.com/file/d/1AOm3Pduu5asup7C_zEN2PQoX2cflUufm/view?usp=sharing)      | Alfred V. Aho, Monica S. Lam, Ravi Sethi & Jeffrey D. Ullman |  2nd (2007) |

## Videos

* [LISP Tutorial, *Derek Banas*](https://www.youtube.com/watch?v=ymSq4wHrqyU)
* [Prolog Tutorial, *Derek Banas*](https://www.youtube.com/watch?v=SykxWpFwMGs)
* [C++ Tutorial, *freeCodeCamp*](https://www.youtube.com/watch?v=vLnPwxZdW4Y)
* Postfix & prefix:
  * [Infix to postfix, *Yaar Padha De*](https://www.youtube.com/watch?v=vXPL6UavUeA)
  * [Infix to prefix, *Easy Engineering Classes*](https://www.youtube.com/watch?v=UK16ttNfGSk\&t=74s)
  * [Evaluate prefix expression, *Education4U*](https://www.youtube.com/watch?v=op_NxwPY61I)
  * [Evaluate postfix expression, *Education4U*](https://www.youtube.com/watch?v=84BsI5VJPq4)
* [Leftmost & rightmost derivation, *Neso Academy*](https://www.youtube.com/watch?v=u4-rpIlV9NI)
* [Ambiguous grammar, *Neso Academy*](https://www.youtube.com/watch?v=wQjppolFdas)
* [Abstract syntax tree (AST), *TO Courses*](https://www.youtube.com/watch?v=kUKfvHkzpYE)
* [Left Recursion & Left Factoring, *Knowledge Gate*](https://www.youtube.com/watch?v=rDBafyxYCW8\&list=PLmXKhU9FNesSmu-_DKC7APRoFkaQvGurx\&index=9)
* [Left Recursion & Left Factoring II, *Ravindrababu Ravula*](https://www.youtube.com/watch?v=3_VCoBfrt9c\&list=PLEbnTDJUr_IcPtUXFy2b1sGRPsLFMghhS\&index=4)

## Websites

* [ C++ Tutorial, *tutorialspoint*](https://www.tutorialspoint.com/cplusplus/)
* [ Prolog Tutorial, *GeeksforGeeks*](https://www.geeksforgeeks.org/prolog-an-introduction/)
* [PicoLisp Tutorial, *Software Lab*](https://software-lab.de/doc/tut.html)
