The 7 programming paradigmes!
Homoiconic implementations of languages - languages - either OO, functional or procedural, that are written in itself, where you can change the complete syntax, creating your own Domain Specific Languag (DSL), if you want. ▲ ▲ ▲ Functional programming languages - highest abstraction: Think in terms of flow, streams, connectors, transforms, closures (reentrant functions, that keep state, context), lazy evaluation, immutability of data, explicit bindings to flows, contexts, statelessness, dynamic scoping, single stage algorithms. Functional languages have a complex type system, totally avoiding side effects, by design. ▲ ▲ ▲ OO / functional languages - OO core, but functional extensions, such as lambda (anonymous functions), closures (reentrant functions, that keep state, context). ▲ ▲ ▲ Object Oriented (OO) languages - the rather "human way of thinking": Thinking in terms of classes, metaclasses, objects, methods, behaviour, encapsulated / hidden state, polymorphy, inheritance. Only a few OO languages are fully orthogonal - where all methods are available in all objects and even classes are objects, too! ▲ ▲ ▲ Procedural languages with object extensions - still procedural (chained spaghetti code), but coming with some OO extensions, like classes, encapsulation, inheritance, mixins, traits. ▲ ▲ ▲ Procedural languages - chained spaghetti code, no decoupling of model and syntax, thus no kind of abstraction available. ▲ ▲ ▲ Assembly near languages - you still "feel" van Neumann architecture with memory, registers, stack, heap. Highly portable, but the only way of abstraction are macros. ▲ ▲ ▲ Abstraction level