|
Publicité ' | ||||||||||||||||||||||||
|
|
#61 | |||||||||||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Je vous concède bien volontiers que:
Dire que le programmeur Anubis compile lui-même le filtrage c'est une remarque de syntaxe concrête, il est trop tôt pour dire la part due à la jeunesse de l'implémentation et celle due à votre intransigeance sur le filtrage. Je profite de l'occasion pour faire encore quelque remarque de syntaxe concrête: Code :
Je trouve cette expresssion désagréable: Code :
Code :
Code :
Code :
Au tour de la sémantique maintenant. Citation:
C'est gênant, cela signifie que vous n'accordez pas aux données la contrepartie de la récursion que vous accordez aux fonctions. Cela a forcément un coût en terme d'expressivité, tôt ou tard une fonction récursive ne pourra pas être écrite parce qu'elle n'aura pas droit à sa donnée duale. En clair un traitement récursif ne sera pas spécifiable parce que sa sémantique sera rejetée. Ou, dit plus brutalement, Anubis n'est pas vraiment un langage récursif. Code :
La faute en incombe au f à droite du with: Code :
Bien sûr il faut rejeter les cas pathologiques tels que: Mais il faut tout de même autoriser les cas légitimes. Vous auriez anticipé cela si vous aviez programmé le compilateur Anubis en OCaml, au lieu de choisir un langage qui se rapproche au plus d'Anubis vous avez mis les mains dans le cambouis du C et il vous a caché vos vrais besoins. Je suis certain qu'en y réfléchissant vous trouverez dans les topos une raison pour laquelle le with devrait autoriser certaines formes de récursion. Et cette raison serait apparue bien plus vite à vos yeux si vous utilisiez OCaml. Sans doutes l'approche qui voit les besoins dans la beauté est la plus louable, mais l'approche duale qui voit la beauté dans les besoins est tout autant complémentaire car elle dissipe la fascination qui vous masque une beauté encore plus désirable. |
|||||||||||||||
|
00
|
|
|
#62 | ||||||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
@SpiceGuid: je tiens d'abord à vous dire que vous voir utiliser Anubis comme vous le faites ne peut que me réjouir. Anubis n'a encore que trop peu d'utilisateurs surtout de votre niveau en programmation fonctionnelle.
J'aurais beaucoup de choses à dire sur votre messages, et aussi sur ceux des autres utilisateurs de ce forum. Dans ce post, je vais me contenter de répondre à votre question sur la récursion, et en particulier à propos de la ligne: Code :
Code :
Je vous demande pardon, mais je crois que je ne suis pas complètement tombé de la dernière pluie en matière de récursion, ayant pratiqué Lisp pendant de nombreuses années (et ayant également fait un compilateur pour ce langage), et ayant par ailleurs fait (il y a assez longtemps c'est vrai) un cours de fonctions récursives et machines de Turing dans la Maîtrise de Maths de l'université de Nantes. Vous remarquerez que la notation |-f-> est beaucoup plus propre que ce que vous suggériez y compris en utilisant un mot clef comme 'letrec'. En effet, la ligne ci-dessus peut aussi bien être écrite: Code :
Je vous concède que la documentation d'Anubis est incomplète, et que cette formulation ne s'y trouve peut-être pas. En fait elle se trouve dans l'ancienne doc, celle qui se trouve dans le répertoire 'library/manuals/en' de la distribution. Désolé, mais quand on est tout seul (ou à peu près) pour mener une tel projet, il y a des choses qui peuvent manquer.
__________________
Ma page maths. |
||||||
|
|
00
|
|
|
#63 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Citation:
Donc (sans surprise aucune) votre code ne compile pas, parce que f est un constructeur ok_function, pas une fonction. Et comme, avec le typage fort et l'évaluation stricte, vous ne pouvez pas avoir accès à un combinateur de point fixe, je ne vois pas bien comment vous pourriez séparer la déclaration locale du mécanisme de récursion Croyez bien que je me représente la difficulté de la tâche et combien mes objections doivent vous paraître ingrates face au labeur qui est le vôtre. |
|
|
00
|
|
|
#64 | ||||||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
J'essaye une petite analyse du résumé fait par SpiceGuid de mon exposé.
Citation:
Par ailleurs, les deux niveaux ne sont pas isomorphes (contrairement à ce qu'il se passe avec Martin-Löf), et c'est précisément ce point qui est essentiel dans mon exposé, puisqu'il résulte de l'indiscernabilité des preuves. Je crois que vous avez lu mon exposé vraiment en diagonale pour ne pas vous en être aperçu. Citation:
Citation:
Citation:
Citation:
Citation:
__________________
Ma page maths. |
||||||
|
|
00
|
|
|
#65 | |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
__________________
Ma page maths. |
|
|
|
00
|
|
|
#66 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Non, et vous l'avez dit vous-même: c'est la déclaration du symbole g.
C'est le with qui déclare f. Pour mon commentaire sur votre exposé il est évident que je l'ai lu en diagonale, j'ai interprété au-delà de ce qu'autorisent mes connaissances, mais je ne regrette pas de l'avoir fait si cela a le mérite de nous valoir votre clarification sur chacun des points soulevés, l'exposé n'en est pas plus abordable mais petit à petit il devient moins obscur pour le béotien que je suis. |
|
00
|
|
|
#67 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
où T est un type et E un terme contenant des occurences de f, est bien une fonction récursive. Par ailleurs, le symbole f est lié (muet) dans cette expression qui est donc alpha-équivalente à:
C'est donc la flèche avec nom |-f-> qui joue le rôle du letrec. Je ne vois pas ce que vous voulez de plus, à part changer la syntaxe de mon langage.
__________________
Ma page maths. |
|
|
00
|
|
|
#68 | |||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
C'est le with qui devrait être un let rec, pas la fonction anonyme que vous vous entêtez à vouloir nommer alors que je ne vous l'ai jamais demandé.
Citation:
Code :
Mais cela risque de vous prendre un certain temps alors je serai patient. |
|||
|
00
|
|
|
#69 | ||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Ok j'ai compris ce que vous voulez (que je n'avais pas vu à première lecture de votre programme).
J'ai donc fait un couper-coller de votre programme, qui effectivement ne compile pas, même avec la correction que j'avais suggéré. Par contre la version ci-dessous compile: Code :
Alors en effet, la récursion en Anubis ne s'applique qu'aux fonctions, et non pas aux données quelconques. Mais il me semble que c'est normal. En tout cas, les modèles catégoriques pour la récursion, autorisent les types récursifs (bien sûr) et les fonctions récursives. Ceci résulte du problème universel qui définit les types récursifs. Je sais que dans certains langages on peut définir des objets récursifs non fonctionnels, qui ont donc un caractère 'infini', mais cette construction ne me semble pas avoir de sens mathématique. En tous cas, les mécanismes de types récursifs et de fonctions récursives tels qu'ils existent en Anubis et qui seront encore plus restrictifs en Anubis 2 (puisque la récursion y sera contrôlée par des schémas de récursion, ce qui est nécessaire pour que les preuves soient correctes), sont suffisants pour faire toutes les mathématiques. Si j'introduis un nouveau concept dans Anubis 2, je dois être extrêmement prudent, car je ne veux pas faire effondrer sa logique.
__________________
Ma page maths. |
||
|
|
00
|
|
|
#70 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Et oui! Et c'est plus propre, pas de récursivité dans le with!
Il y a 5mins encore j'avais peur d'avoir raison, et maintenant c'est tellement limpide! Voilà, vous tenez l'exemple qui achève de me convaincre qu'avec des constructions linguistiques plus simples vous arrivez à gagner en spécification sans perdre en expressivité. Evidemment il va falloir modifier quelques habitudes et se reconstituer un catalogue d'astuces pour affronter les situations les plus alambiquées, mais à priori il me semble que l'on puisse attaquer des problèmes aussi difficiles qu'avec OCaml et ceci avec probablement encore davantage de confiance dans des outils certes moins nombreux mais plus pures et moins redondants. En tout cas je vous souhaite une bonne continuation et j'aurai certainement dans le futur des opportunités pour pousser Anubis encore plus loin j'espère. |
|
00
|
|
|
#71 | ||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Je me suis inscrit sur www-anubis-langage.com, le forum a l'air plus "débutants" que celui-ci, je promet je n'irai pas leur filer la pétoche avec des sources ésotériques.
Il m'a semblé que le letrec_in est encore insuffisant à lui tout seul, il faudrait au moins lui adjoindre le letrec_and_in qui est la version qui peut introduire deux définitions locales mutuellement récursives. Et bien voici son implémentation qui a au moins le mérité d'avoir occupé ma fin de soirée: Code :
(ce n'est pas une critique de ma part, peu de membres du forum www-anubis-langage.com auront à écrire un jour ce genre de charabia qui n'amuse que vous et moi) Il semble qu'Anubis soit accessible aux débutants, et cela m'étonne un peu dans le sens où il est explicitement encore plus exigeant. Mais il est vrai que les débutants sont très sensibles à la syntaxe concrête et la première parenthèse mal placée leur fera abandonner OCaml pour une syntaxe plus conservatrice. Puissent-ils se tourner alors vers Anubis plutôt qu'une fadaise du genre Java. |
||
|
00
|
|
|
#72 | ||||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
En effet, la flèche nommée |-f-> est encore insuffisante pour faire des fonctions mutuellement récursives. On doit faire une petite acrobatie. Ce n'est qu'un problème de syntaxe en fait. Il s'agit de trouver une syntaxe aussi élégante et 'locale' que possible.
Pour les fonctions mutuellement récursives définies à la volée, voici l'exemple que j'ai donné dans l'ancienne doc d'Anubis (anubis/manuals/en/anubis_doc.txt dans la distribution). Now, what if you want to construct cross recursive functions with the arrow '|->' ? Assume that we want to construct two cross recursive functions 'f' and 'g', and that we begin by 'f'. The problem is that we cannot call 'g' from within the body of 'f', because 'g' is not yet declared. However, there is a beautiful (and functional) trick to solve this problem. It is not always obvious to put it at work. I will just examine an example. Assume that the functions 'f' and 'g' could be defined at the top level as follows: Code :
(terminates). Define them with labelled arrows as follows: Code :
Il est vrai que le code que vous avez proposé est particulier. Il ne préoccupe que les gens qui écrivent des compilateurs ou des interpréteurs. Je suis en train d'écrire le compilateur Anubis 2 en Anubis (bootstrap oblige), et je fais des choses dans ce genre (également avec des profondeurs de De Bruijn d'ailleurs). Anubis peut être utilisé par des débutants. Il est d'ailleurs curieux de constater que les personnes qui n'ont jamais fait d'informatique s'y mettent très facilement, alors que ceux qui en ont fait beaucoup mais uniquement avec des langages impératifs, ont beaucoup de mal à se débarrasser des 'mauvaises habitudes'. Il me semble qu'on devrait commencer par un langage non impératif (qui d'une certaine façon est plus simples à utiliser, justement parce que la sémantique est statique) et que l'impératif ne devrait intervenir que lorsqu'il devient nécessaire. Il me semble qu'avoir fait croire en son temps que le BASIC était un langage pour débutants est une escroquerie (même si les concepteurs n'en étaient pas conscients). Je ne connais pas bien Java, mais il me semble que le paradigme OO y remplace pour une bonne part le système de types (essentiellement absent de ce langage) et je crois que cette philosophie est très néfaste. Le paradigme OO est le fruit des expériences des programmeurs, et même s'il contient des aspects intéressants, il est loin de pouvoir remplacer une théorie de types (quelle qu'elle soit), seule capable de nous mettre sur des bases solides. La bonne solution est de concilier les deux, la notion d'objet étant importante pour la programmation non déterministe, par exemple pour les logiciels interactifs, mais elle ne doit pas prendre toute la place, et en particulier je la crois particulièrement néfaste là où tout peut être déterministe (calcul pur sans effet de bord).
__________________
Ma page maths. |
||||
|
|
00
|
|
|
#73 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Il y a également ce code dans mon interpréteur:
Citation:
On pourrait (méchamment) résumer OCaml ainsi: * OCaml est trop permissif * OCaml cumule les difficultés des syntaxes concrêtes du C et du Lisp Ou alors on pourrait (méchamment) résumer Anubis ainsi: * vous compilez vous-même le filtrage * vous compilez vous-même certaines formes de let rec * vous compilez vous-même la gestion des exceptions Vous avez entièrement raison quand vous dites qu'il s'agit d'un arbitrage sur la syntaxe concrête et nul doute que si vous cherchez quelque amélioration sur le typage alors votre choix vous place dans une situation beaucoup plus favorable. La sémantique du let en Caml n'est pas limpide: il défini et il filtre. Cela va à l'encontre du principe du découplage. Il est effectivement beaucoup trop tôt pour changer de syntaxe concrête sans grandement compromettre les avantages potentiels de la syntaxe abstraite, même si la pression des utilisateurs va dans ce sens (pour l'avantage à court terme). Pour l'instant Anubis a un "avantage" de syntaxe concrête sur OCaml: les débutants préfèrent f(x) à (f x), c'est fort heureux car sinon vous auriez autant d'utilisateurs qu'Epigram. C'est l'atout que vous devez jouer pour l'instant, en attendant Anubis 2. Je n'hésiterai pas à recommander Anubis quand je sens qu'un débutant veut quelque chose de robuste mais qu'il pourrait être rebuté par la syntaxe de Caml. Et ce avec d'autant plus de facilité que la documentation qui l'accompagne est de qualité. J'approuve donc le choix qui a été fait d'en supprimer les passages les plus difficiles, car: * il faudrait déjà avoir l'expérience de la version 2 pour savoir quel est le gain de haut niveau (typage) apporté par la syntaxe de plus bas niveau (plus proche du lambda-calcul) * il faudra encore plus d'expérience pour proposer une syntaxe concrête de plus haut niveau sans dégrader les nouvelles propriétés de typage Cela promet d'être passionnant. |
|
|
00
|
|
|
#74 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
J'imagine que par syntaxe concrête tu entends la syntaxe qui est usuelle en mathématiques, c'est à dire celle à laquelle on est habitué dès le lycée.
Les problèmes de syntaxe depuis le début de la création d'Anubis m'ont bouffé énormément de temps. J'ai compilé des centaines de grammaires avec BISON avant de prendre certaines décisions. Pour la syntaxe Anubis 2, il y aura quelques innovations. Je n'en dis pas plus pour le moment, mais je confirme que je tends autant que possible à me rapprocher de l'aspect usuel des textes mathématiques (compte tenu des contraintes du code ASCII, contraintes qui tomberont avec un éditeur graphique spécialisé qui est en projet). Apparté: moi aussi j'ai du mal avec les syntaxes exotiques (Caml et surtout Haskell). Je sais que c'est idiot, mais c'est comme ça. Par exemple, je trouve que le choix des mots clefs dans le filtrage Caml est obscur du point de vue de la langue naturelle par rapport aux conditionnelles d'Anubis. De même, je préfère 'with ...' à 'let ... in ...'. C'est l'avantage évidemment de créer un nouveau langage, on définit la syntaxe dont on a envie. Pour ce qui est du filtrage, je ne suis pas aussi intransigeant que j'ai pu en avoir l'air. L'origine du filtrage est syntaxique et vient de Lisp (petit livre de C. Queinnec sur le sujet). J'en ai surtout après la façon dont les informaticiens le comprennent sur le plan théorique. Les conditionnelles sont clairement structurellement liées aux types sommes (elle font partie du problème universel qui définit les sommes en théorie des catégories), et le filtrage ne m'apparaît que comme une facilité syntaxique permettant d'éviter l'emboîtement des conditionnelles. Vu comme cela je n'ai rien contre (c'est assez byzantin, car au final ça revient au même pour l'utilisateur, mais j'aime bien comprendre ce que je fais). En Anubis 2 on pourra donc filtrer (ouf !). Pour ce qui est des exceptions, c'est une interpretation possible en effet de dire qu'on les compile soi-même. Pour moi c'est un peu différent. Je considère qu'elles n'existent pas. Autrement-dit, le comportement est toujours normal. L'expérience montre que l'approche exception-free d'Anubis est un atout important pour la sûreté. Et puis, en mathématiques, il n'y a pas cette notion. Comme ce sont elles qui me guident... Pour ce qui est du nombre d'utilisateur d'Anubis, c'est vrai qu'on les compte sur les doigts des mains. Mais je pense que tout cela va changer avec la version 2, car il y aura de vraies nouveautés qui n'existent nulle part ailleurs. Ceci dit, Anubis , pour si peu qu'il soit utilisé, est utilisé dans des (petites) entreprises (3 pour le moment) avec des enjeux économiques derrière. Ceci montre la confiance que les dirigents de ces entreprises ont dans mon système. Ils ont bien compris en fait qu'Anubis leur offre un moyen de développement rapide (peu de programmeurs nécessaires) et où le risque de régression est extrêmement faible.
__________________
Ma page maths. |
|
|
00
|
|
|
#75 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
Je ne comprends pas ton problème... tu ne parlais pas de la syntaxe de Lisp plutôt ? Personnellement j'apprécie beaucoup de chose dans la syntaxe d'ocaml. La syntaxe du filtrage particulièrement que, contrairement à Dr Topos, je trouve assez « naturelle ». Bien sûr, encore une fois, on est dans le subjectif. Une notation plus mathématique pourrait aussi être celle du lambda-calcul... est-ce mieux ou pire ? moins classique, c'est pratique pour limiter les parenthèses. |
|
|
|
00
|
|
|
#76 |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Mon cher Dr Topos,
il manque une version MacOS à Anubis -_- |
|
|
00
|
|
|
#77 | |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Pour l'instant nous avons une version Windows, une version Linux et une version MIPS (non encore distribuée, mais dispo sur demande). Pour ma part je n'ai fait que la version originale (Linux), les portages Windows et MIPS sont de David René. Faire un portage n'est pas un énorme travail. Il faut seulement bien connaitre la machine cible, en avoir une bien sûr, et avoir un compilateur C/C++ sur cette machine.
__________________
Ma page maths. |
|
|
|
00
|
|
|
#78 | |
|
Futur Membre du Club
![]() Inscription : septembre 2004 Messages : 50 ![]() |
Citation:
Donc si ça compile sous Linux avec Gcc en utilisant des librairies assez standard, ça devrait compiler sans trop de problème, avec Gcc, sous Mac.. Après, j'ai pas essayé.. |
|
|
|
00
|
|
|
#79 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Citation:
ben non, pas mal d'appels systèmes sont différents, mais on peut les récupérer (je crois) en utilisant l'entête "unix.h" |
|
|
|
00
|
|
|
#80 |
|
Invité régulier
![]() Inscription : juin 2006 Messages : 6 ![]() |
Bonjour à tous,
Je suis David René, l'auteur des portages Windows, MIPS, BeOS, Zeta d'Anubis. Effectivement le portage ne pose aucun problème en ce qui concerne le compilateur écrit quasiment en ANSI C avec des touches de C++. Par contre en ce qui concerne la machine virtuelle, la problématique vient de la couche graphique du système hôte. Mais, avec un peu de patience, du café, du paracetamol c'est faisable. D'ailleurs pour Mac OS, est-ce que la couche graphique s'appuit sur Xwindow ou bien est-ce complètement différent? Parce que si c'est XWindow le portage devrait être presque une formalité. Par ailleurs, tout les candidats au portage d'Anubis sur différentes plate forme sont les bienvenues et peuvent soumettre leur candidature en m'envoyant un mail privé par (MP). |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com