Programming languages are languages designed to instruct machines to do things.

When we interact with computers we are interacting with systems that at the lowest levels of abstraction are just moving bits of electrical current or photons around. At this most basic levels of ones and zeros it's almost impossible to be productive in terms of solving complex problems, so we invent systems that will allow us to solve problems closer to the problem domain that will then be able to be executed by these computing systems. This is where computer languages come into things, a computer language is a formal language that allows us to define semantics for how we want to specify actions that can be translated into something a computer can execute.

There's many different ways in which we can set up systems that will command a computer to do some task, in terms of programming languages there's two main paradigms in which this done:

- Imperative
- Declarative

In an imperative paradigm we are defining a set of actions with which we want a computer to take. By specifying the problem we wish to solve in terms of actions a computer can take we enable a computer to compute the solutions to our problems. The declarative approach focuses on defining the problem and then a computational approach to solve this problem is generated by the implementation of this declarative system.

In the web world we have a few good examples of this difference. A language like Javascript can be used in a very imperative manner, you set out a set of instructions that the computer will perform and it goes and performs this. Contrast this to something like CSS where you are specifying the structure of the problem but not the computational path that will be used to apply this specification to get the desired results.

Picking the right programming language for a project is a very crucial choice since it will greatly impact not only the productivity of the people involved but also will impact the ability to even conceptualize the task at all.