|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
|
|
|
|
10
|
|
|
#22 |
|
Membre éprouvé
![]() |
Troll pas sur mon thread !
Le C permet par exemple la programmation structurée et probablement un peu plus de vérification statique que l'Assembleur, il est aussi plus portable. |
|
|
00
|
|
|
#23 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 966 ![]() |
Citation:
après il est clair qu'il a malgré tout conservé cette capacité à effectuer des opérations assez bas-niveau, et d'inliner de l'assembleur là dire que C = asm, ça revient à dire que C++ = C avec des struct contenant des fonctions ![]() petit exo: fais une SOS du C99, plus large que le sous-ensemble enseigné en école ( ça vole rarement haut en général |
|
|
|
00
|
|
|
#24 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
P.S : Je parie que ce n'est pas du C ANSI. |
|
|
|
00
|
|
|
#25 | |
![]() ![]() Inscription : juin 2002 Messages : 2 034 ![]() |
Citation:
Et pour être précis, c'est même actuellement la seule version normalisée du langage C puisqu'elle annule et remplace la précédente version. Il s'agit donc bien de C normalisé par l'ANSI. Même si traditionnellement par C ANSI, on désigne plutôt la version précédente (également appelé C89 ou C90). |
|
|
|
00
|
|
|
#26 | |
![]() ![]() Inscription : juin 2002 Messages : 2 034 ![]() |
Citation:
Même si l'application partielle vient effectivement de la programmation fonctionnelle et est très présente dans les langages fonctionnels, ce n'est visiblement pas une condition nécessaire dans la plupart des définitions de ce qu'est la programmation fonctionnelle. |
|
|
|
00
|
|
|
#27 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
gl > si un langage ne supporte pas les fonctions de première classe, pour moi ce n'est pas un langage fonctionnel. Et pour faire cela il faut avoir des fermetures (sinon on ne peut pas créer des fonctions qui capturent une partie de leur environnement, comme le font les constructeurs de données classiques), et une fois que tu as ça tu as tout ce qu'il faut pour avoir ce qu'on appelle "application partielle" et qui consiste en fait simplement à écrire des fonctions qui renvoient des fermetures.
(On peut éventuellement discuter de la nécessité ou non des lambda-abstractions, ou fonctions anonymes; pour moi ce n'est pas inoubliable puisque les lambda-abstractions sont macro-expressibles avec des fonctions nommées) NokyDaOne > ce que tu dis ne veut toujours pas dire grand chose à mon avis. D'abord tu dis que l'assembleur "gère les fonctions". Clairement, tu ne veux pas dire que l'assembleur est un langage qui a un concept sémantique de "fonction", car ce n'est pas vrai (en tout cas pour ceux que je connais). Tu veux donc dire que ce qu'on définit habituellement comme des "fonctions" dans un langage plus haut niveau peut être exprimé, par le biais d'une passe de compilation (automatique ou manuelle), en assembleur. Certes, mais d'abord tu ne dis pas ce que veux dire "gérer les fonctions". De quelles fonctions parles-tu ? Celles de C ? Justement on est en train d'expliquer que le concept de "fonctions" en C n'est pas assez riche par rapport à d'autres langages. "gérer les fonctions" ça veut dire permettre d'effectuer les opérations que l'on désire, qui mettent en œuvre des fonctions. Pour moi ce que tu appelles "les applications partielles" fait partie de ces opérations. Donc pour moi, "gérer les fonctions" ça veut aussi dire ça (ou alors il faut être plus précis). Enfin, l'assembleur "gère" les "applications partielles", au même sens qu'il "gère" les fonctions : on peut compiler un code utilisant des "applications partielles" (en réalité des constructions de fermetures) vers de l'assembleur, c'est ce que font les compilateurs de langage fonctionnels. Pour moi ta remarque n'a donc pas de sens. Pour tout langage compilé vers de l'assembleur tu peux dire "ce que **** sait faire, c'est ce que l'assembleur sait faire", autrement dit l'assembleur, avec cette conception, sait tout faire, et on ne peut pas différencier des fonctionnalités selon ce critère. |
|
|
00
|
|
|
#28 | ||
![]() ![]() Inscription : juin 2002 Messages : 2 034 ![]() |
Citation:
C'était d'ailleurs précisément le sens de ma remarque : ce n'est pas parce que la majorité des langages supportent la notion de fonction que ce sont des langages fonctionnels, pour cela il faut traiter les fonctions comme des objet de première classe, etc. Citation:
|
||
|
|
00
|
|
|
#29 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Qu'est-ce qu'une application partielle "automatique" ?
Dans les langages typés que je connais, la curryfication n'est pas "automatique" mais bien spécifiée par le programmeur. Autrement dit, on décrit (bien que la syntaxe soit concise et agréable à utiliser) exactement la construction des fermetures etc. (indépendamment des potentielles optimisations du compilateur; en particulier l'"arity-raising" est très utile ici). Par exemple en OCaml quand tu écris : let f x y z = foo C'est syntaxiquement équivalent à : let f = fun x y z -> foo Lui-même équivalent à let f = fun x -> fun y -> fun z -> foo qui est une forme explicitement curryfiée; il n'y a rien d'automatique, juste un sucre syntaxique. Je peux imaginer des langages où la curryfication est "implicite", dans le sens où si on donne seulement une partie des paramètres à une fonction n-aire, le typeur insère lui-même une abstraction qui attend les arguments suivants. Ça doit être possible en Scala¹, avec des cœrcions explicites, en Coq, ou avec une extension Haskell bizarre (surcharger l'application), mais à ma connaissance les gens ne le font pas. ¹ : il me semble que le style idiomatique en Scala est plutôt d'écrire des fonctions non curryfiées f(x,y), et d'utiliser leur sucre syntaxique d'abstraction quand nécessaire : f(foo,_) pour abstraire selon le second argument. Bref, je ne suis pas sûr de bien comprendre ce que voudrait dire "l'application partielle est nécessaire pour avoir un langage fonctionnel". Pour moi, l'application partielle n'existe pas vraiment, c'est plutôt un nom qu'on donne à une combinaisons de fonctionnalités (elles indispensables) qui permet de formuler élégamment certaines choses (mais qui a aussi des défauts). |
|
|
00
|
|
|
#30 | ||
![]() ![]() Inscription : juin 2002 Messages : 2 034 ![]() |
Citation:
Ça peut être aussi simple que de tout implémenter sous forme currifyée et d'avoir une syntaxe d'appel de fonction assez simple pour enchaîner les appels des fermetures retournées de manière "transparente" (que cette syntaxe soit "f a b", "f(a)(b)", ou quoique ce soit d'autre). Le terme "automatique" n'est probablement pas le bon, mais je n'en trouve pas de meilleur pour désigner les différentes méthodes qui pourraient exister. Citation:
|
||
|
|
00
|
|
|
#31 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Le mieux serait que l'on liste les langages fonctionnel et pas fonctionnels. De là on pourrait faire le tour des propriétés de ces langages et trancher sur ce qui fait d'un langage un langage fonctionnel (150 sur application partielle ? Qui veut parier
Et sinon je ne vois pas pourquoi certains sont gênés par le fait que je dise que l'assembleur gère les fonctions (pointeurs) mais pas l'application partielle. J'ai connu des langages qui ne faisaient même pas ce que faisait l'assembleur, donc oui l'assembleur gère les fonctions, dire le contraire, c'est juste prouver que l'on a pas travailler avec un langage qui ne gère réellement pas les fonctions sinon la différence sauteraient aux yeux. gl t'as un exemple de choses en C qui sont difficilement portable en assembleur ? |
|
|
01
|
|
|
#32 | ||||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Pour moi (comme ça a été dit), il suffit d'avoir des fonctions de premier ordre pour avoir un langage fonctionnel. Beaucoup de langages supportent ça sans avoir d'application partielle. Citation:
Code :
|
||||
|
|
10
|
|
|
#33 | ||||
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
Perl que dalle Python je ne sais pas Ruby je crois que c'en est un. L'idée est que l'on se mette d'accord sur la liste des langages fonctionnels et de là on verra quels sont vraiment les critères. Citation:
|
||||
|
|
02
|
|
|
#34 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Citation:
Mais déjà, Lisp ne fait pas de base (dans le sens de gl) d'application partielle. On s'arrête là ? |
||
|
|
00
|
|
|
#35 |
|
Membre éprouvé
![]() |
LLB, on dit pas objet de première classe plutôt que fonction de premier ordre ?
|
|
|
00
|
|
|
#36 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
Et alors c'est le sens selon une personne. Lisp fait des applications partielles, c'est même son but premier (vu que lisp est une pseudo implémentation du lambda calcul) et ne me dites pas non, j'en ai déjà faites. Je l'ai vu de mes propre yeux. |
|
|
|
01
|
|
|
#37 | |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Citation:
Python a des fermetures et des fonctions de première classe, et même des listes non mutables. Ca n'en fait pas un "langage fonctionnel", parce qu'il ne te pousse pas du tout à utiliser cette approche, qu'elle est peu exploité dans la librairie standard, et que ce n'est pas du tout dans la culture de sa communauté. Et puis un programmeur Haskel pourra avec un minimum de mauvaise foi (<troll>et tout bon programmeur Haskel a ça en sock :p</>) justifier que caml n'est pas un langage fonctionnel parce qu'ils attachent aussi la persistance à la notion de "fonctionnel" (on parle souvent de "structure fonctionnelle" alors qu'il n'y a pas une seule fonction dans la structure, juste parce qu'elle n'est pas mutable) Et je trouve que la présence de sucre syntaxique pour définir dans quelle catégorie se trouve un langage est un peu absurde (je parle ici de l'histoire de l'application partielle). Bref, Lisp, Haskell, OCaml sont des langages fonctionnels Python, C + Block, C++0x sont des langages ayant incorporés des traits fonctionnels C et java ne sont *pas* des langages fonctionnels. |
|
|
|
00
|
|
|
#38 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Comme j'avais pris soin de le dire en début de topic :
Citation:
Après chacun est libre de juger que tel ou tel aspect est nécessaire ou incompatible avec le label rouge "langage fonctionnel", mais je pense que c'est un débat stérile. Par contre dire qu'on a besoin d'un de ces aspect parce qu'il permet ceci ou cela qui est désirable, c'est une bonne idée (même si ça reste souvent difficile à mesurer objectivement). En plus de la difficulté d'isoler un concept de "langage fontionnel", il y a des critères sociaux qui font que deux langages même avec les mêmes fonctionnalités peuvent être utilisés très différemment. Par exemple dans la famille des Lisp il y a des langages très proches, mais dont certains mettent en avant un style fonctionnel (Scheme par exemple), la limitation des effets de bords et l'utilisation généreuse de la récursivité, alors que d'autres Lisp favorisent au contraire un style impératif et procédural, avec des variables modifiables et des boucles. À ce compte là, un langage est fonctionnel à partir du moment où la majorité de ses utilisateurs le décrivent comme un langage fonctionnel... Citation:
¹ : puisqu'on en arrive là, je pense à des fonctions au sens du lambda-calcul : quand on leur donne un argument (ou plusieurs), elles s'évaluent en un résultat. Je me contenterais de procédure à qui on donne un argument et qui ne renvoient rien, mais ça n'existe pas non plus. On peut bien sûr organiser ses programmes assembleurs de la même façon qu'on le ferait dans un langage avec des fonctions : on passe des valeurs sur la pile ou en registre, quand on fait des appels on sauvegarde les registres caller-save, etc. C'est d'ailleurs ce que font les compilateurs qui traduisent un langage avec fonctions vers de l'assembleur. Mais ça ne donne pas pour autant de sens à l'affirmation "l'assembleur gère les fonctions", puisqu'à ce compte-là l'assembleur gère tout. NokyDaOne, ça fait plusieurs messages dans ce thread que j'ai l'impression que tu ne comprends pas ce dont tu parles. Si tu pouvais étayer un peu tes dires au lieu d'ignorer soigneusement mes remarques, je serais plus content quand je viens lire ce thread. Et j'aime bien être content. TropMDR > Haskell n'est pas un langage fonctionnel, il a programmes qui ne terminent pas. |
||
|
|
10
|
|
|
#39 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 99 ![]() |
Citation:
Au global il y a un seul et unique critère : est-ce que je peux facilement créer une fonction qui ajoute 3 à partir d'une fonction qui additionne deux entiers. Si oui alors on est en fonctionnel (caml, c#, vb.net, js, lisp, python, haskell). Si non alors on est pas en fonctionnel (c, asm, java, php (sauf s'il a muté depuis le temps)). P.S : on ne peut pas prendre en compte les habitudes de la communauté pour classifier un langage, c'est pas recevable. Un langage existe en dehors de son utilisation. |
|
|
|
00
|
|
|
#40 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com