• [^] # Re: Joli

    Posté par (site web personnel) . En réponse à la dépêche Le langage ooc auto-hébergé - les nouveautés de rock 0.9.0. Évalué à 8.

    Je ne connaissais pas vraiment Lissaac mais il semble que ce soit un langage orienté prototype, c'est à dire qu'au lieu d'avoir une hiérarchie de classes, on peut cloner un objet et lui ajouter des méthodes. Cela semble plus dynamique que de l'ooc - donc forcément, avec un coût à l'exécution =) Mais intéressant tout de même.

    Effectivement, il est à prototype et héritage multiple, donc le parent s'affecte comme un slot normal que tu peux changer ou tu veux dans le code. Le parent a une existence physique propre (ou pas, car il y a 4 formes d'héritages différents en Lisaac).

    Concernant le coût du dynamisme, il n'y en a pas, d'une part parce que le compilateur n'utilise pas de VFT contrairement au votre *
    Lisaac** utilise des branchements dichotomiques, et transforme 99,6% (mesuré sur le compilateur, 400 000 appels, de l'héritage statique et dynamique dans tous les sens) des appels polymorphique en appel statique.
    Conclusion : tu n'as aucun cout pour le dynamisme. Et heureusement parce que dans ce langage, le if est un point de liaison dynamique, ne pas le faire serait catastrophique.

    Les VFT c'est lent, et ça a un cout énorme à l'exécution car :

    - Tu ne peux inliner
    - Le processeur ne peut pas optimiser car tu fais un jump indirect sur du code
    --> Tu dois garder tout tes objets en mémoire
    --> Certains objets ne peuvent décemment pas l'être pour des raisons de perfs. Par exemple, dans IsaacOS, et dans la GUI de la lib lisaac, par exemple, PIXEL est un objet, qui a des enfants PIXEL_16, PIXEL_8, PIXEL_32, etc.... Avec un modèle à VFT comme dans ooc, ça ruine les performances, parce que ça t'oblige à utiliser des VFT pour chaque appel de fonction sur tes pixels...

    Conseil : regarde ce qu'a fait Dominique Colnet dans son smarteiffel : c'est implémentable en ce qui vous concerne, parce que l'algorithme d'analyse de flot de Lisaac, c'est une autre paire de manche (surtout que votre langage est gros, ce qui simplifie pas la tâche).

    Et bon courage, parce que je sais de quoi je parle, et ça rend solidaire ;-)


    *
    Ce code :
    Animal: abstract class {
    shout: abstract func
    }

    Dog: class extends Animal {
    shout: func { "Woof, woof!" println() }
    }

    Cat: class extends Animal {
    shout: func { "Meoooww!" println() }
    }

    poke: func (animal: Animal) {
    animal shout()
    }

    poke(Dog new())
    poke(Cat new())

    Donne lieu à une VFT dans le C produit :

    void test__Animal_shout(test__Animal* this) {
    ((test__AnimalClass *)((lang_types__Object *)this)->class)->shout((test__Animal*)this);
    }


    **C'est expliqué ici http://www.dailymotion.com/video/xba8ij_1-8-presentation-du-(...) ou dans les suivantes.
    Tu as la vidéo des JM2L aussi, plus courte et synthétique.

    « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker