Cours 1 : Introduction aux langages de programmation, Représentation des entiers
Jean Goubault-Larrecq / Juliusz Chroboczek
Introduction aux Langages de Programmation
NB:
Th de la courbe de Jordan : si $𝛤$ est une courbe fermée injective : il y a deux composantes connexes dans le plan : une bornée, l’autre pas bornée. (très difficile à cause des courbes de Peano)
Pb de la mouche : une ligne de chemin de fer fait 125km de long, deux trains vont se croiser depuis des points A et B.
cf John Baez
Styles de langages :
- Impératifs : C, etc…
- Fonctionnels : CamL, Haskell, etc…
- Orienté Objet Attention : ce ne sont que des styles : on peut faire du fonctionnel dans la plupart des langages impératifs, et vice versa (C, CamL, Python)
Ex:
int fact(int n)
{
int i, r;
for(i=1; i <= n; i++) r *= i;
return r;
}
let rec facto n = match n with
0 -> 1
|_ -> n * facto (n-1);;
NB:
- C++ : à la base, langage POO de C; mais mnt : indépendant
- OCamL <- Objective C, autre langage POO à partir de C
Ligne de commande :
cat
: commande pour concaténer un fichier (en pratique, affiche le contenu).
Ex :
cat "Contenu fichier 1" > fichier1
cat "Contenu fichier 2" > fichier2
cat fichier1 fichier2
cat fichier1 fichier2 > fichier3
which commande
Ex : which cat
Pq s’affiche comme ça ? Fichier est plein d’octets : ∃ un mécanisme qui lit les octets et les décode avec une table bas niveau (manipule les registres)
Compilation en C : gcc
Ex :
gcc cat.c -o mycat
Fichier mycat
dont le contenu est incompréhensible pour nous mais pas pour la machine
ls -al
: liste les fichiers avec permissions
Ex:
-rwx
read, write, execute
Il y a un langage intermédiaire entre le C et le langage binaire :
gcc -S cat.c
⟹ fichier cat.s
modifié dans le répertoire courant : il décrit ce que doit faire le programme binaire en assembleur.
TDs
EX1
a)
- Fortran IV (ou 1966) (Formula Translator)
- Impératif
- Affiche “Hello World”
PROGRAM HELLO
WRITE(6,1)
FORMAT 12HELLO, WORLD
STOP
END
WRITE(6,1)
: écris dans le sdtout numéro 6 ce qu’il y a à la ligne 112H
: 12 caractères (H comme le nom de l’inventeur, ayant fondé l’ancêtre d’IBM)STOP
: arrête-toiEND
: programme se termine- Particularité : parallélisation améliorée, développé chez IBM
b)
- Fortran IV (ou 1966) (Formula Translator) (créé en 1954)
- Impératif
-
Calcule $10!$
- FORMAT
I8
:I
= entier,8
= sur 8 caractères -
CONTINUE
: opération vide (pass
en python) : ne rien faire DO 1 I=1,10
boucle pour I allant de 1 à 10 les instructions qu’il y a dans la ligne suivant jusqu’à la ligne 1.- ` ` : 7 espaces introductifs où sont les instructions normales, à moins qu’il y ait un label (numéro introductif)
- 72 caractères par ligne : taille d’une ligne dans la carte perforée où étaient inscrits les caractères.
c)
- Langage : COBOL (1957)
- Pour l’informatique de gestion (affichage de formulaire, impression, etc…)
d)
- BASIC (1970)
- Idée de base : un FORTRAN mais plus simple (inventé par des statisticiens de la côte Ouest des USA)
- Microsoft : au début = toute petite boîte (1976) : font un interprète BASIC pour ces machines ⟹ font fortune car Apple, etc… l’utilisaient.
- Toutes les lignes sont numérotées
- PAS le Visual Basic ++ de Microsoft
e)
- Langage : Common LISP (1960), créé par le mathématicien McCarthy
- Langage pas typé
i 1 (+ i 1)
: pour i partant de 1, dont la nouvelle valeur sera i+1 (après l’instruction parallèle sur j)(>= i n) j
si i >= n, retourner j- concurrent : Lanage Scheme (LE langage fonctionnel de référence pour l’éducation en USA du Nd)
- Il y a tout les styles possibles : impératif, fonctionnel, …
- Raison du succès : trop de langages différents ⟹ appel d’offre international des USA (entreprise) pour uniformiser tout ⟹ ADA perce (par un fr). MAIS : plein de gens n’aime pas l’ADA : utilise le concurrent Common LISP à la place (notamment pour l’IA).
f)
- Langage : Scheme (1973-80)
- Introduction de la portée lexicale (le premier à la faire) : langage lexical = un langage dans lequel on a un espoir de comprendre ce qu’on a écrit.
- Labo d’idées étranges : primitives délirantes faites en Scheme. Son inventeur compile le langage dans le “style de continuation” : primitive extrêmement efficace (appelée ‘call with current continuation’ : permet de faire énormément de trucs (revenir en arrière (avant qu’un bug se déclenche, etc…) : rend possible le voyage dans le passé, dans un programme : fait une copie de toute la pile et tous les registres, et la passe en argument à la fonction appelée, qui peut donc revenir dans un état antérieur))
g)
- Calcule factorielle 10
- APL (A Programming Language): Langage vieux créé par Ken Iverson (1960)
- Langage concis : plus illisible que Perl
- Écrit avec un clavier spécial et une fonte spéciale
- Langage J : version “démocratisée d’APL” (les caractère spéciaux peuvent être tapés avec un clavier normal (ex: “iota”))
- Travaille sur des vecteurs et des matrices
- $𝜄10$ : vecteur des entiers de 1 à 10
- ’/’ : insertion de l’opérateur dans le vecteur
h)
- Python
i)
- Pascal
- Assez proche de C
- ’:=’ affectation
- Son créateur : un professeur Suisse-Allemand (Wierth)
- A deux conventions d’appel de fonctions : par valeur et par référence
- Pour l’enseignement des languages des langages de programmation. À l’époque : tout le monde programmait en FORTRAN. Mais bcp de
GOTO ⟹ Djikstra : écrit article "GOTO is harmful" : promeut les boucles
while`
j)
- C
k)
- Haskell (1990) (open source): successeur du langage de Miranda (commercial : sans succès)
- Langage fonctionnel
- VS CamL : c’est un langage paresseux (par nécessité) (PAS en appel par valeur (comme Python, …)).
i.e (évaluation paresseuse): facto(3+1), ne calcule pas d’abord 3+1. Rentre dans factoriel, puis teste 3+1 à la place de n.
⟹ si f est une fonction qui a un argument, mais qui ne l’utilise pas : argument PAS appelé, même si ne termine pas
Ex: f(programme) = return 3;;
En Haskell : f(function while True) termine !
VS évaluation par valeurs (PAS paresseuse): plus rapide, car on n’alloue pas de la mémoire pour l’argument qu’on n’a pas encore exécuté (+ : il y a un ‘flag’ pour dire si on a déjà exécuté ou non l’argument (puis, si on le fait : on stocke la valeur dans espace réservé à côté du ‘flag’))
Évaluation paresseuse : permet de faire des beaux programmes.
Nbs de Hamming : nbs qui n’ont comme facteurs premiers que 3, 5, et 7.
Programme : retourner (énumérer, à chaque fois qu’on tape ‘return’) tous les nbs de Hamming dans l’ordre.
En Haskell (paresseux) : on crée des listes l3, l5, l7 des listes d’entiers.
l3 = 1 : map(3*l3)
on fait pareil pour l5, l7 : puis on ‘fusionne’ les trois listes infinies (on compare les têtes, et on prend la plus petite des trois).
Ex2: Programme qui prend des formules du premier ordre, et cherche des modèles finis (de cardinal $n$). Programme le plus efficace qui existe : écrit en Haskell
l)
- CamL
m)
- Standard ML : langage créé en labo au New Jersey
n)
- Prolog
- Ni fonctionnel, ni impératif, ni POO : langage logique
- Langage qui backtrack naturellement : sait chercher et rebrousser chemin
- Calcule la factorielle
fact(N,M)
prédicat à deux paramètres : comment vérifier que M est la factorielle de N- N et M sont en relation ssi …
- Dans les premiers Prolog : pas d’affection avec
=
: avant :2+y=5
⟶ réponse :YES. y = 3
o)
- Bash : successeur du Shell
- Jeu de mot avec “Born again Christian”, avec Shell
- De plus : Bash veut dire “critiquer acerbement quelqu’un à propos de qch”
p)
- FORTH : langage créé pour un observatoire, langage de quatrième génération
- Calcule la factorielle
:
: une fonction- Langage qui marche avec une pile, où on empile les arguments
- Fonctionnel, en notation polonaise inverse (sauf pour le
if
)
q)
- PostScript
- Langage énormément utilisé : pour les imprimantes
- Mais : un vrai langage
- Pdf : c’est du PostScript en binaire compressé.
r)
- Ada : du nom de Lady Ada Lovelace : première programmeuse au monde (calculabilité)
- Langage qui vérifie tout le temps des types : type Positive ⟶ attention quand on fait -1 (déclenche exceptions)
- Raison du crash de Ariane 5 : écrit en ADA. Le programme d’Ariane 4 avait été récupéré, code qui faisait des statistiques (pression, etc…) inutiles : ce code a été laissé en place, parce qu’on ne sait pas ce qui se passe si on touche. Pb : la fusée va plus vite qu’Ariane 4. Mais accélération horizontale dépasse la borne ⟶ valeur de l’exception pas gérée ⟹ -1 codé comme 4 000 000 000 ⟶ tourne que 4 000 000 000 de degrés au lieu de -1 degré.
Représentation des entiers
- Nombres en base 2
- Représentation alternative : coefficients : -1, 0 ou 1 ⟹ addition se fait en hardware en tps cst, contrairement au binaire
- Processeur calcule sur 32 ou 64 bits (représentation sur une taille fixe)
Sur 32 bits : entiers non signés : de $0$ à $2^{32}-1$
⟹ on calcule modulo $2^{32}$
Sur 8 bits : de 0 à 255
Pour les entiers signés (relatifs) :
- de -128 à 127
Sur 32 bits signés :
- de $-2^{31}$ à $2^{31}-1$
⟹ En non signé :
2^7 = 128 = 1 000 000 0
127 = 0 111 111 1
signé :
-128 = 1 000 0000
-127 = 1 000 0001
⋯
-1 = 1 111 1111
0 = 0 000 0000
1 = 0 000 0001
⋯
+127 = 0 111 1111
⟹ en complément à 2 :
- on tourne : 127+1 ⟶ -128
- le premier bit = bit de signe
Leave a comment