• [^] # Re: optimisation et propagation de constante

    Posté par . En réponse à la dépêche OCaml 4.06 et 4.07. Évalué à 3.

    Le problème n'est pas tellement sur le type de donnée: Flambda n'a aucun mal à transformer

    let c = Complex.( add { re = 2.; im = 0.} { re = 0.; im = 2. } )

    en une constante globale [| 2.; 2. |], pareillement dans le cas suivant

    let f x = 1 + x
    let rec map = function
     | [] -> []
     | [a] -> [f a]
     | [a;b] -> [f a; f b]
     | a :: q -> f a :: map q
    let y = map [3; 4]

    la liste y est transformée en deux constantes 4::* et 5::*.

    Le problème réside plutôt au niveau du flot d'instruction: si on tient à ce que la compilation se termine toujours, il devient nécessaire de pouvoir prouver qu'un code se termine avant de pouvoir l'évaluer durant la phase de compilation. Ce n'est pas possible en général sur un langage Turing-complet.

    La voie alternative suivie par MetaOCaml est d'être très explicite sur les phases de la compilation.

    De son côté le C++ a fait le choix de laisser le choix aux compilateurs la taille de la pile de récursion lors des calcul templates.