Programming Languages Recitation Links

Grammars, Parsing, and Formal Languages

Simple Models of Computation

Type Systems

Memory Management

Function Values and Closures

Higher Order Programming

Translation, Compilation, Bytecode, and Virtual Machines

Lisp and Scheme

ML and the Hindley-Milner type system

No programming language is more "powerful" than any other. Anything that can be written in one language can be encoded in another. That encoding may not necessarily be pleasant or compact, but it is possible. Most languages are hard to reason about in our heads, they have complicated semantics with lots of edge cases. For this reason, people concerned with proving properties of computational systems often instead use simpler (but equally powerful!) computational models like the Lambda Calculus and the Universal Turing Machine Programming languages like C treat functions essentially as dumb labels. You can't bottle up a function into a runtime value and pass it around. To make functions into first-class values in a language we need closures, which are often implemented as the function's code pointer paired with an environment record.First order functions take just data as their arguments. Higher order functions have at least some arguments which are themselves functions.