11
votes

Le tableau hybride et la table de hachage de Lua; Est-ce qu'il existe ailleurs?

La mise en œuvre des tables de Lua conserve ses éléments en deux parties: une partie de la matrice et une partie de hachage.

Est-ce qu'une telle chose existe dans une autre langue?

Jetez un coup d'œil à la section 4, tables, dans La mise en œuvre de Lua 5.0 .

Code source Lua 5.1 - Tableau.c


0 commentaires

4 Réponses :


2
votes

La chose la plus proche que je puisse penser est JavaScript - vous créez un tableau avec New Array () , puis passez à l'index par numéro ou par valeur de chaîne. Cela pourrait bien être pour des raisons de performance Certaines implémentations JavaScript choisissent de le faire en utilisant deux tableaux, pour les raisons indiquées dans la documentation Lua que vous avez liée à.


0 commentaires

4
votes

Edit: Cela ne répond pas à la question, qui portait sur la mise en œuvre.

awk l'a également fait.

Il est interesturant comment certaines langues confèrent des opérations différentes dans d'autres:

  • indexation de la liste - A [10]
  • Indexation associative - A ['FOO']
  • Accès sur le terrain d'objet - a.foo
  • Appels de fonction / méthode - A ('foo') / a.foo ()

    Exemples très incomplets:

    • Perl est la langue rare où l'indexation séquentielle / associative a une syntaxe séparée - A [10] / a {'FOO'} . Afaik, champs d'objet Carte dans l'une des autres opérations, en fonction de la confidentielle de la classe ressentie comme en utilisant.

    • en python, les 4 sont distincts; Indexation séquentielle / associative Utilisez la même syntaxe mais les types de données distincts sont optimisés pour eux.

    • dans Ruby, les champs d'objets sont des méthodes sans arguments - a.foo .

    • dans JavaScript, champs d'objet A.FOO Syntaxe Sugar pour l'indexation associative A ['FOO']

    • dans Lua et Awk, des tableaux associatifs sont également utilisés pour l'indexation séquentielle - A [10] .

    • dans Arc , indexation séquentielle et associative ressemble à des appels de fonction - (a 10) / (un "foo") , et je pense que a.foo est le sucre de syntaxe pour cela aussi (?).


3 commentaires

La forteresse et le clojure traitent également des cartes comme des fonctions de leurs clés et des tableaux comme des fonctions de leurs indices. Qui, après tout, ils sont .


La question concerne la mise en œuvre, pas le modèle de langue. L'original awk, toujours entretenu par Brian Kernighan, utilise une table de hachage.


Vous avez raison, j'ai complètement manqué la marque! Ne peut pas descendre moi-même, donc +1 à votre réponse.



10
votes

Cette idée était originale avec Roberto Ierusalimschy et le reste de l'équipe Lua. J'ai entendu Roberto en discuter à l'atelier des langues légères du MIT en 2003 et, dans ce discours, il discutait des travaux antérieurs et argumenté de manière convaincante que l'idée était nouvelle. Je ne sais pas si d'autres langues l'ont copié depuis.

L'original awk a un modèle de langue quelque peu plus restreint que Lua; Soit un nombre ou une chaîne peut être utilisé comme clé dans un tableau, mais les tableaux elles-mêmes ne sont pas des valeurs de première classe: un tableau doit avoir un nom et un tableau ne peut pas être utilisé comme clé dans la matrice.

En ce qui concerne la mise en œuvre, j'ai vérifié les sources de l'original AWK comme maintenue par Brian Kernighan, et la mise en œuvre de AWK utilise une table de hachage, non pas la structure hybride / table hybride de Lua. La distinction est importante car en Lua, lorsqu'une table est utilisée avec des touches entières consécutives, la surcharge spatiale est la même que pour un tableau C. C'est pas vrai pour l'original awk.

Je n'ai pas pris la peine d'enquêter sur toutes les implémentations ultérieures d'AWK, par exemple, GNU AWK, MAWK, etc.


0 commentaires

0
votes

ArraywithHhash est une implémentation rapide de Hybrid hachage-hachisable en C ++.

Étant donné que C ++ est une langue typée de manière statique, seules les clés entières sont autorisées dans TRAYWithHhash (aucun moyen d'insérer une chaîne ou une clé de pointeur). En d'autres termes, c'est quelque chose comme un tableau avec la sauvegarde de la table de hachage pour les grands indices. En outre, il utilise une implémentation de table de hachage différente qui est moins efficace de la mémoire que la mise en œuvre de la table LUA.


0 commentaires