IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages fonctionnels Discussion :

OCaml vs Anubis


Sujet :

Langages fonctionnels

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut OCaml vs Anubis
    J'espère que je poste dans le bon forum, impossible de poster dans le forum "langage fonctionnels" ...

    je voudrais savoir si quelqu'un saurait :
    -quelle différence de vitesse d'exécution il y a entre Anubis et OCaml
    -si le typage d'OCaml est moins fin que celui d'Anubis, qui est décrit dans la doc comme "très fin" ?

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    déjà penses à lire ce débat...
    http://www.developpez.net/forums/showthread.php?t=38275


    OCaml est pour le moment bien meilleure côté vitesse d'exécution et gestion du garbage collector... mais une nouvelle version d'Anubis devrait bientot sortir, donc il faudra retester

    Anubis est bien plus orienté "sûreté du développement", ce qui se traduit parfois par de lourds mécanismes pour les tests de valeurs de retour

    côté typage, si je me rappelle bien, Anubis a des types déclarés (et non inférés comme avec OCaml)
    en théorie, cela devrait "éviter" certains problèmes du typage à la ML qui survienne lorsqu'on atteint pas un point fixe en une itération... si l'on voulait continuer les itérations, il y a un moment un problème de semi-décidabilité

    mais il faudrait étudier de plus prêt les types "à la Anubis" parce qu'il existe également des système de typage statique et explicite qui sont bien plus faibles que le système de typage statique et implicite de OCaml
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    quelle différence de vitesse d'exécution il y a entre Anubis et OCaml
    OCaml est clairement en avance sur ce point, Anubis n'est pas à recommander pour du calcul intensif, cependant il convient très bien (et est utilisé) pour des applications web. La version à venir est la 1.8, à ma connaissance il ne faut s'attendre ni à une hausse spectaculaire de performance ni à un changement de technique de ramasse-miettes.

    si le typage d'OCaml est moins fin que celui d'Anubis, qui est décrit dans la doc comme "très fin" ?
    Le typage d'Anubis est légèrement plus fin que celui d'OCaml, il cumule l'inférence de types avec la surcharge (ou polysémie).

    Enfin, il faut le signaler car en pratique je trouve que c'est un avantage précieux, OCaml possède un interpréteur interactif, ce n'est pas le cas d'Anubis.

    En résumé:
    • Anubis est plus simple dans sa conception, il est moins redondant car moins multi-paradigme, par contre les outils sont moins matures
    • OCaml est plus facile d'utilisation mais nécessite un peu plus d'investissement personnel, notamment à cause de son approche multi-paradigme (fonctionnel, impératif, fonctors, POO)
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Merci de vos réponses éclairantes ...

    C'est vrai qu'à première vue, Anubis a l'air plus simple et cela m'a attiré dans un premier temp, néanmoins ce n'est pas forcément un avantage. D'autant que la licence d'Anubis ne me semble pas d'une clarté limpide, ou en tout cas pas aussi souple que l'Open Source de OCaml

  5. #5
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    C'était déjà lu, mais merci quand même

    et merci pour les autres infos de ta réponse

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    [...] qui sont bien plus faibles [...]
    « Faible » dans le sens ?

  7. #7
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    « Faible » dans le sens ?
    moins généraux peut-être ? J'ai retenu que OCaml infère toujours le type le + général (est-ce la bonne terminologie ?) ...

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    « Faible » dans le sens ?
    je pense qu'un typage statique et explicite comme dans C est plus faible (ie laisse trop de possibilités de saletés dangereuses, mais parfois plus performantes )


    Citation Envoyé par james-mi Voir le message
    moins généraux peut-être ? J'ai retenu que OCaml infère toujours le type le + général (est-ce la bonne terminologie ?) ...
    OCaml essaie de générer le type le plus général possible, mais doit atteindre un point fixe en une itération... donc on a parfois du mal à typer des choses relativement simples, même si l'on donne une indication de typage (contrairement à Haskell )
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    OCaml essaie de générer le type le plus général possible, mais doit atteindre un point fixe en une itération... donc on a parfois du mal à typer des choses relativement simples, même si l'on donne une indication de typage (contrairement à Haskell )
    Tu parles de chose comme ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec f n =
      if n = 0
          0
       else 
          f n-1;;
    En mettant n dans Z et non dans N ?
    Je ne répondrai à aucune question technique en privé

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par millie Voir le message
    Tu parles de chose comme ?
    ben non, ocaml sait typer cela sans problème... ^^



    je pense par exemple à un point fixe du lambda calcul


    sinon tu peux jouer avec cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # let f1 a lst = [];;
    val f1 : 'a -> 'b -> 'c list = <fun>
    # let app f lst =
          (f 2 lst, f 2.0 lst)
        ;;
    This expression has type float but is here used with type int
    pourtant si je considère app f1 lst, elle est théoriquement correct et renverra ([],[])


    en Haskell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Prelude> let f1 a lst = []
    Prelude> let f1 a lst = [] in app f1 [1,2,3]
    ([],[])
    Prelude>

    on peut en sortir des tonnes ^^
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    ben non, ocaml sait typer cela sans problème... ^^

    Il me semblait que ocaml typait ça dans Z au lieu de typer ça dans N...

    (la fonction se termine toujours dans N mais pas dans Z et du coup, j'aurais préféré indiquer moi même le domaine)
    Je ne répondrai à aucune question technique en privé

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par millie Voir le message
    Il me semblait que ocaml typait ça dans Z au lieu de typer ça dans N...

    (la fonction se termine toujours dans N mais pas dans Z et du coup, j'aurais préféré indiquer moi même le domaine)


    le fait de typer une fonction n'implique pas qu'elle se terminera
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    le fait de typer une fonction n'implique pas qu'elle se terminera
    Je parlais au niveau de la sécurité du typage automatique par ocaml.

    En tant que développeur, j'aurais pu concevoir la fonction pour que ce soit OK sur N, donc si j'avais pu écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec f (nat n) 
      if n=0 0 else f n-1;
    La fonction aurait été plus sûre.

    Alors qu'avec ocaml, pour permettre que la fonction plante pas, je suis obligé de modifier les spécifications de ma fonction pour que ce soit OK sur tout Z parce que ocaml me dit que la fonction marche sur Z.

    Je sais pas si je suis clair ? J'ai un peu mal au crâne alors j'ai du mal à me concentrer
    Je ne répondrai à aucune question technique en privé

  14. #14
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par millie Voir le message
    Je parlais au niveau de la sécurité du typage automatique par ocaml.

    Alors qu'avec ocaml, pour permettre que la fonction plante pas, je suis obligé de modifier les spécifications de ma fonction pour que ce soit OK sur tout Z parce que ocaml me dit que la fonction marche sur Z.

    non suffit d'avoir défini ton type correctement ^^
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  15. #15
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par millie Voir le message
    Je sais pas si je suis clair ? J'ai un peu mal au crâne alors j'ai du mal à me concentrer
    Ton problème n'en est pas un, tu peux tout à fait faire ce que tu demandes en OCaml, il suffit de créer un nouveau type pour les naturels. Ce n'est pas un type par défaut d'OCaml mais c'est tout à fait possible.

    Par contre tu n'auras pas de relation entre int et nat, ni de partage des opérateurs, ce qui peut être considéré comme regrettable.

    --
    Jedaï

  16. #16
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # type nat = Zero | Succ of nat;;
    type nat = Zero | Succ of nat
    # let rec gen_nat n = match n with 0 -> Zero | n when n>0 -> Succ (gen_nat (n-1)) | _ -> failwith "nat negatif";;
    val gen_nat : int -> nat = <fun>
    # f (gen_nat (-1));;
    Exception: Failure "nat negatif".
    # f (gen_nat 4);;   
    - : int = 0

    en OCaml ça peut sembler assez lourd
    mais sous Haskell il y aurait certainement moyen de pouvoir ajouter de manière transparente un entier et un nat et renvoyer un entier
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  17. #17
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    en OCaml ça peut sembler assez lourd
    mais sous Haskell il y aurait certainement moyen de pouvoir ajouter de manière transparente un entier et un nat et renvoyer un entier
    Non, ce que tu décris là est impossible en Haskell, et heureusement ! Il n'y a pas de cast automatique en Haskell et les opérateurs numériques binaires comme "+" prennent deux opérandes du même type.
    La différence par rapport à OCaml, c'est que ce type n'est pas forcément Int, mais peut être Double ou Rational par exemple. Tout type instance de la classe de type Num convient.

    Par ailleurs faire de Nat une instance de Num n'est pas forcément une bonne idée, vu que Num à la base décrit plutôt un anneau (negate est une fonction de Num).

    --
    Jedaï

  18. #18
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Non, ce que tu décris là est impossible en Haskell, et heureusement ! Il n'y a pas de cast automatique en Haskell et les opérateurs numériques binaires comme "+" prennent deux opérandes du même type.
    La différence par rapport à OCaml, c'est que ce type n'est pas forcément Int, mais peut être Double ou Rational par exemple. Tout type instance de la classe de type Num convient.
    je suis au courant...

    je pensais à une unique fonction pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Int -> Nat -> Int
    Nat -> Int -> Int
    Citation Envoyé par Jedai Voir le message
    Par ailleurs faire de Nat une instance de Num n'est pas forcément une bonne idée, vu que Num à la base décrit plutôt un anneau (negate est une fonction de Num).

    pas cool forcemment cela
    et on peut s'arranger pour que negate lance une exception ou un truc du style ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  19. #19
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    je suis au courant...

    je pensais à une unique fonction pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Int -> Nat -> Int
    Nat -> Int -> Int
    Bien sûr dans ce cas c'est possible, mais tu peux faire de même en OCaml. (A moins que tu veuilles dire une seule fonction pour les deux types ? C'est peut-être possible mais je ne le recommanderais pas même si ça l'était)

    Citation Envoyé par gorgonite Voir le message
    et on peut s'arranger pour que negate lance une exception ou un truc du style ?
    Tout à fait, on peut déclarer 'negate = error "Naturals don't have negatives"'.

    --
    Jedaï

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    De toute façon, si l'utilité de Nat est de prouver facilement par induction que les récursions sont bien fondées, on n'a probablement pas intérêt à le munir de tout un attirail de trucs encourageant à en complexifier l'usage : si on se retrouve avec un type somme multi-fonctions, quelle est la différence avec int (qui après tout n'est qu'un gros type somme, si on veut).

    Citation Envoyé par gorgonite
    OCaml essaie de générer le type le plus général possible, mais doit atteindre un point fixe en une itération... donc on a parfois du mal à typer des choses relativement simples, même si l'on donne une indication de typage (contrairement à Haskell ) [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # let app f lst =
          (f 2 lst, f 2.0 lst)
        ;;
    This expression has type float but is here used with type int
    pourtant si je considère app f1 lst, elle est théoriquement correct et renverra ([],[])
    D'une part, ton code Haskell ne correspond pas au code OCaml donné (ou alors je n'ai pas compris ce que tu essaies de faire). Ensuite, la fonction app demande du polymorphisme de rang 2, et effectivement sans annotations de type cela échoue en OCaml comme en Haskell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # let app f x = (f () x, f "foo" x);;
    This expression has type string but is here used with type unit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Prelude> let app f x = (f () x, f "foo" x)
    <interactive>:1:23:
        Couldn't match expected type `[Char]' against inferred type `()'
          Expected type: [Char] -> t -> t1
          Inferred type: () -> t -> t2
        In the expression: f "foo" x
        In the expression: (f () x, f "foo" x)

Discussions similaires

  1. [Débat] Que pensez-vous du langage Anubis ?
    Par MDZ dans le forum Langages fonctionnels
    Réponses: 232
    Dernier message: 19/09/2007, 21h33
  2. [OCaml][Débutant] Graphiques
    Par mavina dans le forum Caml
    Réponses: 1
    Dernier message: 04/11/2005, 20h12
  3. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16
  4. [OCaml] Parser une ligne de commande
    Par Thanatos dans le forum Caml
    Réponses: 4
    Dernier message: 10/12/2004, 10h11
  5. [OCaml] Toujours "Unbound value..."
    Par robfinck dans le forum Caml
    Réponses: 1
    Dernier message: 16/11/2004, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo