php fait du C.O.W sur les string et ses tableaux (php array = une mapped hash table).
Merci d'avoir confirmé. Par contre pour les tableaux, ça doit plutôt être une ahsh map + une liste chaînée, sinon les éléments ne resteraient pas en ordre.
Un gros avantage de l’immuabilité aussi est que c’est intrinsèquement thread-safe. Si personne ne peut modifier une variable, la partager ne pose jamais
de problème. C’est bien pour ça que beaucoup de gens prévoit que le paradigme fonctionnel finira par s’imposer.
Très juste, bien vu pour le thread safe.
Par contre, limmuabilité a des limites à mon avis. Devoir recopier entièrement un tableau/liste/vector/ArrayList à chaque fois qu'on ajoute ou suppprime un élément, ça peut finir par coûter cher en performances.
C'est pour ça qu'en général les implémentations de tableaux dynamiques font des allocations à l'avance. Et c'est aussi pour ça que pour des manip caractère par caractère sur les strings, on a une autre classe genre StringBuffer.
Et j'ose imaginer que recopier un set ou une map c'est encore plus coûteux.
Le but du jeu pour l'avenir, ça va être de réussir à déterminer ce qui peut être muable, et ce qui vaudrait mieux ne pas l'être, selon comment on utilise tel ou tel objet dans le programme, si c'est destiné à être partagé/parralélisé ou non…
les langages fonctionnels sont-ils capables de choisir la meilleure stratégie à chaque fois ? ou bien il font systématiquement de la copie ?
Je n'arrive pas à faire la différence entre un langage "interprété", "semi interprété" ou "compilé".
Dans ton message, tu sembles inclure Java dans les non compilé (ou semi interprété) alors qu'il est statiquement compilé et qu'il a même des élément de compilation à la volée en code natif.
PHP est compilé à chaque fois sauf si tu active ZO+ (inclus par défaut), et possède de plus en plus d'éléments de compilation à la volée.
pour python, tu as cython qui compile python de la même manière il me semble.
Bref, je ne comprends pas.
Ce genre de truc est souvent sujet à débat et les frontières se font de plus en plus floues, mais mon classement est le suivant :
- Compilé pour moi ça veut dire convertir directement du code source en langage machine ou très proche. Ici je mets évidemment C/C++.
- Semi-compilé ou semi-interprété pour moi ça veut dire compiler depuis un code source vers un code intermédiaire (bytecode), visible/sauvegardable par l'utilisateur ou non d'ailleurs, puis, à l'exécution, interprétation du bytecode. Le JIT c'est du bonus à part. Ici je classe en fait à peu près tous les autres langages: Java, C#, php, python, lua, ruby, javascript…
- Interprété pour moi c'est pas de conversion en bytecode du tout, le code source est simultanément lu et exécuté. Aujourd'hui, je ne connais plus beaucoup de langages qui ne passent pas par l'étape bytecode…