Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.



Documents pareils
OCL - Object Constraint Language

Algorithmique et Programmation Fonctionnelle

Évaluation et implémentation des langages

Java Licence Professionnelle CISII,

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

UE Programmation Impérative Licence 2ème Année

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions


1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours de Programmation 2

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Classes et Objets en Ocaml.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Chapitre VI- La validation de la composition.

Algorithmique et programmation : les bases (VBA) Corrigé

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Traduction des Langages : Le Compilateur Micro Java

Cours d Algorithmique et de Langage C v 3.0

Les chaînes de caractères

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Présentation du langage et premières fonctions

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

ALGORITHMIQUE ET PROGRAMMATION En C

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Programmer en JAVA. par Tama

Cours d Informatique

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Cours d initiation à la programmation en C++ Johann Cuenin

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

IFT2255 : Génie logiciel

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Langage SQL : créer et interroger une base

Initiation à la programmation en Python

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Gestion distribuée (par sockets) de banque en Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Objets et Programmation. origine des langages orientés-objet

Cours d algorithmique pour la classe de 2nde

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Chap III : Les tableaux

Conventions d écriture et outils de mise au point

Plan du cours. Historique du langage Nouveautés de Java 7

Utilisation d objets : String et ArrayList

STAGE IREM 0- Premiers pas en Python

Initiation à JAVA et à la programmation objet.

Algorithmique et Programmation, IMA

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Object Constraint Language (OCL)

Correction de l examen de la première session

Recherche dans un tableau

Diagramme de classes

Algorithme. Table des matières

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Feuille TD n 1 Exercices d algorithmique éléments de correction

Les structures de données. Rajae El Ouazzani

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Chapitre 2. Classes et objets

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Environnements de développement (intégrés)

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

TP3 : Manipulation et implantation de systèmes de fichiers 1

Programmation. fonctionnelle, impérative, logique et orientée objet

Génie Logiciel avec Ada. 4 février 2013

Les indices à surplus constant

Algorithmes récursifs

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Claude Delannoy. 3 e édition C++

Partie publique / Partie privée. Site statique site dynamique. Base de données.

Auto-Entreprise : Activités : Eric SOTY - Siret n Formation Bureautique, continue d'adultes. Tél : Fax :

Initiation à LabView : Les exemples d applications :

L informatique en BCPST

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

UML et les Bases de Données

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Premiers pas avec Mathematica

Une introduction à Java

Langage Java. Classe de première SI

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Corrigé des TD 1 à 5

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Cours de Systèmes d Exploitation

Qualité du logiciel: Méthodes de test

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Solutions du chapitre 4

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Héritage presque multiple en Java (1/2)

Transcription:

Université Montpellier-II UFR des Sciences - Département Informatique - Licence Informatique UE GLIN302 - Programmation Applicative et Récursive Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle. Notes de cours - 2007-2012 5 Lambda-calcul Le lambda-calcul est un système formel (Alonzo Church 1932), (langage de programmation théorique 1 ) qui permet de modéliser les fonctions calculables, récursives ou non, et leur application à des arguments. Le vocabulaire relatif et les principes d évaluation des expressions en Lisp ou Scheme sont hérités du lambda calcul. Les expressions du lambda-calcul sont nommées lambda-expressions ou lambda-termes, elles sont de trois sortes : variables, applications, abstractions. * variable : équivalent des variables en mathématique (x, y...) * application : notée uv, où u et v sont des lambda-termes représente l application d une fonction u à un argument v ; * abstraction : notée λx.v ou x est une variable et v un lambda-terme, représente une fonction, donc l abstraction d une expression à un ensemble de valeurs possibles. Ainsi, la fonction f qui prend en paramètre le lambda-terme x et lui ajoute 1 (c est-à-dire la fonction f : x x + 2) sera dénotée en lambda-calcul par l expression λx.(x + 2). Le lambda-calcul permet le raisonnement formel sur les calculs réalisés à base de fonction grâce aux deux opérations de transformation suivantes : alpha-conversion : λx.xv λy.yv beta-réduction : (λ x.xv) a av (λx.(x + 1))3 3 + 1 Ce sont les mêmes constructions et opérations de transformations qui sont utilisés dans les langages de programmation actuels. Nous retrouvons en Scheme les concepts de variable, fonction, application de fonctions et le calcul de la valeur des expressions par des beta-réductions successives. 6 Identificateurs 6.1 Définition identificateur nom donné à un couple emplacementmémoire-valeur. Selon la façon dont un identificateur est utilisé dans un programme, il dénote soit l emplacement soit la valeur 2. 1 Jean-Louis Krivine, Lambda-Calcul, types et modèles, Masson 1991 2 voir termes L-Value (emplacement) et R-Value (contenu). 1

Dans l expression (define pi 3.14116), l identificateur pi dénote un emplacement en mémoire. define est une structure de contrôle (voir plus loin) du langage Scheme qui permet de ranger la valeur v dans un emplacement mémoire (dont l adresse est choisie par l interpréteur et inaccessible au programmeur) nommé id. Dans l expression (* pi 2), l identificateur pi dénote la valeur rangée dans l emplacement en mémoire nommé pi. 6.2 Evaluation d un indentificateur Soit contenu la fonction qui donne le contenu d un emplacement mémoire et casemémoire la fonction qui donne l emplacement associé à un identificateur alors pour tout identificateur ident : val(ident) = contenu(casem emoire(ident)) Il en résulte que : 1 > ( pi 2) 2 6.28... Erreurs liées à l évaluation des identificateurs : reference to undefined identifier : 6.3 Environnement Environnement : ensemble des liaisons identificateur-valeur définies en un point d un programme. Un environnement est associé à toute exécution de fonction (les règles de masquage et d héritage entre environnements sont étudiées plus loin). L environnement associé à l application de la fonction g ci-dessous est ((x 4) (y 2)). 1 >(define x 1) 2 >(define y 2) 3 >(define g (lambda (x) (+ x y))) 4 >(g 4) 5 6 7 Définition de fonctions 7.1 Abstraction Une fonction définie par un programmeur est une abstraction du lambda-calcul et prend la forme syntaxique suivante : (lambda(param1 paramn) corps) Une fonction possède des paramètres formels en nombre quelconque 3 et un corps qui est est une S-expressions. La représentation interne d une abstraction est gérée par l interpréteur du langage, elle devient un élément du type prédéfini procédure. 1 > (lambda (x) (+ x 1)) 2 #<procedure:15:2> 3 L extension a un nombre quelconque de paramètres est obtenu par un procédé dit de Curryfication - voir ouvrages sur le lambda-calcul 2

On distingue ainsi le texte d une fonction (texte de programme) et sa représentation interne (codée, en machine). 4 7.2 Application L application de toute fonction est identique à l application des fonctions prédéfinies à ceci près que les premières ne sont pas nécessairement associées à un identificateur. 1 > ((lambda (x) (+ x 1)) 3) 2 4 3 > ((lambda (x) ( x x)) (+ 2 3)) 4 25 Pas à pas. 1 > ((lambda (x) (+ x 1)) 3) 2 > (lambda (x) (+ x 1)) 3 < #<procedure:15:2> 4 > 3 5 < 3 6 > (+ x 1) 7 > + 8 < \#<primitive:+> 9 > x 10 < 3 11 > 1 12 < 1 13 < 4 14 < 4 7.3 Identificateurs Il est possible de dénoter une valeur par un identificateur en utilisant la structure de contrôle define. Ceci permet de conserver la valeur d un calcul déjà réalisé pour éviter d avoir à le refaire. 1 (define f (lambda(x) (+ x 1))) 2 > (f 3) 3 4 4 > (define carre (lambda (x) ( x x))) 5 > (carre 5) 6 25 7 > (define x 10) 8 > (carre 5) 9 25 parametre formel : identificateur dénotant, uniquement dans le corps de la fonction (portée) et durant l exécution de la fonction (durée de vie), la valeur passée en argument au moment de l appel. durée de vie d un identificateur : intervalle de temps pendant lequel un identificateur est défini. 4 Ecrire un interprète d un langage, c est aussi choisir la représentation interne des fonctions créées par l utilisateur 3

portée d un identificateur : Zone du texte d un programme où un identificateur est défini. 8 Premières Structures de contrôle structure de contrôle : fonction dont l interprétation nécessite des règles spécifiques. 8.1 Séquence d instructions Donné pour info, inutile en programmation sans effets de bord, mais nécessaire par exemple pour réaliser des affichages. 1 (begin 2 i1 3 i2 4... 5 in) Il y a un begin implicite dans tout corps de fonction. 1 (lambda () (display "la valeur de (+ 3 2) est : ") (+ 3 2)) évaluation d une séquence : val ( (begin inst1... instn expr) ) = val (expr) avec comme effet de bord : eval(inst1),..., eval(instn) 8.2 Conditionnelles 1 (define (abs x) 2 (if (< x 0) ( 0 x) x)) 4 (define (abs x) 5 (cond ((> x 0) x) 6 ((= x 0) 0) 7 (t ( 0 x)))) 1 (define (>= x y) 2 (or (= x y) (> x y))) evaluation d une conditionnelle : val ( (if test av af) ) = si (val(test) = vrai) alors val(av) sinon val(af) 9 Fonctions de base sur les types prédéfinis 9.1 Nombres tests : integer? rational? real? zero? ; odd? even? 4

comparaisons < > <=... 1 > (< 3 4) 2 #t 3 > (rational? 3/4) 4 #t 5 > (+ 3+4i 1 i) 6 4+3i 9.2 Caractères constantes littérales : #\a #\b comparaison : (char<? #\a #\b) (char-ci<? #\a #\b) tests : char? char-numeric? transformation : char-upcase. 9.3 Chaînes de caractères (Strings) constantes littérales : "abcd" comparaison : (string<? "ab" "ba") tests : (string=? "ab" "ab") accès : 1 (substring s 0 1) 2 (string-ref s index) 3 (string->number s) 4 (string-length s) Exemple, fonction rendant le dernier caractère d une chaîne : 1 (define lastchar 2 (lambda (s) 3 (string-ref s ( (string-length s) 1)))) 10 Blocs, évaluations en liaison lexicale 10.1 Blocs Un bloc (concept introduit par algol) est un séquence d instructions à l exécution de laquelle est associée un environnement propre. En Scheme, toute fonction définit implitement un bloc. 1 > (define (f x) ( x x)) 2 > (f 2) 3 = 3 La structure de contrôle let définit également un bloc. 5

Syntaxe : 1 (let ( <liaison> ) expression*) 3 liaison ::= (identificateur s-expression) Exemple : 1 > (let ((x (+ 2 3)) (y (+ 3 4))) 2 ( x y)) 3 = 35 10.2 Evaluation d un let. Soit i une instruction de la forme (let ((v1 expr1)... (vn exprn)) expr), on a val(i) = val(expr), avec expr évalué dans l environnement du let augmenté des liaisons v1 à val(expr1),..., vn à val(expnn). 10.3 Bloc et environnement L environnement associé à un bloc de code est initialisé au moment de l exécution du bloc, (exécution du corps d une fonction ou du corps d un let. Pour une fonction, les paramètres formels sont liés aux arguments dans l environnement associé au corps de la fonction. define : est une structure de contrôle permettant d ajouter un identificateur ou d en modifier un dans l environnement courant. Modularité : structuration d un programme en espaces de nommage. Espace de nommage : partie d un programme dotée d un environnement propre. Un bloc est un espace de nommage. Il est possible d utiliser sans ambigüité le même identificateur dans des blocs différents. 1 (define x 12) 2 (define (carre x) ( x x)) 3 (define (cube x) ( x x x)) 10.4 Chaînage des environnements Environnement fils : Un environnement E2 peut être chainé à un environnement E1, on dit que E2 étends E1, (on dit aussi que E2 est fils de E1). E2 hérite alors de toutes les liaisons de E1 et y ajoute les siennes propres (avec possibilité de masquage). La façon dont les environnements sont chaînés définit la portée des identificateurs. 10.5 Portée lexicale Le chaînage est dit statique ou lexical quand un environnement d un bloc est créé comme le fils de l environnement du bloc englobant lexicalement (inclusion textuelle entre zones de texte). 6

La portée des identificateurs est alors lexicale, i.e. un identificateur est défini dans toutes les régions de programme englobée par le bloc ou se trouve l instruction réalisant la liaison. Scheme obéit à ce modèle (voir exemples) ainsi que la pluspart des langages. 10.6 Portée dynamique Le chaînage entre environnements est dynamique, et la portée des identificateurs également, quand l environnement associé à une fonction devient, à chaque exécution, le fils de celui associé à la fonction appelante. La portée dynamique a presque disparue... 10.7 Environnement lié à la boucle toplevel Environnement global de scheme : environnement dans lequel sont définis tous les identificateurs liés aux fonctions prédéfinies. Tout autre environnement est indirectement (fermeture transitive) le fils, de cet environnement global. Environnement initial : environnement affecté à la boucle toplevel i.e. dans lequel sont interprétées les expressions entrées au toplevel. Cet environnement est un fils de l environnement global. Tout bloc définit au toplevel créé un environnement fils de cet environnement initial. NB : les fonctions définies dans l éditeur sont conceptuellement définies au toplevel. 10.8 exemples Variable définie ou indéfinie 1 > (define x 22) ;; liaison de x à 22 dans l env. courant 2 > (+ x 1) ;; une expression E 3 = 23 ;; ayant une valeur dans l env courant 4 > (+ i 1) ;; une autre expression n ayant pas de valeur 5 erreur : reference to undefined identifier: i Environnement fils 1 > (define x 10) ;; enrichir l environnement courant 2 > (let ((y 30) (z 40)) ;; créer un environnement fils 3 (+ x y z)) ;; et y faire un calcul 4 = 80 5 > x 6 = 10 7 > y 8 erreur : reference to undefined identifier: z Attention aux variables libres 1 (define x 1) 7

3 (define f (lambda (y) (g))) 5 (define g (lambda () y)) 7 > (f 3) 8 reference to undefined identifier: y 1 (define x 1) 2 (define (f x) (g 2)) 3 (define (g y) (+ x y)) ;; Une fonction avec une variable libre 4 > (f 5) 5 = 3 (vaudrait 7 avec portée dynamique) Utilisation préférentielle de variables locales 1 > (define (nb-racine a b c) 2 (define delta ( (carre b) ( 4 a c)) 3 (if (= delta 0)...) 4 ) 5 > delta 6 erreur : reference to undefined identifier: delta 1 (define (nb-racine a b c) 2 (let ((delta ( (carre b) ( 4 a c)))) 3 (if (= delta 0) 4...) 5 ) Espaces de nommage 9 (define carre (lambda (x) ( x x))) 11 (define (sommecarres x y) ; syntaxe simplifiée 12 (+ (carre x) (carre y))) 14 > (sommecarres (sin 60) (cos 60)) 15 = 1 Combinaisons plus complexes 16 (define x 1) 18 (define f (lambda() x)) 20 (define g (let ((x 2)) (lambda() (+ x 2)))) 8

22 (define h 23 (lambda (unefonction) 24 (let ((x 3)) 25 (apply unefonction ())))) 27 > (f) 28 1 29 > (g) 30 4 31 > (define x 5) 32 > (f) 33 5 34 > (g) 35 4 36 > (h g) 37 4 9