Programmation Fonctionnelle Avanc´ee – Master 1
TP 11
Mehdi Dogguy
Pour utiliser du code Cdepuis votre code Haskell, il faut utiliser la FFI
(the Foreign Function Interface). Pour ce faire, il suffit de rajouter, au d´ebut
de votre code Haskell l’en-tˆete suivant :
{-# LANGUAGE ForeignFunctionInterface #-}
Ensuite, pour pouvoir utiliser les types C, il suffit d’importer (suivant les
besoins) quelques modules :
import Foreign.C.Types -- D´efinitions de types
import Foreign.C.String -- Fonctions sur CChar et CString
import Foreign.Ptr -- Pointeurs (d´efinition et op´erations usuelles)
Enfin, vous pouvez commencer `a importer les fonctions Cqui vous
ineressent dans le monde Haskell. Cette op´eration est r´ealis´ee par le bout de
code suivant :
foreign import ccall "fonction_c" fonction :: Signature
o`u :
ccall repr´esente la convention d’appel utilis´ee. ccall repr´esente celle uti-
lis´ee par C, mais il en existe d’autres comme : cplusplus,dotnet,jvm,
etc. . . Durant ce TP, on va se limiter `a ccall seulement.
fonction cle nom de la fonction C`a importer, potentiellement pr´ec´ed´e
par le nom du module qui la d´efinit (Exemple : math.h efinit, entre
autres, les fonctions cos et sin) et s´epar´es par un espace.
fonction le nom de la fonction Haskell, dont la signature est Signature,
que vous allez utiliser dans votre code Haskell. Notez que la Signature
devra utiliser les types d´efinis dans Foreign.C.Types.
En C, une fonction qui retourne void peut avoir des effets de bord pendant
son ex´ecution. En Haskell, ces fonctions impures doivent retourner IO (). De
fa¸con plus g´en´erale, les fonctions Cimpures qui retournent un type tdoivent
ˆetre import´ees en tant que fonctions retournant un type IO t’, o`u le type t’
correspond `a la version Haskell du type Ct.
La suite du TP se d´eroulera en deux parties. Dans un premier temps, nous
allons voir comment interfacer Haskell avec Cpour des fonctions simples. En-
suite, nous allons essayer de coder un vrai programme qui utilise la bibilioth`eque
zlib.
Exercice 1 : FFI
Impl´ementez la fonction convert double :: CDouble -> Double, qui
convertit un CDouble en Double.
Fonction pure :
1. D´efinissez la fonction c sin, `a partir de la fonction C sin qui se
trouve dans le module math.h.
2. D´efinissez la fonction h sin :: Double -> Double qui calcule le si-
nus de l’argument, en utilisant la fonction c sin.
Fontion impure :
3. D´efinissez la fonction c time `a partir de la fonction Ctime.
´
Ecrivez un programme qui affiche le temps ´ecoul´e, en secondes, depuis le 1er
Janvier 1970 1et h sin(x) pour chaque argument xpass´e comme argument en
ligne de commande.
Exercice 2 : Commande zpipe
Pour cet exercice, il vous faudra r´ecup´erer le fichier zbits.c (qui contient des
fonctions Cd´efinies autour des fonctions inflate et deflate de la biblioth`eque
zlib) depuis la page web des TPs. Le fichier zpipe.c est fournit seulement `a
titre d’exemple, mais n’est pas n´ecessaire pour cet exercice.
1. Cr´eer un Makefile qui comporte 3 cibles :
zbits.o qui produit un fichier du nom de la cible `a partir du fichier
zbits.c
hzpipe qui compile votre programme Haskell Hzpipe.hs en un binaire.
all qui produit un programme nomm´e hzpipe `a partir des cibles
pr´ec´edemment d´efinies.
clean qui supprime les fichiers g´en´er´es.
(?) Il faudra passer -lz `a ghc pour linker l’ex´ecutable final.
2. Cr´eez Hzpipe.hs et importez les fonctions d´efinies dans zbits.c,i.e. inf
(la fonction de compression) et def (la fonction de d´ecompression).
3. Faites en sorte que votre programme hzpipe compresse et d´ecompresse
des fichiers en utilisant les fonctions pr´ec´edemment import´ees. ( `
A vous de
choisir comment votre programme doit ˆetre appell´e).
Comment le type FILE de Cest repr´esene en Haskell ?
4. Les fonctions retournent un entier qui est cens´e correspondre `a un
cas d’erreur. Affichez un message clair en cas d’erreur (les informa-
tions `a propos codes d’erreur peuvent ˆetre trouv´ees dans zpipe.c et
/usr/include/zlib.h).
1. Cette information est le r´esultat de c time
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !