Programming languages can be grouped by the number and types of paradigms supported.
Some programming language researchers criticise the notion of paradigms as a classification of programming languages, e.g. Krishnamurthi. They argue that many programming languages cannot be strictly classified into one paradigm, but rather include features from several paradigms. This is clearly demonstrated in the table below. (Which is silent on the level of support of different 'paradigms'.)
A concise reference for the programming paradigms listed in this article.
Concurrent programming – have language constructs for concurrency, these may involve multi-threading, support for distributed computing, message passing, shared resources (including shared memory), or futuresActor programming – concurrent computation with actors that make local decisions in response to the environment (capable of selfish or competitive behavior)Constraint programming – relations between variables are expressed as constraints (or constraint networks), directing allowable solutions (uses constraint satisfaction or simplex algorithm)Dataflow programming – forced recalculation of formulas when data values change (e.g. spreadsheets)Declarative programming – describes actions (e.g. HTML describes a page but not how to actually display it)Distributed programming – have support for multiple autonomous computers that communicate via computer networksFunctional programming – uses evaluation of mathematical functions and avoids state and mutable dataGeneric programming – uses algorithms written in terms of to-be-specified-later types that are then instantiated as needed for specific types provided as parametersImperative programming – explicit statements that change a program stateLogic programming – uses explicit mathematical logic for programmingMetaprogramming – writing programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtimeTemplate metaprogramming – metaprogramming methods in which templates are used by a compiler to generate temporary source code, which is merged by the compiler with the rest of the source code and then compiledReflective programming – metaprogramming methods in which a program modifies or extends itselfObject-oriented programming – uses data structures consisting of data fields and methods together with their interactions (objects) to design programsClass-based – object-oriented programming in which inheritance is achieved by defining classes of objects, versus the objects themselvesPrototype-based – object-oriented programming that avoids classes and implements inheritance via cloning of instancesPipeline programming – a simple syntax change to add syntax to nest function calls to language originally designed with noneRule-based programming – a network of rules of thumb that comprise a knowledge base and can be used for expert systems and problem deduction & resolutionVisual programming – manipulating program elements graphically rather than by specifying them textually (e.g. Simulink); also termed diagrammatic programming