This document discusses expressions and statements in programming languages. It defines an expression as a syntactic entity that may be evaluated to determine its value, while a statement expresses some action to be carried out and usually does not return a value. The main difference is that statements can cause side effects, like updating a variable, while expressions are referentially transparent and do not cause side effects. The document outlines some of the drawbacks of side effects, like making code harder to read, prove, optimize, and process in parallel. It also discusses argument evaluation order and whether languages specify an order or leave it undefined.