Computer Programming Languages
They just aren't natural. Actually, they are entirely created to allow a computer to perform some sort of computation. With any form of expression there are many takes, thoughts, and ideas. I find languages an interesting way to exploration into methods of human thought.
- C++ - Imperative Object-Oriented Strongly-Typed early binding and linking language supporting gneerics.
- Go - Strange functional/proceederal/generics langague from Google
- Java - A statically typed early bound late linked language taking a partical approach to object orientation targeting a virtual CPU.
- Prolog - A declarative logic language with a strong perference towards inference via relationships between elements.
- Python - Imperative multiparadigm language from a proceedural evolution
- Ruby - An object-oriented language similar to smalltalk without the persistent image.
- Swift - A multiparadigm language geared towards early linking and binding with interoperatability with the Objective-C runtime.
Imperative versus Declarative
The highest conceptual split I've encountered in programming languages is that of imperative versus declarative. In an imperative language you write the stepwise instructions which are then interpreted by a processor like analogue (CPU, GPU, RTC, VM, etc). The set of instructions can be organized into a number of discrete units and recombined to build different programs, which is generally how application progarmmers get things done. With a declarative language one states a solution and it's up to the environment to find the solution.
The most common delcarative languages, HTML and CSS, are generally regarded as 'not real languages' by many. On the opposite side of the specturm there are langauges like Prolog which are primarily declarative, although some imperative paradigms can and are used.
In pratice most languages have aspects of both. For example in the C family of langauges, one must declare the proceedures or methods which haven't yet be defined in the compliation unit. While in the definitions of those elements will be stepwise instructions.
Functional, Logical, Object-Oriented, and Proceedural
Most languages support a multiplicity of paradigms, although generally have a preference for a specific type. For example, C++ supports C compatability via it's proceedural features, could be flexed into a functional paradigm with some bending, however aligns itself heavly on the staticly typed object oriented system. Ruby on the other hand is extremely heavily biased towards objects, even attempting to ceorce all primitives into objects (there are some caveats in the previous statement). In some styles and problem spaces these solutions blur togther into a strange chimera containing aspects of all of them.
In the strongly typed camp we ensure only a specific linage of types may be stored within a variable. This ensure we know the exact type we are intending to operate against and what results those operations should have. On the opposite side we have dynamic typing allowing any object, type, or structure to be held and operated on. With dynamic typing, also called duck typing, we expect those objects to be behave in similar ways as the originally intended target type.