Programming paradigm

Programming paradigms are a way of grouping programming languages by what they do. Languages can be in more than one paradigm.
Some paradigms look at the way the code is run, such as allowing side effects, or having to do things in a certain order. Other paradigms look at the way that code is grouped, such as putting code into one or two pieces (or instead, many small pieces). Some other paradigms look at the order and pieces that make the program the way it is.
There are two main groups of paradigms, imperative and declarative. A language can be both at the same time.
Imperative programming.
In imperative programs, programmers give the computer a set of ordered steps that need to be done in order to do something. If someone wanted the computer to draw a cat face, they might give directions like "Draw a circle here, draw two smaller circles there, draw two triangles on top" and so on. Imperative programs sometimes have a lot of side effects.
There are two major imperative paradigms, and a lot of the time a language will have both:
Declarative programming.
In declarative paradigms, the programmer tells the computer what to do instead of how to do it. If they wanted the computer to draw a cat face, they might give directions like "Draw a face, draw two eyes, two ears, and a mouth".
The most well-known declarative paradigms are:
Other paradigms.
Some paradigms can be found in both imperative "and" declarative languages. These paradigms are usually found with one of the above paradigms instead of going on their own.
Overview.
Programming languages are grouped by paradigms in the same way that machines might be grouped by what they're used for.
A few languages fit in just one main paradigm, such as:
Most languages, though, are in more than one paradigm. Some of the ones that stand out for having more than just one are:
Having more paradigms is not always good. One time that having fewer paradigms can be a good thing is when there is a language that is only functional. A function in one of these languages sometimes does less work (like only going over the parts of a group of things it actually needs to) than it might have to if the language was also procedural.
Many programming paradigms are as well known for the things they "do not" let people do as for those they "do" let people do. One time where this is true is functional languages. When a functional language is "only" or "mostly" functional, it usually will not allow side-effects. Another time where this is true is structured programming: it is different from normal imperative languages because it does not let programmers use "goto statements" (statements telling the program to go to an earlier step). Because of this and other reasons, people sometimes think new paradigms do not allow enough things. It is sometimes okay for the computer to not let people do things, though: it can help people avoid problems with their code, and let the computer make guesses that so it can run code faster, or even check code for problems before the code runs!
Problems with paradigms.
Some people who study programming languages do not like that paradigms are used to group programming languages, such as Harper and Krishnamurthi. Those people say that a lot of programming languages can't just be grouped into paradigms because languages borrow things and ideas from lots of paradigms.
History.
New paradigms have been created over time, and people either pointed them out at the time, or when looking back. One of the first paradigms that was recognized as a new way of programming was structured programming from the 1960s. The idea of a "programming paradigm" is from 1978 if not earlier, when Robert W. Floyd used it while teaching. The word "paradigm" in the way Robert meant it was first used by Thomas Kuhn in his book, "The Structure of Scientific Revolutions" (1962).
Machine code.
The lowest-level (closest to how the computer likes to understand things) and oldest programming paradigm is machine code, an imperative paradigm. The directions in machine code are just a set of numbers in a certain order. Assembly language is a little bit less low-level (and a little bit less old). In assembly language, the directions for the computer are given mnemonics (easier-to-remember names), and memory addresses (directions to find a piece of information in the computer) can be given names. These are sometimes called first- and second-generation languages.
In the 1960s, assembly languages were made better by adding new things like library COPY, macros (bits of "special" code that got transformed to normal code before the program started running), running procedures (sets of directions given a name and saved for later), and variables (items given names and saved for later) from outside the program. This let people use some code in more than one project, and not have to worry about with hardware-specific problems (problems that only happen one one kind of computer) thanks to commands (names for directions) like READ/WRITE/GET/PUT.
Assembly was, and sometimes still is, used in systems where it is important for the code to be fast, and it is also used a lot in embedded systems because lets the user have exact control of what the machine does.
Procedural languages.
In the very late 1960s, people started inventing procedural languages. These third-generation languages (the first few of what we now call high-level languages) had words related to what they were trying to solve. For example,
Object-oriented programming.
After many people had started using procedural languages, they invented object-oriented programming languages. In these languages, data and its "methods" (ways of manipulating the data) are put in one "object". Some programmers, such as Richard Stallman, do not agree that object-oriented languages are better for explaining ideas to a computer than procedural languages.
Because object-oriented programming is a paradigm, not a language, people have made object oriented assembly languages like HLA (High Level Assembly).
Declarative paradigms.
At the same time, some people were making declarative programming languages. A language that is well known for being declarative is SQL (a language for adding and removing things from tables).