Tente de compiler du C d'un coté et du Haskell de l'autre, tu comprendras ce que j'entends par "exceptionnelle trivialité".
Les instructions en C c'est quoi ? Affecter une valeur à une variable, passer à l'instruction suivante, faire une boucle, une fois de temps à autre faire un appel de fonction, utiliser directement les adresses des éléments et faire des appels système pour gérer manuellement la mémoire. Bref, c'est de l'assembleur avec une syntaxe de "haut niveau" (c'est à dire indépendant de la machine et où tu ne fais pas de distinction entre une valeure déjà dans un registre et celle dans un emplacement mémoire), et un très vague système de type.
Du Haskell c'est quoi ? Des fonctions de premier type (c'est à dire utilisable comme des valeurs "normales"), des évaluations retardés, des monades, un système de type complexe et j'en passe.
Il est quand même assez évident que compiler du C est beaucoup plus simple que de compiler n'importe quel langage fonctionnel ou même simplement objet. Donc effectivement, dès qu'une nouvelle architecture arrive, un compilo C est livré avec, parce que c'est simple ! Alors qu'il faut attendre bien plus longtemps pour avoir d'autres langages (sauf ceux dont la machine virtuelle est écrite en C...)
Encore une fois, le C a été inventé dans les année 70, pour écrire un système d'exploitation. C'est donc un langage qui a 40 ans, et qui était spécifiquement fait pour du bas niveau. Donc qu'on l'utilise pour faire du bas niveau (ie. un OS), pas de problème ! Qu'on l'utilise pour le reste, je trouve ça plus que dommage.
Oui, ok, c'est une légère provocation. Mais je persiste à penser que ce langage relève plus de l'assembleur que de ce qu'on appelle de nos jours un langage de programmation. Pour reprendre ce que je dis un post plus haut, un programme en C reviens à une succession d'instruction bas niveau telle que l'affectation d'une valeur à une variable, une boucle (il n'y a même pas de boucle for à proprement parler, mais une syntaxe différente de boucle while...), la manipulation d'une adresse mémoire, etc. La principale différence avec un assembleur est qu'on ne se préoccupe pas de faire la distinction entre les variables en mémoire et celles dans des registres. La belle affaire !
De son succès en dehors du domaine pour lequel il a été créé serait plus judicieux alorsDire que l'unique raison du succes du C est sa facilite d'implementation est aussi faux.
Dernière modification par gorgonite ; 03/12/2007 à 21h14.
Je ne suis pas d'accord !!!
J'ai déjà fait un compilateur C et un compilateur CoreML, et la complexité est quand même du côté du C... et ce n'est pas le mécanisme d'évaluation paresseuse qui augmentera tellement la complexité
pour ce qui est des autres fonctionnalités, si tu étudies un papier de Xavier Leroy, tu verras qu'il y a des méthodes simples pour passer d'un langage avec opérations "complexes", à un langage bien plus simple de manière automatique
ce qui va t'obliger à traiter énormement de cas différents, car il n'y a pas de fortes similitudes
étant donné que tout est du type déclarations ou évaluations... ça va "assez" vite
Il est quand même assez évident que compiler du C est beaucoup plus simple que de compiler n'importe quel langage fonctionnel ou même simplement objet.
perso, je te conseillerais d'essayer d'en faire en vrai avant t'exprimer si catégoriquement sur le sujet
Si on ne cherche pas les optimisations, C est un langage relativement simple à implémenter (voir par exemple http://www.de.ioccc.org/2001/bellard.c). Oui, il y a plus simple même en cherchant dans les langages de l'époque (Forth par exemple; Forth serait d'ailleurs beaucoup plus répandu si le facteur simplicité d'implémentation était le principal), mais je suis globalement d'accord avec Alex_Pi.
Les assembleurs restent des langages de programmation, même de nos jours.
Tu as écrit beaucoup de programme en assembleur? Ce n'est pas la première différence qui me vient à l'esprit. Et une des choses qui feront que je n'arriverais jamais à considérer le C comme un assembleur, c'est ce qu'il ne permet pas.La principale différence avec un assembleur est qu'on ne se préoccupe pas de faire la distinction entre les variables en mémoire et celles dans des registres. La belle affaire !
Il y avait d'autres langages plus simples, se contenter de cet aspect parce que ces langages sont plus ou moins oubliés n'est pas un raisonnement valide. Il faut considérer les autres facteurs.De son succès en dehors du domaine pour lequel il a été créé serait plus judicieux alors
Son lien avec Unix est vraissemblablement un facteur plus important que sa simplicité d'implémentation. Le fait que ce soit un langage de bas niveau a eu aussi (et a toujours) un effet macho indéniable. Puis au moment où il s'est imposé (disons les années 80), quels étaient les concurrents sérieux? Après, il a profité pas mal de sa base installée.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Nan mais bien sûr si d'un coté tu as un langage simplifié au maximum, à la spécification claire et limpide (CoreML) et que de l'autre tu as un langage où à chaque étape tu dois lire les 20 pages correspondante de la norme, le compilo CoreML est peut être plus rapide à écrire. Et compiler un langage fonctionnel, effectivement, on sait faire ça depuis très longtemps (CF Lisp). Le problème est de faire un compilo produisant un code *raisonnable*.
Encore une fois, ça dépend ce que l'on veut comme qualité de code en sortie de compilo. Du C compilé naïvement, le résultat est raisonnable. Du ML compilé naïvement, faut se tirer une balle. Et franchement, l'évaluation paresseuse, c'est galère au niveau de l'implémentation. Il faut garder pleins de pointeurs dans tous les sens pour tout remettre à jour.
Compiler vers une machine virtuelle avec instructions adaptés aux langages fonctionnels est une chose. Passer de ça à du langage machine (qui est profondément impératif), c'est une autre paire de manches. Rajouter un GC et compagnie, ça augmente encore la difficulté...
J'ai quelques bases de compilation, je te rassure...
turbo pascal était selon moi un concurrent tout à fait acceptable...
tu ne parles plus des difficultés liés aux langages, mais plutôt de la verbosité des spécifications... mais il faut aussi garder à l'esprit la considérable différence qu'il y a entre une description académique (et souvent surtout conceptuelle), avec une description détaillée dans le cadre d'une normalisation, ce que nombre d'universitaires regardent avec dédain et qui explique souvent le manque d'intérêt de l'industrie pour leurs travaux (s'il faut être bac +7 pour comprendre comment utiliser le langage )
pas tellement... dans le cas d'un langage à la ML avec évaluation paresseuse, c'est pas si compliqué si l'on a bien analysé le problème, et qu'on a une structure de code adaptée
tout à fait d'accord, mais une fois passé sous forme SSA, avec quelques algos classiques et des heuristiques connues, on peut produire du bon code (je l'avais fait en asm mips)
je me doute bien que tu as des bases, mais la question que je me demandais était de savoir la complexité de ton plus gros projet de compilation
EDIT : en revanche, on s'éloigne du sujet initial... ce serait bien de recadrer le débat, donc concluez vite vos appartés
Le gros problème de Pascal, c'est qu'il n'y avait pas deux implémentations compatibles parce qu'il fallait nécessairement des extensions au langage décrit par Wirth pour être utilisable en pratique (en particulier pour la compilation séparée) et que tout le monde a fait les siennes. La norme est venue bien trop tard pour régler ça.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Il n'y a pas d'absolu dans ce que je disais. Je voulais, et j'aurais du, dire « les langages actuellement considéré comme de haut niveau » Mea culpa.
Sur l'idée globale en ce qui concerne le C : c'est très très proche de la machine.
En quoi cela contredit-il ce que j'ai dit ? Tu commences par « mais non » donc je me demande.
Parce que soit, tout ce que tu énumères est aussi une des difficultés, mais je t'assure que ce n'est pas là où mes étudiants ont le plus de mal. As-tu souvent enseigné le C à des étudiants qui n'ont jamais fait d'informatique ?
On va dire que je me suis mal exprimé : globalement, je suis d'accord avec Alex_pi et Jedai sur leurs remarques sur ce qu'est le C. Mais je préfère le C au C++ quand même. Si je veux du haut niveau, je prends autre chose que le C++ qui n'est qu'une couche sur le C (et à mon goût très mal faite vis-à-vis de ce qui existe maintenant). Je préfèrerais Scheme, Smalltalk, Pascal, ou même Java (c'est pour dire -_-)
Tu avais raison de vouloir t'éloigner de l'anglais. Le terme « implémenter » a moins de 10 ans dans le vocabulaire officiel français (même si ça fait longtemps que nous l'utilisons tous). Le terme implanter signifie « mettre en place un système » et n'est pas du tout réserver à l'informatique car on peut « implanter une usine dans une région » ou « implanter un processus de calcul de feuille d'impôt ». Le terme « implémenter » par contre est directement tiré de l'anglais avec la subtilité citée plutôt : « passer du concept à la réalisation ». En français, il est plus ou moins réservé à l'informatique. En anglais, il s'utilise pour tout projet en ingénierie qui demande un passage des plans (concepts) à la réalisation. Cependant si l'objet est physique, je pense que beaucoup d'anglophones préfèrent « implanter » à ce moment. Donc, grosso modo, « implanter » à plus une notion de passage vers le réel tangible, tandis qu'« implémenter » note plus une réalisation dans l'abstrait. En effet, le programme n'est pas physique mais reste éthéré d'une certaine manière.
Deux références intéressantes :
Le grand dictionnaire terminologique de l'OQLF. C'est certes québecois, mais il se trouve que nous avons l'énorme avantage de graviter au centre d'un monde qui manipule les deux langues. Les traductions doivent donc être prompt et juste, et je dois dire que l'OQLF fait un bon travail de ce côté là. Les termes sont généralement utilisés par les scientifiques des domaines concernés.
Termium (malheureusement avec abonnement payant) est un autre outil merveilleux. Il référence en effet, l'utilisation dans la littérature des différents termes pour pouvoir les comparer au contexte. Exemple :Implanter : Mettre en place un logiciel ou un programme dans un ordinateur, en effectuant les adaptations nécessaires à leur fonctionnement optimal dans des conditions spécifiques.
Implémenter : Réaliser la phase finale d'élaboration d'un système informatique, afin de le rendre fonctionnel.
Un autre terme utilisable pour « implémenter » est « mettre en œuvre. »Implémenter : Effectuer les choix techniques et les actions qui permettent de passer d'une idée, d'un principe ou d'une spécification à un produit matériel ou logiciel ou à un système opérationnel.
(source: Commission spécialisée de terminologie et de néologie de l'informatique et des composants électroniques, Paris).
J'espère avoir été clair
Je viens de relire la question du premier post... juste pour être sur...
La question était de savoir quel langage pour commencer entre C et C++... je réitère donc : le C.
Le C++ est un calvaire en général (entre autre chose) du fait de son caractère hybride.
La nous somme d'accord.Sur l'idee globale en ce qui concerne le C : c'est tres tres proche
de la machine.
Non. Par contre j'ai passe pas mal de temps a enseigner de l'assembleur etEn quoi cela contredit-il ce que j'ai dit ? Tu commences par \" mais
non " donc je me demande. Parce que soit, tout ce que tu enumeres est
aussi une des difficultes, mais je t'assure que ce n'est pas la ou mes
etudiants ont le plus de mal. As-tu souvent enseigne le C a des etudiants
qui n'ont jamais fait d'informatique ?
la conception de systemes numeriques. Et je passe une partie de mon temps
a corriger des fausses conceptions au sujet du C, ce qui fait que je
connais bien ce qui pose probleme apres les cours -- et donc
vraissemblablement pendant parce qu'une bonne partie de ca aurait du etre
connue apres des cours corrects. A noter que je preferais enseigner
l'assembleur ou la conception de systemes numeriques au C, sans hesitation.
Je crois que tout le monde est plus ou moins d'accord la dessus. JeOn va dire que je me suis mal exprime : globalement, je suis
d'accord avec Alex_pi et Jedai sur leurs remarques sur ce qu'est le C.
conteste la qualification d'assembleur, parce qu'il manque des choses au C.
Et naturellement je differe sur l'importance accordee a differents facteurs
dans sa popularite.
Dire que le C++ n'est qu'une couche sur le C est tellement reducteur queMais je prefere le C au C++ quand meme. Si je veux du haut niveau,
je prends autre chose que le C++ qui n'est qu'une couche sur le C (et a mon
gout tres mal faite vis-a-vis de ce qui existe maintenant).
c'est le signe soit d'un troll, soit d'une meconnaissance profonde du C++.
Scheme, Smalltalk sont des langages au typage dynamique. J'ai du mal aJe prefererais Scheme, Smalltalk, Pascal, ou meme Java (c'est pour
dire -_-)
comparer des langages aussi fondamentalement different dans l'approche en
excluant l'interet meme de l'approche.
Pascal est un langage mort. Il en reste Delphi qui est bien trop lie a une
plateforme pour etre seulement un candidat pour ce que je fais. Si
seulement tu avais ecrit Ada...
Si j'ai a choisir entre le C et le C++ pour enseigner la programmation,
c'est le C++ que je choisi sans hesitation parce qu'il permet une meilleure
separation entre niveaux d'abstraction.
Interessant oui. Mais plus normatives que descriptives si j'en croisDeux references interessantes...
l'usage autour de moi.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
pour infos, dans mon ancienne école, ils ont (depuis 2 ans) décidé de prendre un sous-ensemble du C++ pour enseigner leur premier cours de programmation, au lieu du C autrefois utilisé
en gros, les élèves font du C, mais avec la droit d'utiliser les conteneurs stl, les itérateurs, etc ; il paraîtrait que ça les largue moins vite
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Certes ça a quand même changé.
Mais historiquement c'est vrai -_-
Menfinbon si tu préfères me considérer comme un troll libre à toi.
Ah oui!! Ada aussi ^_^ Je préfèrerais Ada à C++. Je l'avais même proposé en cours de premier année à la place de C++... mais il faut faire plaisir au entreprise. En fait à peu près tout sauf le C++ me plairait. J'avais juste cité les premiers qui me venaient en tête.
Mais bon Le fait que Pascal soit un langage qui n'est plus utilisé ou que Scheme soit un langage à typage dynamique n'enlève rien dans son enseignment comme premier langage de programmation. Je pense que tu n'as pas la même vision d'un premier cours que moi. Car si ça peut faire plaisir à des étudiants de voir un langage utilisé en industrie, d'un point de vue pédagogique ça n'a aucun intérêt.
Mais il y a ce côté hybride. Encore une fois, tous les jours ou presque, chaque année j'enseigne le C++ depuis 6 ans et je suis confronté au question des étudiants. Donc tu peux penser autant que tu veux que je ne connais rien sur le C++ et que je suis une tarte, ou, accepter que j'ai une certaine expérience pertinente dans son enseignement. Dans un premier cours, il y a bien des choses intéressantes du C++ que tu ne peux pas voir parce que tu n'en es pas rendu là. À moins de laisser derrière toi 75% des étudiants. Et c'est dans ce cadre où effectivement le C est plus intéressant que le C++. Enseigner l'assembleur, je connais aussi. Et la problématique est complètement différente.
En même temps, j'enseigne les bases de programmation avec Scheme en cours d'été en accéléré, et les questions des étudiants ne portent plus sur le côté technique, mais bien sur un niveau d'abstraction supérieur. Sais-tu que la philosophie d'enseignement du MIT est d'enseigner seulement le Scheme pour apprendre les concepts, puis laissez les étudiants apprendre les autres langages comme des grands. Le Scheme a été choisi en première année parce que sa syntaxe est extrêmement simple et qu'il permet de montrer les concepts rapidement sans perdre du temps dans des détails du langage qui ne servent à rien.
Maintenant j'ai surtout l'impression que tu ne me donnes aucun crédit et me prends pour un idiot. C'est très présomptueux de ta part. Je vais donc laisser ce « dialogue » avec toi ici si tu le veux bien. Joyeux Noël mon cher !!
Dans ce cas là c'est le programme qui est a critiqué. Je ne louerais pas notre programme a nous, il y a bien des choses que je n'aime pas. Mais ce n'est pas ce problème qu'on a.
N'oublis pas cependant qu'il est beaucoup plus facile de dire ce qui ne va pas dans un cours que de réussir à en monter un qui fonctionne dans le cadre d'un programme universitaire complet. Car mes collègues en France, en Allemagne en Angleterre ou ailleurs dans le Canada ne l'ont toujours pas trouvé je pense. En tout cas, ils ne me l'ont pas fait savoir dans ce cas ^_^
Tu prends une position excessive et tu t'offusques quand on en prend une
similaire? Ca m'arrive aussi d'écrire des choses pour faire réagir
J'avais pris la remarque pour plus générale qu'elle l'était et si tuMais bon Le fait que Pascal soit un langage qui n'est plus utilisé
ou que Scheme soit un langage à typage dynamique n'enlève rien dans son
enseignment comme premier langage de programmation. Je pense que tu n'as
pas la même vision d'un premier cours que moi. Car si ça peut faire plaisir
à des étudiants de voir un langage utilisé en industrie, d'un point de vue
pédagogique ça n'a aucun intérêt.
restais dans le cadre d'enseignement, je la comprends mieux. Quant à ma
vision sur ce qu'il faut dans un cursus d'enseignement de la programmation,
elle est beaucoup plus nuancee que tu n'as l'air de le penser -- cette
discussion est essentiellement entre le C ou C++ pour cet objectif. Voir
par exemple http://www.developpez.net/forums/sho...d.php?t=154919 ou
http://www.developpez.net/forums/showthread.php?t=82573 mais je suis sur de
pouvoir trouver des exemples ailleurs.
Pourquoi? L'objectif d'un premier cours n'est pas d'apprendre le langageDans un premier cours, il y a bien des choses intéressantes du C++
que tu ne peux pas voir parce que tu n'en es pas rendu là. À moins de
laisser derrière toi 75% des étudiants. Et c'est dans ce cadre où
effectivement le C est plus intéressant que le C++.
au complet -- je ne le tenterais ni avec Ada, ni avec C++ -- mais
d'utiliser un sous-ensemble pour apprendre la programmation. Et dans ce
cadre, ça ne me semble pas compliqué de trouver un sous-ensemble de C++
plus facile à enseigner dans un ordre logique qu'utiliser le C.
Oui.Sais-tu que la philosophie d'enseignement du MIT est d'enseigner
seulement le Scheme pour apprendre les concepts, puis laissez les étudiants
apprendre les autres langages comme des grands.
J'ai pas assez de temps pour discutter avec ceux que je considère commeMaintenant j'ai surtout l'impression que tu ne me donnes aucun
crédit et me prends pour un idiot.
idiots.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Alors je vais revoir mon jugement.
Bonne fête quand même (on a pas de smiley du père noël et ça c'est un manque messieurs les responsables.)
J'avais compris la question de celui qui a créé le fil comme : quel est le meilleur langage pour apprendre (et comprendre) la programmation ? Donc je me suis placé dans une perspective enseignement.
En dehors de cette perspective, et pour des gens qui sont déjà de bon programmeur, le C++ est un langage qui offre une souplesse rarement atteinte. Mais cette souplesse est rarement un avantage lorsqu'on parle à des débutants. De fait, il faut se fixer une limite (problème de temps) surtout que normalement, premier cours de programmation équivaut à premier cours de génie logiciel (analyse de problème et conception). Il n'y a jamais le temps nécessaire pour voir complètement ce qu'offre un langage dans un cours. Ceci d'ailleurs est logique... sinon le langage est bien peu riche. Souvent ce qui se passe, c'est que le programme s'établit en prenant un sous-ensemble du langage qui vise certains paradigmes. On commence souvent avec du procédurale qui est plus « naturel » puisque hérité d'une pensée mathématique très pratiquée par les étudiantEs (enfin espérons :mg
Faire du C++ en le limitant aux procédures, c'est pas très beau et certains objets apparaissent quand même. C'est génant pédagogiquement d'expliquer l'écriture « f.getline() » ou « s.c_str() ». On sent que les étudiants les plus borderline (pardon pour l'anglicisme) se sentent mal à l'aise et ne comprennent pas ce qu'on fait. On peut leur dire « laisser faire, on vous expliquera plus tard » mais c'est pas très pédagogique non plus. Donc tant qu'à faire du C++ amoindri à la procédure avec des dérives vers l'objet quand il le faut, il vaut mieux faire du vrai bon C et s'en tenir à ça. Au cours suivant de fournir les outils (analyse/conception et implémentation) du paradigme OO. Si on fait correctement du C (avec des types enregistrements bien faits, des pointeurs etc.) il n'y a pas de problème majeur pour apprendre le C++ selon moi. Hélas, ici même nous ne faisons pas ça pour des problèmes de stage dès la première année.
Quand on sait qu'en plus nous imposons des contraintes à la Pascal pour garder une certaine discipline sur le code, on se demande pourquoi du C++. En tout cas, les étudiants se le demandent par la suite d'après leur feedback. Ce genre de réflexion sur la souplesse de C++, m'impose le même raisonnement avec Python qui est langage formidable pour qui sait déjà structurer sa pensée et travailler correctement. J'ai pointé plusieurs fois une des souplesses du langage qui est un calvaire pour des débutants en programmation.
Bien sûr si on se place directement dans un contexte industriel, le problème est franchement différent. Le C++ n'a que peu de concurrent en fait. Peut être Java pour son utilisation soutenue, ou Ada (dans les domaines dans lesquelles je travaille particulièrement). Mais le couteau suisse du C++ est un atout formidable.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager