Programming Paradigms
Programming paradigms are styles of programming. It is a way to think about
programming , and reflects from the way you write your code. A lot of
languages support multiple paradigms. This includes Ada, C++, C#, Clojure,
Common Lisp, D, E, ECMAScript (which is the standard form of Javascript and
Actionscript), Go, and Haskell. This list could continue, but it would go on
for quite a bit. Its hard to give an thorough definition without showing the
examples so lets get into some of the most common known programming paradigms.
1. Imperative
Imperative programming is a paradigm that uses statements that change
the program’s state. It consists of commands for the computer to perform and
focuses on describing how a program operates. The earliest imperative languages
were machine languages of the original computers. Instructions were very simple,
and that made hardware implementation easier. FORTRAN was one of the earliest
languages that removed the obstacles presented by machine code when creating
complex programs. FORTRAN was developed in 1954 by John Backus at IBM. In the
1960s, you had languages like COBOL, ALGOL, BASIC, and MUMPS. And in the 70s
you had C.There are 2 minor paradigms within this paradigm in itself as well.
2. Procedural
Procedural programming stems from Imperative programming, and is based on
the concept of procedure calls known as routines, subroutines, or functions.
The reason imperative and procedural languages are similar is because
they both make explicit references to the state of the execution environment.
3. Object-Oriented
The second minor paradigm to come out of Imperative programming is Object-
Oriented programming. Object-Oriented programming is based on the concept of
objects which contain data in the form of fields, attributes, or properties,
and code, in the form of procedures. There are two types of Object-Oriented
programming. Class-based languages contain previously defined classes and
objects instantiated by the classes. Prototype-based languages contain objects
and no classes exist. The prototype of an object is just another object to
which the object is linked. Main concepts around this paradigm are
encapsulation (also known as information hiding), composition, inheritance, and delegation. You can refer to the current classes tutorials in the C++ section to get a generalization of how they work together.
4. Functional
Functional programming is a bit different then the others. It is a style of
building the structure and elements of computer programs that treats computation
as the evaluation of mathematical functions and avoids changing state and
mutable data. It has its origins in lambda calculus. You can see how this is
a bit different then imperative-style paradigms, which operate on changing
states with statements , for example a simple assignment. Common languages that
follow this are : Common Lisp, Scheme, Clojure, Wolfram, Racket, Erlang, OCaml,
Haskell, as well as F#. Programming in a function style can be also done within
languages like Perl, PHP, C++ (since C++11), and Kotlin.
#include <functional>
#include <iostream>
/* Define a template function */
template <typename T>;
void PrintValue(T value) { std::cout << value << std::endl; }
int main(void) {
/* A function wrapper to a function */
std::function<void(int)> func_a = PrintValue<int>;
func_a(2015);
return 0;
}
- Generic
Generic programming is a style which algorithms are written in terms of
“types to be specified later” that are then instantiated when needed for
specific types. The first form of generic programming appeared in 1973 with the
languages ML, which stems from Lisp. ML permits writing common functions or
types that differ only in the set of types on which they operate when used. This
generally reduces duplication. Genericity is implemented and supported
differently in various programming languages; the term “generic” has also been
used differently in various programming contexts. For example, in Forth the
compiler can execute code while compiling and one can create new compiler
keywords and new implementations for those words on the fly.
It has few words that expose the compiler behaviour and therefore naturally
offers genericity capacities that, however, are not referred to as such in
most Forth texts. A good example of this is the use of templates in c++:
template <typename T>
class List{
// Class contents.
};
List<Animal> list_of_animals;
List<Car> list_of_cars;
- Metaprogramming
Metaprogramming is a programming technique in which computer programs have
the ability to treat other programs as their data. It means that a program can
be designed to read, generate, analyze or transform other programs, and even
modify itself while running. In some cases, this allows programmers to minimize
the number of lines of code to express a solution, in turn reducing development
time. It also allows programs greater flexibility to efficiently handle new
situations without recompilation. There are a couple of different types of
Metaprogramming. These include : Automatic , Reflective, Template and Macro
based metaprogramming. Here is an example of template metaprogramming in C++:
template <unsigned int n>
struct factorial{
enum { value = n * factorial<n - 1>::value };
};
template <>
struct factorial<0>{
enum { value = 1 };
};
// Usage examples:
// factorial<0>::value would yield 1;
// factorial<4&>::value would yield 24.