
<center><img src="https://i.imgur.com/8xTIMVy.png " width=auto height=400 /> </center>  

## An algorithm is 
- a set of rules (finite)
- sequence (finite)
- The goal is to take an input and give an output with the solution 

## How to write an algorithm
1) What do you have available ; What is the output that your searching for => this is call specifications
2) How : find resolution methods and choose the best one
3) Formalism : shape it like a computer talk
4) Translate : 

## Compilation and interpretation
### Compiler
```mermaid
flowchart TD

A[High Level source code] -->|Compiler| B[Machine code]

B --> C[execution]

B --> D[execution 2]

B --> E[execution ...]
```
The compiler depends on 
- Language of the source code
- The computer it will run the code

Advantages :
- 1 translation
- Optimises the code

> C or C++ language use the compiler 
### Interpretation
The interpretor is a live compiler that translate in realtime. 

Disavantages:
- Don't optimize the code

Avantages:
- We can share only the original source code

> Javascript use interpretation

## Language families
There is two families in the language word, the imperative and the declarative
### Imperative
- State (of the memory)
- Instruction that will modify the state of the memory
- and again...
- output

### Declarative
- Defines relations between the input and the output

In the declarative languages we have
- The functional languages
- $f:x -> x+1$
- The logical languages
$$x\in{N}$$
$$x>1$$
$$x<3$$
$$\text{-> } x=2$$


