Le C ressemble quand-même pas mal au BASIC et au Pascal.
Non.
(enfin tu peux donner le sens que tu veux à « pas mal »)
Et puis tout dépend des librairies utilisées. On peut certainement avoir une librairie C qui offre une grande partie des fonctionnalités du runtime CAML.
1) Les réponse style « on peut », c'est pas des réponse quand, dans la pratique, « on a pas ».
2) Mais de toute façon, les runtime de C et de caml sont tout à fait équivalents.
La différence de taille ne vient pas de là.
Ce n'est pas si compliqué que ça,
C'est plus compliqué que si c'était moins compliqué.
ça permet du code plus efficace,
Caml est aussi efficace que le C, la complication en moins.
et puis il y a moyen d'écrire assez facilement des librairies de chaînes de caractères qui réallouent automatiquement les buffers au fur et à mesure
Elles ne sont pas écrites, ou pas connues, ou pas standard. Bref.
Il n'est pas trop dur d'y prendre l'habitude.
Plus dur que si c'était fait intelligemment.
Et on peut souvent utiliser des parenthèses redondantes pour expliciter, par exemple: char (*x)[20]; contre char *(x[20]);.Dans le deuxième cas, la parenthèse n'est pas nécessaire, mais améliore nettement la lisibilité.
Il faut tuer les parenthèses.
Les parenthèses sont un fléau de l'informatique. D'ailleurs, dans caml, on en met le moins possible. Pourquoi écrire f(x) quand on peut se contenter de f x ? Un charme de plus de caml

Pas nécessairement. On peut optimiser sur mesure pour un processeur bien particulier (par exemple parce qu'on veut faire une version pour chaque processeur, comme le fait Littleboy pour ses binaires de GCC pour TIGCC optimisés en vitesse).
C'est plus efficace d'utiliser un compilateur rapide, comme caml, plutôt que de se faire ch*er à bidouiller pour chaque proc!

C'est quelque chose de bien, ça! Si tu fais quelque chose de sale, tu auras un warning. Tu es libre de corriger ton code pour éviter les warnings (GCC connaît même un switch pour toi: -Werror). Mais je ne vois pas pourquoi un compilateur doit forcer le programmeur à programmer de la manière qu'il juge propre. Un compilateur n'est pas un être intelligent, et il trouve souvent des saletés là où il n'y en a pas. Donc il fait bien mieux d'accepter le code avec un warning que de le rejeter juste parce qu'il pourrait y avoir une saleté.
Non.
L'informatique actuelle est ravagée aussi bien au niveau hard qu'au niveau soft par des programmeurs porcs qui n'en font qu'à leur tête et ne respectent pas les standards. Sur PC, le programmeur doit faire les choses proprement pour assurer la compatibilité, et parce que les processeurs sont conçus pour optimiser l'exécution des codes propres.
Le C est trop permissif, il faut sévir.
(Sur une calculatrice, la situation est différente)
Les programmes de l'IOCCC abusent de la flexibilité du langage C. Ça existera toujours, ce genre de trucs.
Parce que c'est dans la nature du C d'être sale.
Essaie un peu de faire ça en caml...
Tu n'as pas compris. Il y a des cas où ça peut donner du code généralement plus efficace. Par exemple, un compilateur qui, en cas de doûte, accepte du code où il juge (à tord) qu'une variable pourrait ne pas avoir été initialisée (ça m'est déjà arrivé), permettra ainsi au programmeur de ne pas initialiser sa variable inutilement, ce qui donnera à coup presque sûr du code plus efficace (en taille et en vitesse) quel que soit le processeur de destination.

qu'entends tu par "variable initialisée"?
(Je ne vois pas vraiment le rapport)
Ben alors le CAML n'est pas si sûr que tu le prétends...
1) On a le choix entre utiliser la librairie "sûre" et la librairie "rapide".
2) Je n'ai pas dit du tout que c'était un langage "sûr" (bien qu'il soit incontestablement *infiniment* plus sûr que le C). J'ai dit que c'était un langage PROPRE.
Mais comme tous les langages rapides et puissants, il est bien sûr possible de faire des choses non sûres. C'est assez difficile.
Vive les macros GNU ({ ... }), qui permettent de déclarer des variables temporaires à l'intérieur des macros et ainsi éviter les problèmes avec les effets de bords! On l'utilise à pas mal d'endroits dans TIGCCLIB, ld-tigcc et même le portage TIGCC de GCC.
moué, pourquoi pas...

c'est standard, en dehors de GNU?
C'est très pratique de pouvoir écrire *(x++)=...; en une seule ligne.
C'est pratique, inutile, et peu lisible.
Et en plus, ça correspond exactement au mode d'adressage (an)+ qu'on retrouve sur pas mal de processeurs.
Un compilateur digne de ce nom trouve tout seul le meilleur mode d'adressage. Le programmeur qui programme en langage TRUC n'a pas à s'occuper du hardware sous jacent (qu'il ne connait pas) mais à programmer en TRUC, point!
Il n'y a pas de surcharge d'opérateurs en C (pas ++). Il n'y a que les sens définis par le langage:
* sous forme d'opérateur binaire: multiplication
* sous forme d'opérateur unaire: déréférencement dans une expression, déclaration d'un pointeur dans une déclaration (cette "ambiguité" est là exprès parce que les déclarations miment le code utilisé par la suite pour accéder à la variable qu'on vient de déclarer; cette correspondance est très pratique à connaître quand il s'agit de lire une déclaration C) Je ne vois pas de grande ambiguité ici.
Passons sur l'utilisation de * dans les types, qui est normale uisque ce n'est pas le même contexte.
En C, la ou plutôt les fonctions * servent de multiplication entière, de multiplication réelle, de déréférencement. Trois usages différents, donc deux de trop.
Du point de vue du programmeur, c'est malpropre.
Du point de vue du compilateur, ce n'est pas très bon pour l'efficacité.
Sans compter les conneries du genre *=