Ours & Hippy — le blog Ours & Hippy ourshippy@huoc.org tag:blog.huoc.org,2009:atom 2010-04-03T13:28:04+02:00 tag:blog.huoc.org,2010-04-03:comments/1270294084.29037 Re: Pourquoi le C est moins puissant que votre langage favori 2010-04-03T13:28:04+02:00 2010-04-03T13:28:04+02:00 rz0 (rz0) <p>Hum, ouais, avant on écrivait facilement <code>x &lt;&lt; 1</code> au lieu de <code>x * 2</code>. C&#x2019;est d&#x2019;ailleurs pas mal resté, dans certains cas. Mais yavait des trucs bien plus gores, genre des macros <code>REGISTERn</code> qui sont remplacées par des déclarations <code>register</code> selon la machine (ça permettait de classer par priorité les variables à mettre dans des registres&#xA0;; les suivantes devenaient automatiques). </p><p>À propos de rugosité, je suis tombé récemment sur <a class="extern" href="http://msdn.microsoft.com/en-us/library/ms973852.aspx">un assez vieil (2003) article sur MSDN sur comment rendre le code managé rapide</a> et on peut y lire&#xA0;: </p><blockquote><div>Good C programmers knew. Each operator and operation in C, be it assignment, integer or floating-point math, dereference, or function call, mapped more or less one-to-one to a single primitive machine operation. </div></blockquote><p>C&#x2019;est de moins en moins vrai avec l&#x2019;avénement des compilateurs optimisants modernes, mais il y a toujours une certaine vérité à cela, en ce que l&#x2019;on peut se donner une vague borne pessimiste sur nos performances, en gros.&#xA0;:p </p><p>Après, pour ce qui est d&#x2019;instruire au compilateur comment effectuer certaines optimisations, euh&#x2026; je ne vois pas trop où tu veux en venir. Tu peux développer&#xA0;? Au final, on est limité au niveau langage, on ne peut pas vraiment toucher au-dessous. Que suggères-tu&#xA0;? À quels langages penses-tu&#xA0;? </p> tag:blog.huoc.org,2010-03-31:comments/1270007002.15010 Re: Pourquoi le C est moins puissant que votre langage favori 2010-03-31T05:43:22+02:00 2010-03-31T05:43:22+02:00 lasts (lasts) <p>J&#x2019;ai toujours trouvé dommage qu&#x2019;en C, les optimisations ne soient que locales&#xA0;: Il est facile de rajouter une couche d&#x2019;abstraction pour spécialiser un bout de code avec des macros, mais le gain est limité au programme courant. Passer au cap supérieur et instruire directement le compilateur d&#x2019;une optimisation possible n&#x2019;est pas aussi simple que, par exemple, abstraire une fonction d&#x2019;un bloc de code répétitif. </p><p>À mes yeux, il semble y avoir une ambivalence entre le désir d&#x2019;être explicite (j&#x2019;écris x.foo et j&#x2019;ai une bonne idée mentale du code produit par le compilateur) et le désir d&#x2019;être efficace, c&#x2019;est à dire de rajouter des optimisations non existante dans le compilateur (ou qu&#x2019;on suppose non existante.) Avec ton exemple, on perd complètement l&#x2019;explicite et on obtient quelque chose d&#x2019;assez boite noire, mais qui &quot;fait le travail.&quot; </p><p>J&#x2019;ai envie de penser que les &quot;optimisations&quot; suivantes devaient exister lors des premiers compilateurs (non-optimisants) (bien qu&#x2019;elles aient probablement toujours été écrites directement)&#xA0;: </p><pre><code>#define MUL(x, y) (x) * (y) #define MUL2(x) (x) &lt;&lt; 1 </code></pre><p>En résumé, je ne suis pas sûr d&#x2019;apprécier la distance entre ces optimisations de bas niveau et le compilateur (le pré-procésseur et l&#x2019;assembleur étant placés aux extrêmes), mais ça résume assez bien ma vision du C. C&#x2019;est un langage assez riche et compliqué, mais il est rugueux&#xA0;: Chaque concept est clairement délimité syntaxiquement, ce qui introduit sa dose de complexité au niveau de la grammaire, mais permet aux programmeurs de s&#x2019;agripper solidement. </p><p>En Scheme, le problème est inverse&#xA0;: Il n&#x2019;y a pas de rugosité du tout et le programmeur est perdu. Je trouve donc amusant que les macros C, qui sont nettement inférieures aux macros Lisp, aient l&#x2019;avantage de cette limitation pour la structuration intellectuelle du programmeur. &quot;S&#x2019;il y a de la magie, elle tient toujours dans ma tête.&quot; Le problème n&#x2019;est donc pas la notation préfixe mais &quot;qu&#x2019;est-ce qui se passe derrière&#xA0;?&quot; </p><p>D&#x2019;une certaine manière, je trouve qu&#x2019;OCaml a hérité de cette rugosité vis à vis des records, des accès aux tableaux et des constructeurs. Et ça m&#x2019;emmerde à chaque fois que je les utilise.&#xA0;:) </p><p>Plutôt que de reciter Lisp et Forth, qui sont des solutions à mon goût à ce problème, mais qui souffrent également de leur solution, voici un lien qui propose d&#x2019;utiliser des compilateurs orientés &quot;extensions&quot; pour le C&#xA0;: <a class="extern" href="http://pdos.csail.mit.edu/xoc/">http://pdos.csail.mit.edu/xoc/</a> .</p> tag:blog.huoc.org,2010-03-27:comments/1269688685.598 Re: Pourquoi le C est moins puissant que votre langage favori 2010-03-27T12:18:05+01:00 2010-03-27T12:18:05+01:00 bluestorm (bluestorm) <p>Je m&#x2019;intéresse assez aux à la question de l&#x2019;encodage, dans un langage plus bas niveau, des fonctionnalités d&#x2019;un langage plus haut niveau. C&#x2019;est un outil qui permet de comparer différents langages entre eux (tant d&#x2019;un point de vue pratique que théorique&#xA0;: la traduction d&#x2019;une solution vers une autre est une façon courante pour des chercheurs en langages de programmation de comparer ces solutions). J&#x2019;ai récemment fait un <a class="extern" href="http://www.siteduzero.com/forum-83-496535-p1-de-l-abstraction-d-un-langage-bas-niveau.html#r4777232">monologue</a> à ce sujet sur le siteduzéro. </p><p>Le point de vue que tu abordes est légèrement différent, puisqu&#x2019;il est centré sur &quot;le langage bas niveau&quot;&#xA0;: en général, on discute de ce qui se passe quand on change de langage pour avoir des constructions plus haut niveau, et on néglige un peu les irréductibles qui veulent conserver leur langage d&#x2019;avant, et utiliser quand même un style moderne. Les utilisateurs de C ont ce point de vue et c&#x2019;est assez intéressant. Par ailleurs, la question de la portabilité est assez évidente quand on en parle, mais je n&#x2019;y avais pas spécialement pensé avant, merci. Cela dit, au sujet de la portabilité, j&#x2019;ai l&#x2019;impression que beaucoup de langages font des choix d&#x2019;implémentation relativement <i>platform independent</i>, comme une machine virtuelle, un bytecode, ou un langage plus bas niveau (<code>C--</code>, LLVM, ou même directement C), et spécialisent la partie bas niveau seulement dans ces couches là, qui sont plus basses que le C. Bien sûr, il y a quand même des choix qui sont fait très tôt, et la question des pointeurs que tu décris en fait sans doute partie. </p><p>Une autre application des études de la traduction langage-langage est l&#x2019;étude de la méta-programmation à l&#x2019;intérieur d&#x2019;un langage donné. Par exemple, on peut considérer une partie de la métaprogrammation des LISP (macros et cie.) comme des éliminations d&#x2019;abstraction syntaxique.</p> tag:blog.huoc.org,2010-03-14:comments/1268525915.24416 Re: Cohérence des effets de bord 2010-03-14T01:18:35+01:00 2010-03-14T01:18:35+01:00 Alp (Alp) <pre>Pas directement lié mais intéressant quand même : http://www.cs.bath.ac.uk/~cf/eff_hyper.pdf</pre> tag:blog.huoc.org,2010-01-31:1264952962.22851 Re: Cohérence des effets de bord 2010-01-31T16:49:22+01:00 2010-01-31T16:49:22+01:00 SpiceGuid (SpiceGuid) <p>À mon avis certains articles ne veulent pas fermer des portes arbitrairement. Du coup ils peuvent paraitre plus algorithmiques qu&#x2019;ils ne le sont en vérité. </p><p>Quand je lis ce genre de phrase&#xA0;: </p><p>&quot;Coherence retains mutable state, abandoning only the Program Counter.&quot; </p><p>Je ne peux pas m&#x2019;empêcher de penser que l&#x2019;article traite en fait du problème de la cohérence dans la maintenance des bases de données. Quand un modèle est trop centré sur la dynamique des données ça en fait une technique d&#x2019;IA ou de SGBD. Eventuellement ça pourrait aussi être un DSL pour GUI, CAO et 3D interactive. </p><p>En développant son propre interpréteur plutôt qu&#x2019;une librairie pour un langage existant l&#x2019;auteur prend le risque de faire apparaître la faiblesse de son approche dans le cas général tout en masquant les éventuels avantages par rapport aux approches concurrentes comme le tout impératif ou la FRP. </p><dl><dt></dt></dl> tag:blog.huoc.org,2010-01-31:1264924737.27336 Re: Cohérence des effets de bord 2010-01-31T08:58:57+01:00 2010-01-31T08:58:57+01:00 bluestorm (bluestorm) <pre>Pour l'instant, l'idée et le langage associé sont encore en gestation. C'est un article publié dans la conférence "Onwards!" qui s'intéresse à des idées nouvelles et pas encore éprouvées. Je pense qu'il ne gère pas certaines incohérences, par exemple on doit pouvoir provoquer des boucles infinies avec certains programme qui n'ont pas d'entrelacement correct. Cette réaction est courte, parce que j'aimerais écrire plus de réactions. D'une part, je ne suis pas satisfait de ma méthode actuelle : je survole beaucoup d'articles, j'en lis quelques uns, et je garde une trace écrite (résumé ou réaction) d'une petite fractions de ces derniers. J'aimerais mieux, à terme, me forcer à commenter plus souvent les articles que je lis, et c'est de là qu'est née l'idée des "réactions". Clairement, je ne peux pas me permettre de passer autant de temps sur chaque réaction que précedemment si je veux en publier plus. D'autre part, cet article m'a un peu déçu, et je n'ai pas été motivé pour écrire quelque chose de très long. C'est la contrepartie de la volonté à terme de garder une trace de tout ce que je lis : il y aura aussi des choses qui me plaisent moins que les autres. Dans l'idée je pense que parler des papiers qui m'ont moins plu peut être aussi intéressant que parler des papiers qui m'ont plu, mais il faut faire attention à ne pas ennuyer le lecteur par vengeance. Fondamentalement, je crois qu'il faut que je fasse des choix, entre publier un bon article long et très travaillé tous les deux mois, ou baisser un peu mon propre niveau d'exigence pour avoir des articles plus fréquents. C'est pas facile. Je te remercie pour ton avis. J'ai bien vu que cette réaction n'avait pas motivé l'enthousiasme des foules, mais c'est beaucoup plus utile pour moi qu'on me dise comme tu l'as fait ce qui gêne ou pose problème.</pre> tag:blog.huoc.org,2010-01-30:1264811082.20521 Re: Cohérence des effets de bord 2010-01-30T01:24:42+01:00 2010-01-30T01:24:42+01:00 Cyprien_ (Cyprien_) <pre>Article intéressant sur le fond, mais j'avoue que j'aurais aimé en savoir plus sur, par exemple, la manière dont le programme va gérer l'apparition d'interférences, par exemple, comment différencie-t-il une simple interférence (donc à corriger en modifiant l'ordre des effets de bords) d'une véritable incohérence (qui est donc à signaler comme toute erreur qui se respecte) ? Par contre, je ne sais pas si tu as refréné ton envie d'écrire pour des raisons personnelles, ou bien parce que tu penses qu'un texte trop long risque de rebuter. Si c'est la deuxième hypothèse, personnellement, c'est toujours un plaisir de te lire, et j'avoue que la longueur de cette réaction me laisse un peu sur ma faim :p (mais ça n'engage que moi). Merci, une fois encore !</pre> tag:blog.huoc.org,2010-02-01:1265023928.19501 Re: Pourquoi attacher tant d'importance au typage ? 2010-02-01T12:32:08+01:00 2010-02-01T12:32:08+01:00 spider-mario (spider-mario) Je te remercie énormément d&#x2019;avoir pris le temps de me répondre, tout m&#x2019;est plus clair maintenant. tag:blog.huoc.org,2010-02-01:1265021610.19501 Re: Pourquoi attacher tant d'importance au typage ? 2010-02-01T11:53:30+01:00 2010-02-01T11:53:30+01:00 Sota (Sota) <pre>Merci pour cet article fort instructif qui couplé à ton tutoriel sur le siteduzero permet de pénétrer dans le monde, qui semble magnifique, du typage. Typed Scheme me semble être très intéressant vu que pour le moment, je ne me suis attardé que sur des langages au typage dynamique (Python, Scheme) malgré une rapide lecture d'un début d'Ada. En tout cas, ce fut un article édifiant.</pre> tag:blog.huoc.org,2010-01-31:1264949408.22851 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-31T15:50:08+01:00 2010-01-31T15:50:08+01:00 robocop (robocop) <pre>Merci beaucoup pour cet article très interessant, et très concret. Il apporte de nouveaux élements par rapport à ton texte sur le siteduzero, et je comprend maintenant mieux tous les enjeux du typage.</pre> tag:blog.huoc.org,2010-01-31:1264924007.27336 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-31T08:46:47+01:00 2010-01-31T08:46:47+01:00 bluestorm (bluestorm) <p>Le typage dynamique attend l&#x2019;exécution du programme pour faire les vérifications de correction du typage. C&#x2019;est un modèle « moins prise de tête » puisqu&#x2019;il est toujours plus facile de vérifier dynamiquement que statiquement, mais on ne vérifie pas les mêmes choses. Typiquement un programme statiquement typé qui ne produit pas d&#x2019;erreur de typage à la compilation te garantit qu&#x2019;il « ne provoquera pas d&#x2019;erreur de typage <em>quel que soit</em> le chemin d&#x2019;exécution d&#x2019;une instance du programme » (quelles que soient les entrées que tu lui donnes, les nombres aléatoires qu&#x2019;il choisit, etc.), alors qu&#x2019;un programme dynamiquement typé qui s&#x2019;est exécuté et a terminé sans erreur de typage te garantit que « ce chemin d&#x2019;exécution particulier ne contient pas d&#x2019;erreur de typage ». C&#x2019;est une garantie beaucoup plus faible, et donc aussi beaucoup plus facile à obtenir (c&#x2019;est un avantage)&#xA0;: il s&#x2019;agit d&#x2019;un compromis. </p><p>De plus, pour des raisons théoriques fondamentales, le typage statique d&#x2019;un langage généraliste ne peut pas être parfaitement précis&#xA0;: si le typage statique rejette tous les programmes erronés, il doit aussi rejeter quelques programmes corrects (par exemple <code>print_int (if true then 1 else &quot;impossible&quot;)</code> ne peut pas provoquer d&#x2019;erreur de typage, mais le compilateur le rejette). Plus les systèmes de types sont simples, plus ils sont contraignants, et rejettent des programmes qu&#x2019;on aimerait qu&#x2019;ils acceptent; inversement, plus ils sont compliqués, et plus le programmeur doit faire d&#x2019;effort pour travailler avec le système de type, ce dont il n&#x2019;a pas forcément envie. </p><p>Enfin, les langages dynamiques proposent en général des méthologies de développement un peu différentes de celle des langages statiques, qui ont leurs avantages et leurs inconvénients. Certains programmeurs affirment même qu&#x2019;on pense différemment quand on programme dans l&#x2019;un ou l&#x2019;autre; je ne suis pas convaincu, mais ce qui est certain c&#x2019;est que beaucoup de gens sont très satisfaits de langages très dynamiques, et qu&#x2019;ils font avec des choses intéressantes.</p> tag:blog.huoc.org,2010-01-31:1264923189.27336 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-31T08:33:09+01:00 2010-01-31T08:33:09+01:00 bluestorm (bluestorm) <p>Dans un langage fonctionnel, il y a des valeurs qui dépendent d&#x2019;autres valeurs (par exemple, <code>let singleton x = [x]</code>), ce sont des fonctions, et des types qui dépendent d&#x2019;autres types, ce sont les types paramétrés (<code>type 'a liste = Nil | Cons of 'a * 'a liste</code>). </p><p>Un type dépendant est un type qui dépend d&#x2019;une valeur (autrement dit, indexé par une valeur). Ça n&#x2019;existe pas en OCaml. Un exemple courant serait le type <code>('a, n) vect</code>, où <code>n</code> est un entier, qui représente le type des tableaux à <code>n</code> éléments de type <code>'a</code>. </p><p>C&#x2019;est un typage très expressif mais aussi très sophistiqué, et qui casse un peu la distinction habituelle « phase de typage / phase d&#x2019;exécution »&#xA0;: pour typer correctement un programme, il faut aussi en exécuter des parties. C&#x2019;est cantonné à des langages de recherche pour l&#x2019;instant. </p><p>Les types dépendants ont des liens forts avec les systèmes de preuve, car tu peux encoder des propositions logiques avec des types dépendants, et inversement quand tu as des types dépendants, tu as envie de pouvoir exprimer des propositions logiques. Par exemple la fonction d&#x2019;accès à un tableau dépendant ressemblera à <code>('a, n) vect -&gt; {m tel que 0 &lt;= m &lt; n} -&gt; 'a</code>&#xA0;: si tu ne peux pas exprimer le fait que l&#x2019;index d&#x2019;accès est dans les bornes du tableau, ce n&#x2019;est pas très intéressant d&#x2019;avoir accès à sa taille au niveau du typage. Ici le <code>tel que ...</code> est un bout de programme « logique ».</p> tag:blog.huoc.org,2010-01-27:1264599286.11812 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-27T14:34:46+01:00 2010-01-27T14:34:46+01:00 spider-mario (spider-mario) Bluestorm, j&#x2019;ai deux questions&#xA0;: <ul><li>En quoi consistent exactement les types dépendants&#xA0;? </li><li>Quels sont les avantages du typage dynamique par rapport au typage statique, dans quels cas est-ce vraiment nécessaire&#xA0;?</li></ul> tag:blog.huoc.org,2010-01-17:1263717482.1594 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-17T09:38:02+01:00 2010-01-17T09:38:02+01:00 Cacophrene (Cacophrene) <pre>Bonjour ! J'arrive après la bataille, mais je tiens à dire tout l'intérêt que j'ai porté à cet article. Il me semble que l'idée maîtresse développée ici peut être généralisée et sortie hors du domaine de l'informatique. Ainsi, l'interaction entre un langage et un méta-langage est féconde car elle oblige à prendre du recul vis-à-vis de ce que l'on fait et amène à des changements de perspective très profitables (que l'on ne pratique pas spontanément).</pre> tag:blog.huoc.org,2010-01-10:1263130623.3326 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-10T14:37:03+01:00 2010-01-10T14:37:03+01:00 bluestorm (bluestorm) <p>Merci pour vos commentaires. Je suis déoslé d&#x2019;avoir mis si longtemps à répondre, mais voilà. </p><p><b>SpiceGuid&#xA0;:</b> je ne suis pas complètement convaincu par ton idée de « typage comme outil de conception » . Je vois bien comment le typage peut <em>renforcer</em> une méthode de conception donnée, en rendant les interfaces plus explicites par exemple, mais je ne vois pas ce que tu as en tête quand tu parles du typage comme une « assistance à la conception » qui remplacerait une méthodologie particulière (<i>UML, patterns, waterfall, iterative refinement..).</i> Par exemple, dans Coq (je prends cet exemple parce que je sais que tu connais), qui a un système de typage des plus expressifs, la conception logicielle à moyenne/grande échelle ne va pas du tout de soi, au contraire il y a souvent plusieurs façons de faire les choses (par exemple on peut souvent définir un prédicat dans Prop par un type inductif paramétré, et c&#x2019;est une approche intéressante mais qui ne convient pas forcément dans toutes les situations). </p><p>Je n&#x2019;essaie pas de te contredire, je pense simplement que je ne saisis pas vraiment ce que tu veux dire, et que tu devrais développer un peu plus. Ton autre idée de « types dont la sophistication accompagne celle du programmeur » est par contre bien connue, et intéressante (je pense que c&#x2019;est en fait un cas particulier de l&#x2019;approche de « couches de langages » croissantes utilisées pour l&#x2019;enseignement, cf. DrScheme par exemple). En pratique elle n&#x2019;est pas complètement triviale, mais demande une réflexion sur la présentation du langage. Par exemple si la bibliothèque standard utilise des types très sophistiqués (on aurait <i>a priori</i> envie qu&#x2019;elle nous apporte le typage le plus expressif possible, pour ne pas avoir à réinventer la roue), il faut que ça reste compréhensible pour le novice, sinon son monde des types simples prend l&#x2019;eau. Ça demande donc une réflexion sur des types &quot;peu invasifs&quot; (éviter les choses comme les variantes polymorphes de OCaml par exemple qui ont tendance à se glisser rapidement dans les messages d&#x2019;erreurs du code utilisateur, ou les types équi-récursifs qui ont des conséquences subtiles sur les programmes acceptés), et sur une &quot;vulgarisation&quot; des types du langage, comme le font les gens de C++ pour utiliser la STL sans comprendre les templates (c&#x2019;est aussi lié au débat sur les <i>concepts</i> de <code>C++[01]x</code>), ou les débutants en Haskell qui font de l&#x2019;entrée-sortie sans comprendre les monades. À ce sujet, j&#x2019;avais lu un article sur la présentation de la monade IO aux débutants, en présentant <code>main</code> comme une &quot;entrée du contexte extérieur&quot; dans le programme, mais je n&#x2019;arrive plus à remettre la main dessus. </p><p><b>Proairgun</b>&#xA0;: le polymorphisme ad-hoc est une fonctionnalité parfois intéressante, mais dont on abuse à mon avis souvent (un peu comme la frénésie POO pousse les gens à voir de l&#x2019;héritage dans tous les sens alors que c&#x2019;est parfois la pire des solutions). Beaucoup de gens utilisent le polymorphisme ad-hoc d&#x2019;une façon en fait analogue aux types sommes des langages fonctionnels (un type dont les valeurs sont divisées en plusieurs &quot;cas&quot;&#xA0;: adulte, enfant, vieillard par exmple), sans voir qu&#x2019;ils ne gagnent pas en simplicité ou clarté par rapport à cette solution fonctionnelle. </p><p><b>Sprank&#xA0;:</b> le typage d&#x2019;OCaml permet évidemment d&#x2019;exprimer la taille des entiers que tu manipules. Jette un oeil par exemple à <a href="http://blog.huoc.org/bigarray">la bibliothèque Bigarray</a> (<a class="extern" href="http://blog.huoc.org/7-en-bref-aussi.html#programmation_contrainte">déjà mentionnée</a> sur ce blog d&#x2019;ailleurs). Après, je ne cherche pas qu&#x2019;à défendre ma chappelle, le langage C peut être un bon choix pour ce genre d&#x2019;applications, ou C++ quand tu veux du plus haut niveau sans perdre l&#x2019;interface bas niveau du C, cf. <a class="extern" href="http://factor-language.blogspot.com/2009/05/factor-vm-ported-to-c.html">Factor</a> (si j&#x2019;en ressors indemne&#x2026;&#xA0;;), mais pas pour des raisons de typage. Du reste, les même manipulation en OCaml seront sans doute moins efficaces, car le compilateur n&#x2019;offre pas de support particulier à ces valeurs, qui font donc bien la bonne taille mais ont tendance à être boxées, ce qui nuit aux performances. Les bénéfices d&#x2019;abstraction, et des choix soigneux d&#x2019;interface bas-niveau peuvent quand même rendre le Caml compétitif dans ce secteur. </p><p>Comme le dit très bien <b>minh</b>, il faut faire attention à l&#x2019;implicite en programmation. Je pense que la propriété fondamentale qui rend le typage ML agréable, ce n&#x2019;est pas qu&#x2019;il est <em>possible</em> d&#x2019;inférer les types des programmes, mais que c&#x2019;est une opération <em>simple</em> et bien définie. Un utilisateur peut très raisonnablement, avec un peu d&#x2019;entraînement, deviner le type qui sera inféré pour son programme. Au contraire, un système dont les déductions sont imprévisibles (et ça a tendance à être le cas quand on monque en sophistication, car la puissance entraîne souvent une certaine fragilité, cf. le problème de l&#x2019;arrêt) serait dangereux. Dans la recherche des gens qui font de l&#x2019;inférence pour des typages plus sophistiqués que ML, une grande partie des efforts consiste à trouver des systèmes plutôt faciles à comprendre, et dont les erreurs soient compréhensibles et simple à réparer (en ajoutant par exemple une annotation à un endroit donné, mais il faut qu&#x2019;on sache où annoter, et pas tatonner jusqu&#x2019;à que le compilateur accepte). </p><p>Il y a en fait un parallèle avec l&#x2019;idée formulée par SpiceGuid selon laquelle les types utilisés par un programmeur correspondent à son niveau d&#x2019;expertise&#xA0;: utiliser des types plus puissants demande plus d&#x2019;efforts (qu&#x2019;un expert est plus à même de fournir). Alors, l&#x2019;intérêt de l&#x2019;inférence totale diminue, car les annotations se mettent à représenter une partie nettement plus faible de l&#x2019;effort de typage, indépendamment du fait qu&#x2019;une inférence complète devient en général indécidable.</p> tag:blog.huoc.org,2010-01-09:1262996543.30505 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-09T01:22:23+01:00 2010-01-09T01:22:23+01:00 Sprank (Sprank) <pre>Je ne connaissais pas le problème de l'arrêt et effectivement, s'il n'y a aucun algorithme qui puisse déterminer si un programme arrête ou non dans tous les cas, mon rêve de super-compilateur tombe à l'eau. HS : C'est qui "la carotte" ?</pre> tag:blog.huoc.org,2010-01-04:1262609737.14013 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-04T13:55:37+01:00 2010-01-04T13:55:37+01:00 Cyprien_ (Cyprien_) <pre>Pour l'histoire de la factorielle, il me semble que réaliser ce que tu proposes reviendrait à réaliser un compilateur qui saurait détecter une boucle ou une récursion infinie, ce qui est impossible (car équivalent au problème de l'arrêt si je ne me trompe). Comme toujours, article extrêmement intéressant en tout cas ! Un grand merci Bluestorm !</pre> tag:blog.huoc.org,2010-01-04:1262591084.14013 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-04T08:44:44+01:00 2010-01-04T08:44:44+01:00 rz0 (rz0) <p>Sprank &gt; À mon avis, un tel compilateur serait difficile à utiliser, car à partir du moment où certaines informations utiles (comme le domaine de ta fonction factorielle, p.ex.) sont inférables mais d&#x2019;autres non, le programmeur risque de laisser passer des choses qu&#x2019;il aurait pu spécifier explicitement mais qu&#x2019;il a cru que le compilateur saurait inférer pour lui, et c&#x2019;est un chemin dangereux&#x2026; </p><p>&#x2019;Fin bon, chui pour des choses plus systématiques&#xA0;; quoi qu&#x2019;en disent les puristes comme SpiceGuid ici présent, je pense que la méthodologie, ça a du bon, dans la pratique.&#xA0;:-° Trop de finesse dans le fonctionnement tend à introduire des erreurs dues à un malentendu entre le programmeur et l&#x2019;outil. (Wow, avec un commentaire comme ça, si j&#x2019;en ressors indemne&#x2026;&#xA0;:-&#x2019;) </p><p>Sinon, pour l&#x2019;histoire des types 4 ou 12 bits, à mon avis, c&#x2019;est pas pertinent de considérer que c&#x2019;est plus bas niveau, parce qu&#x2019;à moins que tu programmes sur des cartes intégrées que tu construis toi-même, il y a peu de chances pour que le proco offre de tels types&#xA0;; en ce sens, les proposer au programmeur, ce serait créer une abstraction supplémentaire donc c&#x2019;est du haut niveau, à mon sens. </p> tag:blog.huoc.org,2010-01-04:1262566884.12588 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-04T02:01:24+01:00 2010-01-04T02:01:24+01:00 Sprank (Sprank) <pre>Récemment je me suis (re)mis un à projet plutôt bas niveau par rapport à ce que je suis habitué de faire (un émulateur Chip-8 si vous voulez savoir). J'ai choisi de le faire en C++ (pour utiliser SFML et la pile de la STL sinon c'est du C). Le typage de C++ ici m'est plus utile que celui d'OCaml (par exemple) car plus expressif : il me permet de facilement jongler entre entiers signés/non-signés de 8 ou 16 bits, même si pour d'autres projets OCaml et son typage seraient probablement d'un plus grand secours. Je me suis même surpris à vouloir un typage encore plus "bas niveau" pour pouvoir définir des entiers de 12 ou 4 bits. Ça m'amène à me demander si ça a du sens de parler d'expressivité haut/bas niveau pour un système de typage. Sinon j'ai toujours rêvé d'un super compilateur qui serait capable d'inférer encore plus de choses sur les types, un genre de compilateur OCaml puissance 10. Par exemple si je définis une fonction factorielle, le compilateur devrait être capable de deviner tout seul que le domaine de la fonction est les entiers naturels et m'avertir si des parties de mon code peuvent possiblement donner des entiers négatifs à la fonction factorielle. Un compilateur qui infère le plus de choses possible, et qui permet au programmeur de définir ce qui n'est pas inférable.</pre> tag:blog.huoc.org,2010-01-03:1262529711.11268 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-03T15:41:51+01:00 2010-01-03T15:41:51+01:00 Proairgun (Proairgun) <pre>Ce que je n'arrive toujours pas à saisir malgré cette article très enrichissant, c'est l'utilité du typage statique. Ayant fait un peu d'ocaml et partant du php ( ouh le pas beau ) j'ai découvert avec émerveillement le polymorphisme ad-hoc plus que le polymorphisme tout court qui aux yeux d'amateurs comme moi, me semble gadget. Néanmoins, pour un programmeur qui organise bien son code, le typage me parait plus un accélérateur de programme en aidant la compilation qu'une véritable instruction avec quoi le langage révèle ses richesses. Ainsi en sacrifiant les performances, le php n'est pas limité par rapport à l'ocaml à cause de son typage ( Je serait heureux que l'on m'éclaire à ce sujet ). Pourtant je vois l'insuffisance du typage dans beaucoup de critique sue le php alors que cela m'apparait plus une contrainte qu'un avantage.</pre> tag:blog.huoc.org,2010-01-01:1262357614.4032 Re: Pourquoi attacher tant d'importance au typage ? 2010-01-01T15:53:34+01:00 2010-01-01T15:53:34+01:00 SpiceGuid (SpiceGuid) <pre>Un article intéressant. Ta réponse est satisfaisante dans le sens où elle fait quasiment le tour de la question. À mon avis il manque quand même un aspect essentiel. C'est que le système de typage est ce qu'il y a de plus proche d'une assistance à la conception, bien plus intéressante qu'une méthode de conception planifiée. Le typage guide la conception et la rend plus explicite. Bien mieux et bien plus systématiquement que UML ou les design patterns. Plutôt qu'un bon panorama des choix de conception en matière de systèmes de types (chose qui concerne sans doute très peu de zéros) je crois que j'aurais préféré une vraie propagande en faveur d'un typage statique plus expressif. Ce que j'ai envie de répondre à robocop: le typage n'est pas une vérification, c'est une méthode de conception en soi. Autant que possible (et dans la mesure du raisonnable, en fonction de l'expérience de chacun) le typage peut supporter la spécification. Plus un programmeur est expérimenté plus il peut ajouter de la spécification dans le typage. Et le langage doit pouvoir l'accompagner aussi loin que possible. Il faut tordre le coup aux paradigmes. Il n'y a pas de paradigmes, il n'y a que des styles. Il n'y a pas de fonctionnalités avancées, il n'y a que des types avancés. Par exemple il n'y aura rien que l'on puisse faire avec les valeurs-modules de ocaml 3.12 qu'on ne peut pas déjà faire avec ocaml 3.11. Par contre on pourra sans doute typer des choses qu'on ne peut pas typer actuellement. Avec pour conséquence des messages d'erreur sans doute plus obscurs. Le débutant n'y gagnera rien d'autre que de nouvelles opportunités de s'engager sur un chemin qui n'est pas pratiquable pour lui. Car les types c'est avant tout un éventail de possibilités pour accompagner chaque programmeur selon son niveau. C'est une assistance personnalisée. Il y a les types élémentaires ou atomiques. Il y a les types composites simples. Puis il y a des types plus structurés. Ensuite il y a des types pour les experts. Et enfin il y a les types dépendants pour les logiciens. Je ne suis pas un Ayatollah du typage statique. Les langages à typage dynamique existeront toujours et ils n'ont pas moins de mérites que les autres, ils sont même bien souvent les pionniers. Ce que je ne comprends pas ce sont les langages comme Go, typé statiquement mais qui n'a pas le polymorphisme, qui possède les closures mais qui n'a pas de type fonctionnel.</pre> tag:blog.huoc.org,2009-12-31:1262283120.2320 Re: Pourquoi attacher tant d'importance au typage ? 2009-12-31T19:12:00+01:00 2009-12-31T19:12:00+01:00 redfire (redfire) <pre>Si un article manquait à toute la série d'articles que tu as écrite, pour moi, c'est celui-là. Ce vide est comblé, merci !</pre> tag:blog.huoc.org,2009-11-22:1258898333.1029 Re: L'innocence est un mythe : les programmes fonctionnels nécessairement impurs 2009-11-22T14:58:53+01:00 2009-11-22T14:58:53+01:00 Zenol (Zenol) <pre>Je sais que ce billet a été poster il y a plusieurs mois mais, je viens de le lire et la moindre des choses que je puisse faire en tant que humble lecteur est de laisser mon impression a l'auteur. N'étant pas un habituer de la programmation fonctionnel, et ne maitrisant que vaguement la syntaxe ocaml, je dois avouer que ce biller est très difficile a lire. D'une par, il fait appelle a des notions de mathématique qui ne sont pas nécessairement connues des développeurs habituer des langages impératif (J'ai crus entrevoir de la topologie?). D'autre part, une bonne part de l'article repose sur des illustration reposant sur le langage ML, ce qui demande un effort particulier pour visualiser "a quoi ca ressemble" dans notre langage impératif de prédilection. (Je conçoit que l'approche fonctionnel et impérative sont fondamentalement différente, mais il est toutefois possible d'effectuer des analogies et d'obtenir un comportement déterministe dans un langage impératif. Après tout, l'ocaml s'exécute sur des architectures matériel que l'on peut décrire comme des machine de Turing)</pre> tag:blog.huoc.org,2009-08-25:1251158933.15991 Re: L'innocence est un mythe : les programmes fonctionnels nécessairement impurs 2009-08-25T02:08:53+02:00 2009-08-25T02:08:53+02:00 Cygal (Cygal) <pre>En fait les deux premiers paragraphes répondent à ma question, c'est cool. Mais j'aime bien aussi la précision du dernier. :) Merci.</pre> tag:blog.huoc.org,2009-08-25:1251158236.15991 Re: L'innocence est un mythe : les programmes fonctionnels nécessairement impurs 2009-08-25T01:57:16+02:00 2009-08-25T01:57:16+02:00 bluestorm (bluestorm) <p>Alors déjà pour le traitement de (A -&gt; B -&gt; C), c&#x2019;est <a href="wpfr:Curryfication">curryfié</a>, donc c&#x2019;est exactement équivalent à (A -&gt; (B -&gt; C)). De là on peut sans doute appliquer la définition et obtenir une réponse claire, mais il faut y penser et tu as raison de demander à expliciter ce point là. </p><p>Donc&#xA0;: <code>[A -&gt; B -&gt; C]</code>, c&#x2019;est <code>[A -&gt; (B -&gt; C)]</code> soit <code>A -&gt; ({⊥} + [B -&gt; C])</code>, c&#x2019;est-à-dire <code>A -&gt; ({⊥} + (B -&gt; {⊥} + C))</code>. En gros, tu commences par donner l&#x2019;argument de type A, et là soit ça plante (⊥), soit tu as une fonction partielle <code>[B -&gt; C]</code> à laquelle tu donnes l&#x2019;argument de type B. On considère donc la fonction qui prend du B en paramètre seulement dans le cas où ça n&#x2019;a pas planté. </p><p>L&#x2019;idée c&#x2019;est que ⊥ n&#x2019;est pas une valeur. Ça ne correspond pas à un objet qui existe dans notre langage, puisque c&#x2019;est au contraire l&#x2019;<em>absence de résultat</em>. Si une fonction termine, elle renvoie une valeur (qu&#x2019;on dénote par un élément de B) mais sinon elle ne termine pas (par exemple elle boucle à l&#x2019;infini). Ça n&#x2019;a donc pas de sens de &quot;passer ⊥ en paramètre&quot; puisque ce n&#x2019;est pas une valeur du langage&#xA0;: si tu as essayé de faire un calcul qui n&#x2019;a pas terminé, mathématiquement tu as &quot;⊥&quot;, mais informatiquement tu as un plantage et tu ne peux pas &quot;continuer&quot;&#xA0;: passer des paramètres, etc. </p><p>C&#x2019;est donc là qu&#x2019;on rejoint la notion de &quot;⊥ donne tout le temps ⊥&quot;&#xA0;: une fois que tu atteins ⊥ mathématiquement, le calcul a &quot;échoué&quot; et il reste comme ça. Si <code>f x</code> échoue, alors <code>g (f x)</code> échoue, quelle que soit g&#xA0;: on commence par vouloir <code>f x</code> et c&#x2019;est l&#x2019;échec. C&#x2019;est une autre définition des langages stricts. </p><p>On peut aussi consolider l&#x2019;enrobage avec plus d&#x2019;enrobage&#xA0;: il y a une idée implicite dans ce que je dis, que je peux formaliser. Je parle de la sémantique (l&#x2019;objet mathématique correspondant au code informatique) des fonctions, mais pas de celle des <em>applications</em> de fonction. Si <code>f</code> est une expression qui désigne une fonction, et <code>x</code> qui désigne une valeur, quel est l&#x2019;objet mathématique <code>[f x]</code> correspondant à l&#x2019;application de <code>f</code> à <code>z</code>&#xA0;? </p><ul><li>si <code>[f] = ⊥</code>, c&#x2019;est <code>⊥</code> </li><li>sinon c&#x2019;est <code>[f]([x])</code>&#xA0;: <code>[f]</code> est une fonction partielle, donc le résultat peut encore être ⊥ </li></ul>Avec cette définition plus précise, tu peux raisonner formellement (et donc précisément), mais je pense pas que ce soit ce dont tu avais besoin. Ça pourrait cependant servir pour d&#x2019;autres questions.