Pourquoi les concepteurs de ColdFusion ont-ils décidé d'indexer les tableaux à partir de 1 plutôt que de 0?

StackOverflow https://stackoverflow.com/questions/420510

  •  05-07-2019
  •  | 
  •  

Question

Je suis simplement curieux de savoir à ce sujet, est-ce que quelqu'un sait pourquoi ils ont enfreint la convention sur celui-ci?

Merci, Ciaran

Était-ce utile?

La solution

@Cory: Vous seriez surpris de savoir qui se cache sur StackOverflow. : -)

Vous avez vraiment raison. La conception initiale de CFML était de permettre aux non-programmeurs de créer des applications Web complexes. ColdFusion \ CFML est le premier langage conçu spécifiquement pour la création d’applications Web. En 1995, le Web était essentiellement du code HTML statique et votre "développeur Web" typique ne faisait pas trop de programmation. La langue elle-même a été conçue pour être aussi simple que possible. C’est pourquoi elle reste l’une des langues les plus rapides et les plus faciles à apprendre.

Cela peut entraîner une certaine confusion, en particulier lorsque le code ColdFusion interagit directement avec Java ou .NET. Cependant, il est juste devenu l'un de ces "bizarreries". La décision a été réexaminée en 2000/2001 lorsque CF a été reconstruite en tant qu’application Java EE, mais la compatibilité avec les versions antérieures a empêché la modification.

Autres conseils

Il existe deux conventions, celle commune à la plupart des langages de programmation et celle commune à la plupart des non-programmeurs. Ils visaient probablement les personnes qui ne comptent pas avec 0.

Si je devais deviner, c'est parce que ColdFusion avait pour but de faire appel au novice, et que les baies basées sur 1 auraient plus de sens - le premier élément est le numéro 1, le second est le numéro 2, etc.

Ce sont nous les informaticiens qui sommes bizarres!

Eh bien, à moins que nous n'ayons aucun des concepteurs d'origine, il sera difficile de faire autre chose que de spéculer. Mais ayant déjà eu recours à la mucoviscidose dans une vie antérieure, j'ai quelques idées.

Si vous examinez le langage d'origine, il a été conçu pour le développement de type RAD pour les personnes souhaitant créer des applications dynamiques sans grande complexité. Je me souviens encore de la joie quand ils ont finalement publié les fonctions définies par l'utilisateur, donc je n'ai pas eu à utiliser les balises partout.

Sur cette base, il serait alors logique que des aspects du langage que les gens doivent traiter - tels que les tableaux - ils se rendent plus "conviviaux". Pour moi, voir un tableau [0] est parfaitement logique. Mais pour les nouveaux venus au paradigme qui ne l'ont pas appris, cela n'aurait aucun sens. Pourquoi devrais-je accéder à un objet à la position "0"?

Ce qui est amusant, c’est que, maintenant que CF est Java dans le backend, vous devez réellement traiter les cas où votre index commence à 1 et les cas où il commence à 0. Donc, en essayant d’être utiles, ils ont en fait ajouté plus de complexité que la langue a grandi.

Comptez le nombre de doigts que vous avez sur une main. Avez-vous commencé à compter avec 0 ou avec 1?

Les idées abstraites très proches de la vie réelle sont toujours plus faciles à comprendre et à appliquer (par exemple: pensez à une "pile" physique, puis à la structure abstraite des données).

Pour en revenir au problème, demandons-nous pourquoi, dans certaines langues, l'index de tableau commence à zéro? Pour compter des objets discrets (comme des éléments de tableau), cela n'a pas de sens et n'est pas naturel du point de vue humain.

Cela semblait à l'origine provenir de langages tels que C (bien que je ne suggère pas que cela vienne d'abord de C: je ne sais pas, et cela n'a pas d'importance pour les besoins de cela) dans lequel le langage et sa programmation est plutôt étroitement liée à la gestion de la mémoire ( malloc , etc.). Certaines conceptions du langage C correspondent assez étroitement à ce qui se passe dans la mémoire sous le capot. Les variables en sont un exemple: outre les noms de variable, nous nous occupons toujours de l'adresse de mémoire de la variable (ou commence à ) avec des pointeurs et autres.

Nous arrivons donc aux tableaux en C, et ceux-ci sont indexés de telle sorte qu'il existe une série d'éléments résidant en mémoire, commençant à l'emplacement de la mémoire de base de la variable tableau, et que chaque élément est décalé de la taille de le type de données (par exemple: un caractère est un octet, etc.). Pour trouver chaque élément du tableau en mémoire, procédez comme suit:

arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)

Et on se trouve vraiment en train de penser de la sorte quand on fait des choses en C, parce que cela correspond assez étroitement à ce que l’ordinateur doit faire sous le capot pour trouver la valeur que le code veut.

Le whichElementItIsInTheArray est donc utilisé pour décaler l'adresse mémoire (en unités de sizeOfDataType ).

Évidemment, si on commence l'index de tableau à 1, il serait décalé en mémoire d'un sizeOfDataType , gaspillant une quantité de mémoire sizeOfDataType entre le arrayBaseAddress et l'emplacement actuel du premier élément.

On pourrait penser que cela importe peu, mais jadis, lorsque tout cela était mis en œuvre, la mémoire était comme l’or: elle ne pouvait pas être gaspillée de la sorte. Donc, on pourrait penser "OK, eh bien, il suffit de compenser whichElementItIsInTheArray par -1 sous le capot, et cela sera fait. Cependant, à l'instar de la mémoire, les cycles d'horloge sont dorés, donc au lieu de gaspiller le traitement, l'idée était que le programmeur aurait juste besoin de s'habituer à une méthode de calcul non naturelle.

Il y avait donc une raison légitime de démarrer des tableaux à l'indice zéro dans ces situations.

Il me semble (et cela commence à prendre une tournure éditoriale maintenant) lorsque les "accolades" suivantes ont été ajoutées. les langages sont sortis (comme Java), ils ont simplement suivi, qu’ils soient toujours pertinents ou non, parce que "c’est comme ça". Plutôt que "cela a du sens".

D’autre part, les langages plus modernes et ceux qui sont plus éloignés du fonctionnement interne de l’ordinateur, quelqu'un s’est arrêté de penser "pourquoi faisons-nous cela?" et "dans le contexte de ce langage et de ses utilisations prévues, cela a-t-il un sens? ". Je conviens ici que la réponse est - fermement - "non". Le gaspillage de ressources pour compenser l'index de tableau par -1 ou simplement pour ignorer la mémoire de l'élément zéro n'est plus une considération pertinente dans de nombreuses circonstances. Alors pourquoi faire en sorte que le langage et le programmeur doivent compenser la manière dont ils comptent naturellement les choses d’une unité, pour une raison purement héritée? Il n'y a aucune raison légitime de le faire.

En C, il y a un élément d'un tableau a [0] . Il s'agit du premier élément du tableau (et non de l'élément "zeroth"), et si c'est toute l'étendue du tableau, sa longueur est one . Donc, le comportement idiosyncratique ici est de la part du langage de programmation, pas de la manière dont les choses sont comptées / énumérées "dans la vie réelle" (qui est où la plupart d'entre nous résident). Alors pourquoi persister avec?

Certaines personnes ici se sont opposées à cette question "par où commencer l'index". argument avec "bien quand nous sommes nés, nous ne sommes pas un, nous sommes zéro". C'est vrai, mais c'est mesurer une chose continue, et ce n'est pas la même chose. Donc est sans rapport avec la conversation. Un tableau est un ensemble d’éléments discrets. Lorsque vous mesurez la quantité d’éléments discrets (c’est-à-dire que vous les comptez), nous commençons par un.

Comment cela ajoute-t-il à la conversation? Eh bien, ce n’est pas beaucoup, mais c’est une façon différente de regarder la même chose. Et je suppose que c'est un peu une rationalisation / réaction à cette idée que certaines personnes pensent que les index de tableaux de départ à 1 sont en quelque sorte "erronés". Ce n'est pas faux, d'un point de vue humain, c'est plus juste que de les commencer à zéro. Alors, laissez l’humain écrire le code comme un humain, et demandez à la machine de le comprendre comme il se doit. Fondamentalement, ce n’est que pour les limitations technologiques héritées que nous avons commencé à les compter à partir de zéro, et il n’est pas nécessaire de perpétuer cette pratique si nous n’en avons plus besoin.

Tous les "IMO", bien sûr.

La notion de tableaux de départ à 0 a été popularisée avec le langage C. Les langages plus anciens tels que FORTRAN et COBOL ont commencé à compter les tableaux à 1 (en réalité appelés Tableaux en COBOL).

Il n'y a pas de convention sur le point de départ d'un tableau. La plupart des bases commencent à 1 également. Certaines langues vous permettent de démarrer le tableau où vous le souhaitez ou d'autoriser les index de tableaux à être des énumérations, etc. (Ada par exemple). C a utilisé la notion de piqûre à 0 et de nombreuses langues ont suivi, mais pas toutes. Une des raisons pour lesquelles ils ne le font pas est que les tableaux commençant par 1 sont beaucoup plus intuitifs.

Même dans le monde de la programmation des API Java, il existe une exception intéressante: le comptage basé sur 0: l’API JDBC. Cela commence à compter avec 1, à la grande surprise de chaque programmeur effectuant son premier accès à la base de données.

Peut-être que ce n'était pas juste un truc de profane ... Je pense que la plupart des gens approchant un langage Web ont au moins tripoté le javascript (il en était de même il y a 10,15 ans). Les index basés sur 0 n'étaient pas aussi étrangers.

Ce que j'aime des langues commençant par un index / une position (pour les chaînes) en 1, c'est que vous pouvez faire des choses comme

<cfif find("c","cat")>

qui renvoie true si c est trouvé, et ce sera.

alors qu'un langage basé sur 0 comme javascript

if ("cat".indexOf("c")) { 

renvoie false , vous devez donc indiquer quelque chose comme if ("cat" .indexOf ("c") > = 0) {

Cependant, la traduction entre les langues est une gêne mineure qu'il ne faut pas oublier, car ne pas le faire, ou oublier de remplir vos tableaux peut entraîner une défaillance de la traduction des données, et le passage d'un style à l'autre peut être frustrant. .

Je pense que si Allaire savait où le Web serait finalement et comment le client et le serveur peuvent vraiment fonctionner ensemble, nous aurions des index basés sur 0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top