Je vais t'exposer un peu plus mon avis sur la question, même si je sais
bien que je vais pas te convaincre de quoi que ce soit, et je t'en
voudrais pas de pas lire ce que j'ai écrit.
Pour moi en software, on peut faire tout ce que l'on veut dans les
limites du hardware. On peut pas demander à un PC de faire du café. On
peut pas demander à un PC de faire des calculs plus vite que son
horloge processeur.
Partant de là, le langage permettant de tout faire est l'assembleur.
Peu importe le niveau d'abstraction que l'on ajoute au dessus, le
résultat final est toujours une suite d'instructions executées par le
processeur, donc traduisible en un programme assembleur. Donc à
la question "est-ce-qu'en ASM, on peut faire tout ce que ocaml fait ?",
je répondrais oui sans hésiter. Le source serait peut être 5000 fois
plus moche en ASM, que ce n'est pas mon problème. Il PEUT le faire.
Par contre, à la question "est-ce-qu'en C, on peut faire tout ce que le
ASM fait ?", je répondrais non. Car il y a des instructions ASM qui ne
sont pas reproduisible en pur C (sysenter, rdtsc, cpuid...).
Finalement je trouve qu'il y a deux problèmes : le
peut et le
aussi jolie.
Par exemple en C, on incrémente un pointeur simplement : i++.
On entend souvent dire que l'on ne
peut pas en Delphi.
On peut :
i:= Pointer(Integer(i) + SizeOf(Integer));
Mais c'est loin d'être
aussi jolie.
Par contre, l'ASM généré est strictement identique, et le créateur de
Delphi peut tout à fait argumenté sur les raisons pour lesquelles il
nous oblige à faire ça.
A l'inverse, en Java, on ne
peut pas (A ma connaissance) traduire le code que je t'ai proposé de traduire.
Ce code est beaucoup plus bourrin que ce qui est fait habituellement
avec les pointeurs : on attribue directement une valeur au pointeur :
12. Autrement dit, le pointeur pointe sur le 12ième octet de
l'adressage virtuel du processus. Autrement dit sur une zone ou l'on a
certainement pas le droit ni de lire ni d'écrire.
Aussi jolie ou pas, là n'est pas la question : on ne
peut
matériellement pas le faire en Java. Ce type de limitation est souvent
vécu comme une intense frustration. On sait que le hardware le permet,
mais le langage pas. On est dans une impasse, peu importe le temps que
l'on y passe et les moyens qu'on y mette. On ne peut pas forcer le
compilo Java à générer un code qui fera que la machine virtuelle Java
ira chercher ce douzième octet de la mémoire.
Donc pour reprendre le sujet...
"est-ce-qu'en C, on
peut faire tout ce que ocaml fait ?"
Ma réponse est a priori oui.
Car du peu que j'ai vu du caml, l'ensemble des combinaisons
instructions ASM générable par ce langage est inclus dans l'ensemble de
celles générables via le C.
(Je ne crois pas que la réciproque soit vrai, mais c'est vrai que c'est un autre débat)
Mais à la question :
"est-ce-qu'en C, on
peut faire tout ce que ocaml fait et de manière
aussi jolie ?"
Ma réponse est non, et bien sûr que non.
C'est ce qui fait les charmes des langages par rapport à l'ASM. Ils
permettent d'écrire de manière plus jolie, ou disont plutôt différente
(Jolie est fort subjectif

) certains algos ou l'ASM est "moins à l'aise".
C'est ce qui fait le charme de tous les langages les uns par rapport aux autres.