web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de tables de hachage dans la bibliothèque standard C?

Pourquoi n'y a-t-il pas de prise en charge de Hashtable dans le cadre de la bibliothèque C standard? Y a-t-il une raison spécifique à cela?

47
Shankar Raju

Il n'y a pas de table de hachage dans la bibliothèque C standard car:

  • personne n'a soumis de proposition au groupe de travail; ou
  • le groupe de travail l'a jugé inutile.

C'est ainsi que fonctionne l'ISO. Les propositions sont présentées et acceptées ou rejetées.

Vous devez faire attention à ce que vous ajoutez à la bibliothèque standard car vous avez deux groupes en conflit. En tant que utilisateur, vous souhaiterez peut-être que chaque structure de données sous Sun soit ajoutée à la norme pour rendre le langage plus utile.

Mais, en tant que langue implémenteur (en passant, ce sont probablement les personnes qui tendent à constituer la plupart des divers groupes de travail, de sorte que leur point de vue est susceptible d'avoir plus d'impact), vous ne ' Je ne veux vraiment pas les tracas d'avoir à implémenter des choses qui ne peuvent pas être utilisées par tout le monde. Tout ce qui existait lorsque C89 est apparu était lié au fait que l'objectif principal était de codifier la pratique existante plutôt que d'introduire de nouvelles pratiques. Toutes les itérations des normes ont depuis lors été un peu plus libres dans ce qu'elles peuvent faire, mais la compatibilité descendante est toujours un problème important.

Moi-même, j'ai aussi des conflits. J'adorerais avoir toutes les fonctionnalités des bibliothèques Java, C++ ou Python à ma disposition en C. Bien sûr, cela rendrait tellement plus difficile de tout apprendre pour les nouveaux arrivants et, comme un commentateur a déclaré, faites probablement en sorte que tout singe code puisse pomper du code utile, réduisant ainsi ma valeur dans le processus :-)

Et j'ai à peu près avoir toutes les structures de données dont j'aurai besoin, de ma longue et (surtout) illustre carrière. Vous n'êtes pas limité à la bibliothèque standard pour ce genre de choses. Il existe de nombreux outils tiers que vous pouvez obtenir pour faire le travail et (comme moi), vous pouvez également lancer le vôtre.

Si vous voulez savoir pourquoi certaines décisions ont été prises à chaque itération, l'ISO (et l'ANSI à l'origine, avant l'ISO) publie généralement des documents de justification. Le C89 de ANSI peut être trouvé ici . Il contient cette petite beauté dans la portée:

Cette justification se concentre principalement sur les ajouts, les clarifications et les modifications apportées à la langue, comme décrit dans les documents de base. Ce n'est pas une justification pour la langue C dans son ensemble: le Comité a été chargé de codifier une langue existante, pas d'en concevoir une nouvelle. Aucune tentative n'est faite dans cette justification pour défendre la syntaxe préexistante du langage, telle que la syntaxe des déclarations ou la liaison des opérateurs.

J'apprécie particulièrement l'admission qu'ils ne sont pas responsables de tout désordre impie qui pourrait avoir précédé leurs tentatives de normalisation.

Mais, peut-être que la vraie réponse à votre question réside dans ce morceau, l'un des principes directeurs:


Gardez l'esprit de C. Le Comité a gardé comme objectif majeur de préserver l'esprit traditionnel de C. Il y a plusieurs facettes de l'esprit de C, mais l'essentiel est un sentiment communautaire des principes sous-jacents sur lesquels le langage C est basé. Certaines des facettes de l'esprit de C peuvent être résumées dans des phrases comme:

  • Faites confiance au programmeur.
  • N'empêchez pas le programmeur de faire ce qui doit être fait.
  • Gardez la langue petite et simple.
  • Fournissez une seule façon de faire une opération.
  • Faites vite, même s'il n'est pas garanti d'être portable.

Ce troisième est probablement la principale raison pour laquelle la bibliothèque n'a pas été massivement agrandie avec l'effort de normalisation initial - cela, et le fait qu'une telle expansion d'un comité aurait probablement entraîné l'ANSI C sous le nom de C2038 plutôt que C89.

39
paxdiablo

C semble inhabituel par rapport aux normes actuelles car il n'y a pas de structures de données utiles définies. Aucun. Pas même des chaînes - et si vous pensez qu'une chaîne C est une structure de données, eh bien, nous devrons être en désaccord sur ce qu'est une "structure de données".

Si vous aimez C, alors considérez-le comme une "ardoise vierge" ... toute votre application est faite de code écrit par vous et des bibliothèques que vous choisissez d'extraire, plus quelques fonctions de bibliothèque standard assez primitives, avec peut-être une ou deux exceptions comme qsort. De nos jours, les gens utilisent C pour implémenter des choses comme Python, Ruby, Apache ou le noyau Linux. Ce sont des projets qui utilisent toutes leurs propres structures de données de toute façon, et ils ne sont pas susceptibles d'utiliser quelque chose comme la STL.

De nombreuses bibliothèques C implémentent des tables de hachage génériques. Il y a des compromis et vous pouvez choisir votre favori. Certains d'entre eux sont configurables à l'aide de rappels.

  • Glib a un objet de table de hachage ( documentation )
  • Apache Portable Runtime a une table de hachage ( documentation )
  • La bibliothèque Core Foundation d'Apple a une table de hachage ( documentation ) Remarque: Oui, vous pouvez insérer n'importe quel objet comme clé ou valeur.
  • UTHash est une bibliothèque de tables de hachage ( documentation )
  • Une autre bibliothèque de tables de hachage ( link )

Avec toutes ces bibliothèques qui font ce que vous voulez, quel est l'intérêt d'ajouter une table de hachage à la norme C?

45
Dietrich Epp

La bibliothèque C standard ne comprend pas n'importe laquelle de grandes structures de données persistantes - ni listes, ni arborescences, ni piles, ni tables de hachage.

Il n'est pas vraiment possible de donner une réponse définitive sans demander aux auteurs de la bibliothèque C d'origine. Cependant, une explication plausible est que la mise en œuvre de telles structures de données implique divers compromis, et seul l'auteur de l'application est en bonne position pour faire ces compromis.

Notez que la bibliothèque C standard POSIX spécifie des fonctions de hachage génériques: hcreate(), hsearch() et hdestroy(); et notez aussi que leur nature "taille unique" tend à les rendre inadéquats pour la plupart des cas d'utilisation du monde réel, soutenant l'argument ci-dessus.

10
caf

En raison du manque de modèles

C'est une supposition, mais ne pas avoir de modèles dans le langage comme C++ rend l'implémentation des conteneurs très inélégante, car vous auriez besoin de dizaines de définitions pour couvrir tous les types possibles, sans parler des types définis par l'utilisateur.

Il existe des stratégies C pour atténuer cela, comme jouer avec void *, mais ils perdent les vérifications de type de temps de compilation.

GLib et gnulib sont mes implémentations recommandées pour le moment: moyen rapide d'implémenter le dictionnaire en C