Functional programming models computations as expressions rather than instructions. It emphasizes immutable data and functions, and avoids mutable state. Some key aspects of functional programming include: treating functions as first-class values, recursion instead of loops, lazy evaluation, and immutable data structures. While any language can support aspects of functional programming, some languages are better optimized for the functional style.