|
Publicité ' | ||||||||||||||||||||||||
|
|
#141 | |||||
|
Inactif
![]() Inscription : octobre 2004 Messages : 3 894 ![]() |
Citation:
Mais pour moi, ça restera soit des CPU de niches, soit des coprocesseurs. La seconde solution serait d'ailleurs bien plus profitable aux approches fonctionnelles que la première ! Il y a dix ans, qui connaissait (et utilisait !) les processeurs SIMD, à part les étudiants en architecture parallèle ? Avec l'arrivée du MMX, puis du SSE, ces principes de calcul sont devenus quasiment courants, et connus de la plupart des développeurs. Ils ne l'auraient pas été autant si les CPU SIMD étaient restés "dédiés" à des niches. Non, c'est ce que je me tue à expliquer... Débuter par un des extrêmes (que ce soit du ML ou de l'ASM) est, à mon sens, néfaste car cela empêche l'ouverture d'esprit. Pas à pas... Séquentiellement... Impératif... ![]() Citation:
Citation:
Ceci étant dit, c'est une notion qui peut être enseignée facilement si l'on prends la peine de montrer l'analogie avec les boucles, et en quoi une récursion est différente d'une boucle (concept de "pile"). Pour ma part, j'utilisais l'analogie de la découpe de bois : on commence par couper le tronc en deux, puis chaque moitié en deux, puis encore, et encore, jusqu'à obtenir des cure-dents. Il est facile de montrer que la version "boucle" (analogie : un trajet à pied, un pas, puis un pas, puis un pas, ...) serait bien plus difficile à faire, car tailler un cure-dent dans un tronc d'arbre n'est pas évident (quelle taille ? quel diamètre ? où commencer ? ...). Citation:
Dans toutes mes études, j'ai rencontré très exactement TROIS profs d'informatique "valables", notamment un de mes profs d'algo. Les autres, comme je l'ai dit, étaient soit des matheux reconvertis, soit des "bidouilleurs" ayant accédé au professorat. Dans un cas comme dans l'autre, c'étaient de très mauvais pédagogues. Conceptualiser les pointeurs et l'expliquer correctement n'est ni difficile à faire, ni difficile à comprendre. Mais comme beaucoup de domaines, il n'est pas possible d'expliquer clairement quelque chose que l'on ne maîtrise pas TOTALEMENT. Et quand je voyais un de mes profs de DEUG complètement largué par des doubles indirections et des pointeurs fonctionnels, on peut légitimement se demander s'il était apte à enseigner la notion de pointeurs... Citation:
Le concept lui-même n'a pas besoin de maths, mais faire sa première fonction récursive, c'est souvent des maths par contre... A moins d'avoir avancé suffisamment dans les algos pour avoir expliqué les tris, et donc pouvoir illustrer la récursivité avec QuickSort. Moi non plus... D'où l'intérêt des langages multi-paradigmes, d'ailleurs. La POO n'est pas très difficile à comprendre, mais quelques bases saines sont quand même nécessaires auparavant je pense. Ce qui est le cas de Pascal et Ada, notamment... |
|||||
|
|
00
|
|
|
#142 | |
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 141 ![]() |
Je sais qu'à mes débuts, j'ai coincé sur les déclarations de variables, les entrées sorties des fonctions, les échanges de données entre variables (permutations), les boucles imbriquées et de loin la compilation (ie erreurs).
Peut être que le premier outil qui m'a donné envie de programmer c'est Mapple (lointain souvenir), mais le réel apprentissage, je l'ai fais avec Fortran et au début on en bave avec le compilateur, car il fallait faire attention aux colonnes. Je ne critique pas les langages fonctionnels, ils insistent sur des points qu'on ne voit pas dans d'autres paradigmes, d'où l'importance de voir différents langages de programmation. Ensuite, il faut faire une nuance entre apprentissage scolaire et autodidacte. Pour débuter, il faut apprendre, faire des exercices, s'entraîner et le compilateur joue le rôle de correcteur orthographique/grammatical et c'est là qu'on passe le plus de temps. Je ne regrette pas mon premier langage d'apprentissage. Même s'il ne permettait pas de faire du graphique, on acquiert les réflexes en algorithmique. EDIT: Citation:
Quand on débute, on découvre, c'est à dire qu'on ne sait rien à priori. |
|
|
|
00
|
|
|
#143 | |
|
Invité(e)
![]() Messages : n/a ![]() |
Citation:
Bon et sinon, pour revenir à l'aspect débutant, il n'y a que moi qui suis capable d'écrire un parcours d'arbre en moins de 3 jours ? Histoire de montrer les différentes approches... |
|
00
|
|
|
#144 | |
|
Inactif
![]() Inscription : octobre 2004 Messages : 3 894 ![]() |
Citation:
En Pascal, et surtout cette page, cherche les "Spécification d'implantation en Pascal" dans la page. En Ada (sachant que via un paquetage, on peut rendre le type géré totalement générique, de la même manière qu'avec un template C++). Dans tous les cas, une fois l'algo décrit en "langage algorithmique" classique, l'implémentation en Pascal ou Ada se fait de façon presque littérale... Et il y a tellement d'exemples d'arbres sur le net que "voir" l'approche Pascal / Ada ne pose vraiment aucun problème. |
|
|
|
00
|
|
|
#145 | ||||
|
Expert Confirmé Sénior
![]() ![]() |
Code Haskell :
Evidemment ça ressemble pas mal à OCaml, la syntaxe est relativement proche de la famille ML puisqu'il s'agissait d'une des inspirations lorsqu'Haskell a été créé en 90. Edit : Je réalise que la question ne portait pas sur un arbre binaire en particulier, voici donc pour un arbre quelconque : Code Haskell :
-- Jedaï |
||||
|
|
00
|
|
|
#146 |
|
Invité(e)
![]() Messages : n/a ![]() |
|
00
|
|
|
#147 | ||
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
On suppose qu'il existe des primitives FilsGauche et FilsDroit. En lisp on peut les implémenter simplement avec des paires pointées (FG . FD). En C ou C++ (par exemple) il faudrait créer les structures soi-même et les fonctions d'allocation / désallocation et d'accès qui vont avec.
En langage algorithmique (version récursive) Code :
|
||
|
|
00
|
|
|
#148 | ||
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
Je voulais dire :
Code :
|
||
|
|
00
|
|
|
#149 | |
|
Inactif
![]() Inscription : octobre 2004 Messages : 3 894 ![]() |
Citation:
De plus, tu confonds l'explication du concept avec son implémentation (notamment lorsque tu parles de "simplicité). En Pascal ou Ada, l'implémentation, c'est quasiment le pseudo-code algo à quelques conventions syntaxiques près, tout comme l'implémentation en fonctionnel est quasiment l'écriture du TAD. Cependant, expliquer les TAD n'est pas forcément plus simple qu'expliquer un pseudo-code, loin de là. Mais ce n'est pas parce qu'un code est plus court qu'il est plus simple ou plus compréhensible... Tu peux aller voir IOCCC si tu veux t'en convaincre. |
|
|
|
00
|
|
|
#150 |
|
Invité(e)
![]() Messages : n/a ![]() |
Fais gaffe quand même, parce qu'à systématiquement refuser de montrer comment ça s'écrit en Pascal, et à le mettre à coté du code Caml, tu vas finir par faire croire au gens que c'est parce que tu te rends compte que c'est beaucoup moins simple à montrer à un débutant. Ce serait con quand même :-\
|
00
|
|
|
#151 | |
|
Inactif
![]() Inscription : octobre 2004 Messages : 3 894 ![]() |
Citation:
|
|
|
|
00
|
|
|
#152 | ||||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Citation:
(je ne dis pas que la programmation fonctionnelle n'est pas la bonne solution pour le multi-coeur, je dis juste que si c'est la seule alors le multi-coeur n'aura qu'un avenir commercial de niche) Code Coq 8.1 :
Code 68020 :
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||||||
|
00
|
|
|
#153 | ||
|
Invité(e)
![]() Messages : n/a ![]() |
Hihi, Coq pour un débutant :p
Version "calculatoire" : Code :
|
||
00
|
|
|
#154 | |
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
Citation:
Les bons langages sont multiparadigmes et les bons programmeurs aussi. Quand je code en LISP je mets du fonctionnel où il faut, de l'impératif où il faut, de l'objet où il faut, j'invente ma propre syntaxe quand il faut (les macros extrêmement puissantes de ce langage le permettent) et j'écris des programmes qui écrivent des programmes quand il faut (grâce aux macros et aux fonctions de première classe) J'utilise toutes les spécificités de LISP qui permettent de faire du développement à la fois rapide et performant (compilation à la demande, données persistentes qui peuvent avantageusement remplacer un SGBG dans bien des cas, déclarations pour optimiser les routines critiques, innombrables types de boucles, extensions régulièrement standardisées si la communauté les utilise beaucoup de fait, couplage avec Emacs et SLIME pour un déboggage ultra rapide, implémentation du paradigme objet (CLOS) bien plus puissante que celles de C++ ou de Java, etc) A Bordeaux 1 il y a quelques années, LISP était très utilisé dans l'enseignement de la programmation, mais pas comme premier langage. J'ai trouvé cela dommage car commencer par C++ (ce qui était le cas des élèves qui passaient par l'IUT par exemple), franchement, ça ne prépare pas à la programmation multi-paradigme. Bref. A côté de LISP, les étudiants voyaient aussi des trucs bas niveaux (Assembleur et C), des langages "pour faire plaisir aux recruteurs" (C++ et Java) et OCAML et Coq qui avaient le don d'exaspérer ceux pour qui LISP était déjà "trop matheux" mais qui ont eu beaucoup de succès chez les autres. Ce qui m'énerve avec les informaticiens, c'est qu'il y en a beaucoup trop qui ne jurent que par l'impératif au détriment du fonctionnel, que par l'objet au détriment du procédural, que par C++ au détriment de tout autre langage (ce ne sont pas les discussions sur Developpez.com qui me contrediront). Le marché leur donne raison donc ils ne se remettent pas en cause (et ce sont eux qui donnent des leçons d'ouverture d'esprit !) Pourtant, les choix du marché ne sont pas forcément les bons, les décideurs et les recruteurs ne font pas forcément bien leur travail. Sinon il n'y aurait pas autant de projets annulés, retardés, explosant leur budget, etc. |
|
|
|
00
|
|
|
#155 | |
|
Expert Confirmé
![]() frederic francesConsultant informatique Inscription : juin 2009 Messages : 1 848 ![]() |
Citation:
L'approche et les concept sous lisp sont peu être un peu trop hard pour débuter dans le sens ou devoir expliquer 3 ou 4 lignes de lisp reviens a expliquer une cinquantaine de lignes dans un langage "classique" je le verrais plus dans des cours de programmation avancée. |
|
|
|
00
|
|
|
#156 | ||
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
Et comment !
Citation:
Citation:
LISP est un bon langage pour n'importe quelle partie d'un cursus. |
||
|
|
00
|
|
|
#157 |
|
Invité régulier
![]() Étudiant Inscription : juillet 2009 Messages : 5 ![]() |
Concernant les langages fonctionnels, j'ai commencé sur caml (light) en prépa. J'avoue que j'aime bien les maths, mais la découverte de Java après m'a fait un choc à cause de la verbosité et du manque d'expressivité du langage. Bon je suis un débutant n'ayant encore programmé aucun projet d'envergure raisonnable
, mais après avoir touché à du caml, du lisp (scheme en fait), du python, du java et un bout de C++ je pense que les fonctionnels sont largement plus agréables à manipuler (plutôt que jongler entre char[] et string en C++ par exemple, oiu se prendre la tête sur un problème de mémoire qui n'a strictement rien à voir avec l'algo qu'on tente d'implémenter) pour un débutant. Python me semble aussi un bon choix, quand on débute on se contrefiche de la performance. Par contre le laxisme du typage dynamique est fâcheux, ce qui nous ramène aux langages fonctionnels à typage statique comme caml ou haskell, qui combinent concision, sûreté et efficacité. |
|
|
00
|
|
|
#158 |
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
Attention à ne pas amalgammer Lisp et Scheme qui n'ont autant rien à voir l'un avec l'autre que C avec Java, malgré les similitudes syntaxiques.
|
|
|
00
|
|
|
#159 | |
|
Invité régulier
![]() Étudiant Inscription : juillet 2009 Messages : 5 ![]() |
Citation:
En fait à part la question des namespaces variables/fonctions séparés, je suis dans le flou le plus complet, n'ayant jamais touché à CL... Quoi qu'il en soit, les deux restent des langages très puissants à la syntaxe simple (une seule règle de syntaxe, ça va) offrant des macros et des fonctions de premier ordre, c'est-à-dire plus agréables à utiliser que C/C++/Java dans lesquels un map prend au minimum 2 lignes et/ou une encapsulation de fonction... |
|
|
|
00
|
|
|
#160 | |
|
Expert Confirmé
![]() frederic francesConsultant informatique Inscription : juin 2009 Messages : 1 848 ![]() |
Citation:
ceci dit faire du procédural et de l'algorithmie classique en lisp est un peu lourd, il est facile de se passer des boucle "for/while" par exemple. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com