- Nix is a purely functional language with lazy evaluation.
- One of its types is a derivation which is basically an immutable result of some script / application / other build system ran in sandbox with exactly specified environment.
- Calling derive with same inputs generates same derivation.
- It's lazy... only when something tries to access derivation's files or other properties its build script is run.
You can use derivations as (/ to represent) - packages - generated configuration files / settings - containers - whole OS images ... e.g. I'm building raspi SD card images using Nix.