A programming paradigm is a complex of concepts, principles and abstractions which define a fundamental style of programming.
A paradigm can be determined by usage of entities like
- program states and statements which change them (imperative programming),
- stateless mathematical functions (functional programming),
- objects and interactions between them (object-oriented programming),
- algorithms and containers which operate with types provided as parameters (generic programming),
- values and value-to-value operations (value-level programming), etc.
Note that it is not necessary for a language to use one and only one paradigm. Languages which are designed to support several paradigms are called multi-paradigm. Such languages claim that no paradigm can be universally efficient for all problems, and allow the programmer to choose the best programming style for approaching each specific problem.
Some paradigms can be grouped in antagonistic pairs: thus, any language is either value-level or function-level, but not both at the same time. Other paradigms, like declarative and imperative, are used as contrast but can be implemented in one language. Finally, some paradigms are restricted cases of others: function-level programming is a kind of functional programming, but with more limited ways of defining new functions.