Depuis les premiers langages de programmation dits évolués, on a coutume de parler de programmation imérative dans le sens où on donne une succession d'ordre (en différé) à la machine. Puis, on parle de langages fonctionnels dans la mesure où on décrit des fonctions f(x) = y, la description de f expliquant comment obtenir la construction du résultat y à partir de la valeur donnée à l'argument désigné par le paramètre x (tous ces mots ont leur importance). Naturellement, une vraie fonction ne modifie rien, c'est une simple définition qu'on utilisera ultérieurement, elle n'a pas "d'effet de bord". La description d'un algorithme qui permet de construire le résultat y pour chaque entrée x, et son utilisation ainsi que les problèmes d'entrée- sortie sont alors entièrement séparés. C'est d'ailleurs ainsi que, le plus possible, on doit procéder. Pascal et C qui sont en grande partie fonctionnels mélangent ces deux types de programmation. Caml, en allant beaucoup plus loin, permet également la programmation impérative, il n'est pas "fonctionnel pur" comme on le verra surtout avec l'affectation et les tableaux. Cependant, Caml a l'immense avantage de calculer automatiquement les types, soulageant ainsi le programmeur, et de permettre de vraies fonctions renvoyant des objets structurés y compris renvoyer des fonctions, contrairement au Pascal, sans que le programmeur n'ait à se soucier du jeu des pointeurs.
Un programme logique est très diérent des programmes écrits dans un autre style. Il est très évolué permettant d'exprimer de façon naturelle les textes du langage naturel. Il est très adapté au calcul symbolique et au raisonnement. En eet, écrire un programme dans un langage logique consiste simplement à énoncer une suite de faits et de règles de déduction puis à poser des questions (appelées aussi buts). Il
. Il serait facile d’ajouter l’implication, l’´equivalence, etc . On pourrait faire de mˆeme avec des expressions arithm´etiques . On en reparlera dans le cours sur les arbres : il est `a noter qu’il n’y a pas
de probl`eme de parenth´esage
La notion de boucle est remplac´ ee par la r´ ecursivit´ e.
Ce cours s’appuie sur le langageCaml, version 0.74, d´ eveloppe et distribue par l’INRIA.
2 Syntaxe et s´ emantique
Syntaxe concr` ete : les caract` eres ASCII composant l’expression. Syntaxe abstraite : la structure profonde.
I donne lieu à des types qui sont des listes de variants, avec possiblement des bornes supérieures (<) et/ou inférieures (>), et une rélation de sous-typage qui est réalisée à trav[r]
1.4.2 La compilation vers une machine virtuelle
Toutefois, ` a partir du moment o` u on dispose de compilateurs pour des lan- gages flexibles et ´ evolu´ es comme C, on peut s’appuyer sur cet existant pour d´ evelopper d’autres techniques d’implantation. On peut par exemple com- piler vers C au lieu de compiler directement vers un langage machine. On peut ainsi se dispenser d’´ ecrire un compilateur pour chaque type de pro- cesseurs : ce sont les compilateurs C qui se chargent de la production de code final pour chaque processeur. On peut aussi, et c’est une technique tr` es utilis´ ee aujourd’hui, d´ efinir ce que l’on appelle des machines abstraites (ou machines virtuelles). Ces machines abstraites peuvent avoir des jeux d’instructions beaucoup plus simples et beaucoup plus puissants que les processeurs r´ eels et aussi mieux adapt´ es ` a la compilation des langages mo- dernes. La compilation s’en trouve simplifi´ ee, moins sujette aux erreurs et, ici encore, ind´ ependante des processeurs r´ eels. Il suffit ensuite d’´ ecrire un programme C qui simule l’ex´ ecution de la machine abstraite pour dispo- ser d’un m´ ecanisme d’´ evaluation complet. C’est la technique d’implantation choisie par exemple par java. Le code virtuel produit par le compilateur java est portable, susceptible de v´ erification automatique ´ elabor´ ee, et c’est pourtant un code compil´ e ` a partir duquel il est difficile de reconstituer le code source : le secret du code source peut donc ˆ etre pr´ eserv´ e, ce qui peut ˆ etre important dans un contexte industriel.
L’orienté objet à été introduit par le langage SmallTalk (développé par la société Xerox) en 1972. L’orienté objet est un ensemble de règles, de concepts, d’outils du langage de programmation pour rendre le développement plus aisé grâce au groupement d’éléments. Les objets sont donc des entités qui permettent de grouper ensemble des fonctions et des variables en facilitant leurs gestions par groupe et en ouvrant de multiples possibilités. Définir un objet peut paraitre comme ajouter un outil, Le framework .NET apporte lui un set imposant d’objets existants. Un langage Orienté objet n’est pas les objets, mais une syntaxe et des mots clefs pour les manipuler et les créer. Bien que nous allons utiliser des objets du framework ce cour visera à vous apprendre le langage.
La programmation fonctionnelle est très souvent opposée à la programmation impé- rative, famille regroupant des langages tels que C ou Pascal mais aussi Java ou C++, où l'on procède essentiellement par eets de bord i.e. modication en place du contenu des variables. Mais cette opposition n'a pas vraiment lieu d'être. En eet, seul le langage Haskell exclut complètement les eets de bord et est dit pour cela purement fonction- nel. Les langages tels que Standard ML ou OCaml autorise parfaitement les eets de bords et comportent d'ailleurs toutes les structures usuelles de la programmation im- pérative (variables modiables en place, tableaux, boucles for et while, entrées-sorties, etc.)
Contrepartie parfois plus lourd que des langages non typ´es ou `a typage faible comme Scheme, Common Lisp ou Perl... Compilation et interprétation Toplevel ocaml.[r]
En programmation, le polymorphisme r´ef`ere `a la propri´et´e d’un langage de proposer la d´efinition de types de donn´ees g´en´eriques reposant sur une interface uniforme. ◮ Le polymorp[r]
On pourrait imaginer utiliser des tableaux dans des tableaux mais quand on donne une valeur à un case d’un tableau, mais tous les tableaux de toutes les cases sont liés, donc la valeur p[r]
Traitement d'Exceptions
Une erreur ou avertissement PL+SQL peut survenir en cours d'exécution et soulever une exception.
Une exception peut être predéfinie par le système ou déclarée par l'utilisateur. Le traitement d'une exception se fait par la règle when
A partir de 1975 le DoD fit circuler le cahier des charges du langage nécessaire à tous ses besoins, et particulièrement les applications embarquées. En 1979 le langage "vert" de CII-Honeywell-Bull était vainqueur et se voyait attribuer le nom de la comtesse Ada Byron. En 1983 le langage était normalisé ANSI, puis par ISO en 1987.
Actuellement, une nouvelle version du langage ADA 9X est en préparation. Elle apporterait des extensions dans de nombreux domaines :
pgcd := x end ;
Ici, la r´ep´etition est exprim´ee de mani`ere it´erative, c’est-`a-dire que l’on in- dique explicitement la condition d’arrˆet, les actions `a effectuer lors de chaque ´etape, avec la gestion explicite par le programmeur de r´esultats de calculs interm´ediaires enregistr´es dans les variables x ou y (cette gestion n´ecessite la d´eclaration, la mise `a jour, etc.). L`a aussi, l’algorithme est d´efini comme une fonction, dont la signature - c’est-`a-dire le nombre et le type des argu- ments ainsi que le type du r´esultat - sont explicites. La diff´erence de style entre les deux descriptions est importante. La description CAML est bas´ee sur l’expression de ce qu’on veut obtenir, alors que la description Pascal ex- prime le “comment faire pour obtenir ce qu’on veut”. Ces diff´erences entre le style d´eclaratif dans le premier cas et le style imp´eratif dans le deuxi`eme cas, feront bien sˆ ur l’objet d’une discussion plus approfondie dans les cours de programmation.
pi : constant := 3.14 ;
telephone : constant integer := 05_49_55_06_50 ; Les conversions de types
Le langage Ada est fortement typé, ce qui signifie qu’on ne peut pas combiner directement des objets de types différents. Il faut procéder à des conversions de type explicites (avec la fonction de conversion appropriée), comme suit :
Une proc´ edure d´ efinie dans un module peut utiliser comme argument un tableau de taille ind´ etermin´ ee en utilisant une d´ eclaration de la forme. real, dimension(:,:) :: tableau[r]
5°/ Ecrire une fonction qui, à partir d'une liste, permet de créer une nouvelle liste comportant le même nombre d'éléments, dont le premier élément est égal à la moyenne des deux premie[r]
Serial.print (Z,15); //Quinze décimales et @.
NOTE : Les zéros en tête ne sont pas affichés.
Caractères spéciaux ......... Les structures impératives ............. P02 Les constantes .................. Les variables ................................. P03 Les bascules de type boolean - Conversions de types ............. P03 Les variables de type float et de type double ............................ P04 Le type Énumération (enum) ..................................................... P05 Les constantes en C d'Arduino ................................................. P06 La directive #define........... Glossaire. ...................................... P07 La structures de contrôle if / else .............................................. P08 La structures de boucle while et do while .................................. P09 La structures de boucle for ....................................................... P10 La structures de contrôle switch / case ..................................... P11 L'instruction de contrôle continue .............................................. P11 Le goto en langage C ........Les tableaux de variables .............. P12 Les fonctions avec passage de paramètres ............................. P14 Les expressions numériques entières ...................................... P15 Les expressions numériques "floating point" ............................ P16 Opérateurs arithmétiques ......................................................... P16 Opérateurs composés .............................................................. P17 Fonctions arithmétiques ........................................................... P18 Fonctions trigonométiques ....................................................... P19 Génération de nombres aléatoires ........................................... P19 Les opérateurs LOGIQUES bit à bit ......................................... P20 Les fonctions SHIFT ................................................................. P20 Les fonctions orientées OCTETS ............................................. P21 Les fonctions orientées BITS .................................................... P21 Travail sur les ports de l'ATmega328 ........................................ P22 Circuit minimal pour un ATmega328 ........................................ P23 Les Entrées analogiques (Sorties binaires) .............................. P24 Les sorties analogiques PWM ................................................. P25 Les Entrées / Sorties binaires ................................................. P26 Les Entrées / Sorties évoluées ................................................. P27 Problème de cohérence du type des variables ......................... P28 Forcer la taille des données dans un calcul............................... P29