Histoire

Premières machines

La machine d'Anticythère (avant 87 av. JC) servait à réaliser des calculs d'astronomie :

La pascaline (conception entre 1642 et 1654) est une machine à calculer (addition, soustraction, multiplication, division) :

Premières machines programmables

Le métier Jacquard utilisait des cartes perforés pour stocker des programmes de tissages.

Note G de Ada Lovelace, publié en 1843, montre un programme qui calcule des nombres de Bernouilli pour la machine analytique de Charles Babbage.

C'est un enfer : les variables s'appellent $$V_1, V_2, V_3, \dots$$ Ne pas faire ça !

1950-1960 : les premières bonnes idées

FORTRAN

FORTRAN (FORmula TRANslator) est un langage pour le calcul scientifique et numérique. Il a été créé en 1957 par John Backus :

Voici un exemple de programme en FORTRAN (première version) :

C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
C INPUT - TAPE READER UNIT 5, INTEGER INPUT
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
      READ INPUT TAPE 5, 501, IA, IB, IC
  501 FORMAT (3I5)
C IA, IB, AND IC MAY NOT BE NEGATIVE OR ZERO
C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
C MUST BE GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO
      IF (IA) 777, 777, 701
  701 IF (IB) 777, 777, 702
  702 IF (IC) 777, 777, 703
  703 IF (IA+IB-IC) 777, 777, 704
  704 IF (IA+IC-IB) 777, 777, 705
  705 IF (IB+IC-IA) 777, 777, 799
  777 STOP 1
C USING HERON'S FORMULA WE CALCULATE THE
C AREA OF THE TRIANGLE
  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRTF( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +     (S - FLOATF(IC)))
      WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
  601 FORMAT (4H A= ,I5,5H  B= ,I5,5H  C= ,I5,8H  AREA= ,F10.2,
     +        13H SQUARE UNITS)
      STOP
      END

De bonnes idées :

  • instruction pour lire, écrire, des commentaires
  • prémisses du if : ici il est ternaire (saut si négatif, si nul, si positif)

De mauvaises idées :

  • que des GO TO

COBOL

COBOL (COmmon Business Oriented Language) pour des applications de gestion a une syntaxe compréhensible par un humain.

  ADD montant TO total-jour total-mois total-annee.

Il a été créé en 1959 par le Short Range Committee, dont Grace Hopper.

De bonnes idées :

  • proche de la langue naturelle (ah si Grace Hopper avait connu les LLMs !)

  • types structurés

          01 NomPrenom.
              05 Prenom PIC X(20).
              05 Nom    PIC X(20).
    

PIC (pour PICTURE) indique le type des données, ici des caractères (X) au nombre de 20.

LISP

En 1960, LISP (LISt Processor) was created by John McCarthy.

(defun factorial (n)
  (if (= n 1)              
      1                           
      (* n (factorial (- n 1))))) 

Plein de bonnes idées (cf. https://paulgraham.com/diff.html) :

  • Des vrais if

  • Les fonctions sont des objets comme les autres

  • Il n'y a que des pointeurs (comme dans Python, Java, Javascript, etc.)

  • Pas de gestion de la mémoire explicite car il y a un ramasse-miette

  • un type 'symbole'

  • Utilisation du langage lui-même pour représenter des données. C'est du JSON, du XML avant l'heure. D'ailleurs toujours utilisé en planification automatique avec le Planning Domain Definition Language.

    (define (problem strips-gripper2)
    (:domain gripper-strips)
    (:objects rooma roomb ball1 ball2 left right)
    (:init (room rooma)
          (room roomb)
          (ball ball1)
          (ball ball2)
          (gripper left)
          (gripper right)
          (at-robby rooma)
          (free left)
          (free right)
          (at ball1 rooma)
          (at ball2 rooma))
    (:goal (at ball1 roomb)))
    
  • Mélange entre programme et données, la fonction eval

ALGOL

En 1960, ALGOL60 (ALGOL58 existait mais c'était des prémisses) est créé, avec notamment John Backus et Peter Naur, mais aussi John McCarthy et plein d'autres. Le comité s'est réuni à Paris du 11 au 16 janvier 1960.

procedure Absmax(a) Taille:(n, m) Resultat:(y) Indices:(i, k);
    value n, m; array a; integer n, m, i, k; real y;
comment  Dans la procédure Absmax (a, n, m, y, i, k)
         le plus grand élément en valeur absolue de la matrice a de taille
         n par m est transféré à y et les indices de cet élément à i et k ;
begin integer p, q;
    y := 0; i := k := 1;
    for p:=1 step 1 until n do
        for q:=1 step 1 until m do
            if abs(a[p, q]) > y then
                begin
                    y := abs(a[p, q]);
                    i := p; k := q;
                end
end Absmax

Bonnes idées :

  • des blocs BEGIN, END

John Backus et Peter Naur sont aussi les inventeurs de la Backus–Naur form (BNF). Voici par exemple une grammaire en BNF pour la logique propositionnelle :

$$\phi, \psi, \dots ::= p \mid (\phi \lor \psi) \mid (\lnot \phi)$$

C'est Charles Antony Richard Hoare qui a écrit le premier compilateur pour ALGOL 60.

Charles Antony Richard Hoare est aussi connu :

  • l'invention du tri rapide
  • la logique de Hoare

Il a écrit : « Voici un langage très en avance de son temps, il n'a pas seulement été une amélioration de ses prédécesseurs mais aussi une amélioration de presque tous ses successeurs ».

1960-1980

Simula

En 1965, dans “Record Handling", Charles Antony Richard Hoare évoque les prémisses de la programmation orientée objet. Simula 67 (Simple universal language), inventé à Oslo par Ole-Johan Dahl and Kristen Nygaard. Comme surcouche d'Algol 60, est le premier langage conçu pour pouvoir intégrer la programmation orientée objet et la simulation par événements discrets.

Begin
   Class Glyph;
      Virtual: Procedure print Is Procedure print;;
   Begin
   End;
   
   Glyph Class Char (c);
      Character c;
   Begin
      Procedure print;
        OutChar(c);
   End;
   
   Glyph Class Line (elements);
      Ref (Glyph) Array elements;
   Begin
      Procedure print;
      Begin
         Integer i;
         For i:= 1 Step 1 Until UpperBound (elements, 1) Do
            elements (i).print;
         OutImage;
      End;
   End;
   
   Ref (Glyph) rg;
   Ref (Glyph) Array rgs (1 : 4);
   
   ! Main program;
   rgs (1):- New Char ('A');
   rgs (2):- New Char ('b');
   rgs (3):- New Char ('b');
   rgs (4):- New Char ('a');
   rg:- New Line (rgs);
   rg.print;
End;

Langage C

Le langage C est un des premiers langages de programmation système, est développé par Dennis Ritchie et Ken Thompson pour le développement d'Unix aux laboratoires Bell entre 1969 et 1973.

#include <stdio.h>

int main(void)
{
    printf("hello, world\n");
    return 0;
}

BASIC

1964 - BASIC (Beginner's All-purpose Symbolic Instruction Code) est un langage pour le grand public.

 'Voici un petit code fait en BASIC moderne
 INPUT "Quel est votre nom"; UserName$ 'On demande le nom de l'utilisateur
 PRINT "Bonjour "; UserName$ 
 DO 
   INPUT "Combien d'étoiles voulez-vous"; NumStars 'On demande le nombre d'étoiles de l'utilisateur
   Stars$ = ""
   Stars$ = REPEAT$("*", NumStars) '<-ANSI BASIC
   'Stars$ = STRING$(NumStars, "*") '<-MS BASIC
   PRINT Stars$
   DO
     INPUT "Voulez-vous plus d'étoiles"; Answer$
   LOOP UNTIL Answer$ <> ""
 LOOP WHILE UCASE$(LEFT$(Answer$, 1)) = "O"
 PRINT "Au revoir ";
 FOR A = 1 TO 200
   PRINT UserName$; " ";
 NEXT A
 PRINT

Le typage est implicite, et si les variables dont le nom termine par $ sont des chaînes de caractères.

Smalltalk

Smalltalk (milieu des années 1970) est l'un des premiers langages de programmation à disposer d'un environnement de développement intégré complètement graphique.

| rectangles aPoint|
rectangles := OrderedCollection 
  with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)
  with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).
aPoint := Point x: 20 y: 20.
collisions := rectangles select: [:aRect | aRect containsPoint: aPoint].

PROLOG

Prolog (PROgrammation LOGique), défini en 1972 par Colmerauer, Roussel et Kowalski (en) est le premier langage de programmation logique.

frère_ou_sœur(X,Y) :- parent(Z,X), parent(Z,Y), X \= Y.
parent(X,Y) :- père(X,Y).
parent(X,Y) :- mère(X,Y).
mère(trude, sally).
père(tom, sally).
père(tom, erica).
père(mike, tom).

ML

ML (Meta Language) inventé par Robin Milner en 1973, construit sur un typage statique fort et polymorphe au-dessus de Lisp, pionnier du langage de programmation généraliste fonctionnel.

fun fac (0 : int) : int = 1
  | fac (n : int) : int = n * fac (n - 1)

Pascal

Pascal a été créé par Niklaus Emil Wirth en 1970 conçu pour l'enseignement.

program HelloWorld(output);
begin
  writeln('Hello World');
  readln;
end.

SQL

SQL (Structured Query Language) est un langage pour écrire des requêtes à une base de données. Créé en 1974 par Donald D. Chamberlin et Raymond F. Boyce.

SELECT nom, service
FROM   employe
WHERE  statut = 'stagiaire'
ORDER  BY nom;

1980-1990 : mélanger performance et programmation objet

Ada

En 1983, Ada créé Jean David Ichbiah. C'est un langage impératif et fortement typé avec compilateur certifié.

Il repose sur de la programmation par contrat. Autrement dit, on peut écrire les préconditions et postconditions directement dans le langage.

procedure Put_Line (File : in File_Type; Item : in String)
    with Pre => (Is_Open (File)),
    Post => (Line (File) = Line (File)’Old + 1);

On peut aussi définir des types "sémantiques" :

subtype Prime is Integer range 2 .. Integer’Last
    with Dynamic_Predicate
        => (not (for some N in 2 .. Prime - 1
                => Prime mod N = 0));

C++

C++ est créé en 1983 par Bjarne Stroustrup.

#include<iostream>

int main()
{
    std::cout << "Hello, new world!\n";
}

Perl

En 1987, Perl (Practical Extraction and Reporting Language) est créé par Larry Wall. En 2019, Perl 6 s'appelle Raku. L'objectif est de faciliter le reporting dans la console.

#!/usr/bin/env perl
use strict;
use warnings;

my ( $remaining, $total );

$remaining=$total=shift(@ARGV);

STDOUT->autoflush(1);

while ( $remaining ) {
    printf ( "Remaining %s/%s \r", $remaining--, $total );
    sleep 1;
}

print "\n";

1990-2010 : développer plus vite et... Internet !

1990 - Haskell 1991 - Python 1993 - Lua 1994 - ANSI Common Lisp 1995 - Java 1995 - PHP 1995 - Ruby 1996 - JavaScript 1996 - OCaml 2001 - C#

Python

L'ancêtre de Python est le langage ABC développé au CWI (Centrum voor Wiskunde en Informatica) par Leo Geurts, Lambert Meertens, et Steven Pemberton. Le but était d'être simple à utiliser. Guido van Rossum participe au projet.

HOW TO RETURN words document:
  PUT {} IN collection
  FOR line IN document:
      FOR word IN split line:
        IF word not.in collection:
            INSERT word IN collection
  RETURN collection

Guido van Rossum développe un langage de script à partir de 1989 : il l'appelle Python. En février 1991, Python 0.9.0 est publié.

def words(document):
  collection = set()
  for line in document:
      for word in line.split(" "):
        if word not in collection:
            collection.add(word)
  return collection

2010 : un monde encore plus sûr, ou pas

Go

Go est utilisé pour de la programmation système. Inventé par Google en 2009-2010.

package main

import "fmt"

func main() {
	fmt.Println("Hello, world")
}

Rust

En 2010, Rust voit le jour.

#![allow(unused)]
fn main() {
enum Forme {
    Point,               // une forme peut être un point, sans données attachées.
    Cercle(f64),         // une forme peut être un cercle, caractérisé par son rayon.
    Rectangle(f64, f64), // une forme peut être un rectangle, caractérisé par les longueurs de deux de ses côtés adjacents.
}

fn aire(f: Forme) -> f64 {
    match f {
        Forme::Point => 0.0,
        Forme::Cercle(rayon) => rayon * rayon * 3.1415926535897932384626433832795,
        Forme::Rectangle(cote_a, cote_b) => cote_a * cote_b,
    }
}
}

Typescript

TypeScript - version typé fortement de Javascript

Programmation réactive

La programmation Web demande d'assurer l'adéquation entre le contenu de variables du programme et l'affiche. Pour cela, la programmation réactive permet d'écrire

      <div>{{x}}</div>

où la page HTML se met à jour automatiquement lorsque le contenu de la variable x change. Il y a plusieurs framework : React, Vue, Svelte.

La langue naturelle ?

Quid de la programmation du futur ? Si on donne ce prompt à un LLM, ça fonctionne :

    Convertit moi ce tableau en JSON.

ou alors :

    Donne moi un programme qui convertit n'importe quel tableau en JSON.