Y a-t-il une raison pour laquelle le premier élément d'un tableau Zsh est indexé par 1 au lieu de 0?

27

D'après mon expérience avec les langages de programmation et de script modernes, je pense que la plupart des programmeurs sont généralement habitués à faire référence au premier élément d'un tableau par 0 comme index.
Y a-t-il des avantages substantiels à utiliser 1 ?

Je suis sûr que j'ai entendu parler de plus de langues autres que Zsh se comportant de manière similaire avec les tableaux; c'est bien pour moi, car c'est tout aussi pratique.
Cependant, comme les langages de script shell déjà publiés et largement utilisés tels que ksh et bash utilisent tous 0, pourquoi quelqu'un choisirait-il de modifier ce "standard" commun?

Ma réponse immédiate à ma question serait «bien sûr que non»;
alors, la seule explication à laquelle je peux penser concernant cette "fonctionnalité exclusive" aux shells serait " ils ont juste fait ça pour montrer un peu plus leur cool shell ".

Je ne connais pas grand-chose ni à Zsh ni à son histoire, et il y a de fortes chances que ma théorie triviale à ce sujet n'a aucun sens.

Y a-t-il une explication à cela? Ou est-ce simplement par goût personnel?

deekin
la source
5
Quelques recherches historiques (ou rumeurs déchaînées?) Sur le thème du 0 contre 1: exple.tive.org/blarg/2013/10/22/citation-needed
jusqu'au
Pour une raison historique, cela vient probablement de csh, qui a également utilisé une indexation de tableau à base unique.
cuonglm
3
de nos jours, sh est un langage standard (pas une implémentation) qui a différents interprètes possibles. Certains de ces interprètes pour le langage sh comme bash, ksh et yash prennent en charge les tableaux en tant qu'extension, mais ils ne font pas partie du langage comme gcc, un compilateur pour le langage C standard prend en charge les extensions par rapport au langage C standard. Et tout comme pour C, il n'y a pas d'implémentation "officielle" d'un interprète "sh".
Stéphane Chazelas
1
Liés - Commentaires dans cette réponse de PPCG
Digital Trauma
4
Peut-être un peu hors sujet, mais pertinent. Les Romains utilisaient le comptage inclusif, en partant d'un au lieu de zéro. Après-demain, pour nous "deux jours d'avance", c'était pour eux "trois jours d'avance". Ils comptaient aujourd'hui comme un, pas zéro. En conséquence, lorsque leurs astronomes égyptiens ont recommandé un jour bissextile tous les quatre ans, les Romains l'ont introduit tous les trois ans, à partir de 45 avant notre ère. Il a fallu attendre 12 avant notre ère pour que l'erreur soit corrigée.
Harry Weston

Réponses:

32
  • Pratiquement tous les tableaux shell (Bourne, csh, tcsh, fish, rc, es, yash) commencent à 1. ksh est la seule exception que je connaisse (bash vient de copier ksh).
  • La plupart des langues interprétait à l'époque (début des années 90): awk, tclau moins, et les outils généralement utilisés de la coque ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) commencent à 1. sed, ed, vinombre de leurs lignes de 1 ...
  • zsh prend le meilleur du shell Bourne et de csh. Le tableau shell Bourne $@commence à 1. zsh est cohérent avec sa gestion de $@(comme dans Bourne) ou $argv(comme dans csh). Voyez à quel point il est déroutant dans ksh${@:0:1}ne vous donne pas le premier paramètre de position par exemple.
  • Un shell est un outil utilisateur avant d'être un langage de programmation. Il est logique que la plupart des utilisateurs disposent du premier élément $a[1]. Cela signifie également que le nombre d'éléments est le même que le dernier indice (en zsh comme dans la plupart des autres shells sauf ksh, les tableaux ne sont pas rares).
  • a[1]pour le premier élément est cohérent avec a[-1]pour le dernier.

Donc, OMI, la question devrait plutôt être: qu'est - ce qui est entré dans la tête de David Korn pour que ses tableaux commencent à 0?

Stéphane Chazelas
la source
7
C'est un bug dans les langues humaines que la numérotation est basée sur un, et un heureux hasard que la plupart des langages de programmation ont réussi à garder cet héritage hors de leur conception. C'est d'autant plus triste que, après que l' indexation de base zéro ait été virtuellement établie comme standard, de nombreuses langues «orientées utilisateur» l'ont rétrogradé, essayant d'être «plus simple» en utilisant à nouveau l'indexation de base erronée . - Cela dit: le meilleur moyen d'éviter toute confusion d'indexation est bien sûr d'éviter entièrement les indices numériques.
leftaroundabout
Lire ici: "Lorsqu'il s'agit d'une séquence de longueur N, dont nous voulons distinguer les éléments par indice, ... a) donne, en commençant par l'indice 1, la plage d'indices 1 ≤ i <N + 1; en commençant par 0, cependant, donne la meilleure plage 0 ≤ i <N . " . Je ne sais pas si TROLL ou STUPID, mais vous pouvez utiliser "1 ≤ i ≤ N" pour les indices commençant par 1 sur les tableaux. Il n'est pas nécessaire de mettre ce +1 à la fin de l'analyse du tableau, et aucun des points de vue ne prouve que les index de départ avec 1 ou 0 sont meilleurs.
1
Vous pouvez soit justifier que 0 a été ajouté APRÈS la connaissance humaine, et cela a quelque peu gâché les choses cette fois-ci. theguardian.com/notesandqueries/query/0,5753,-1358,00.html - Encore une fois, juste une question de point de vue :)
3
Le tableau shell Bourne $ @ commence à 0 (pas 1) $ 0 est le nom du programme que vous exécutez. vous devriez corriger votre troisième point
Edward Torvalds
2
@edwardtorvalds, Non, $0n'est pas un paramètre de position. Cela ne fait pas partie de $@. "$@"est "$1" "$2" .... En ce qui concerne les fonctions, dans de nombreux shells, vous voyez que ce "$@"sont les arguments de la fonction, tout en $0restant le chemin du script (ou shell argv [0] lorsque vous n'exécutez pas de script)
Stéphane Chazelas
7

Je pense que la réponse la plus plausible à cela est le tableau inversé intégré de zsh

Si vous avez un tableau avec 4 éléments, disons myvar=(1 2 3 4)et vous voulez accéder au 4ème élément, ce sera print $myvar[4], non?

Cependant, si vous voulez créer une boucle qui listera les éléments à l'intérieur de ce tableau à l'envers, il suffit d'utiliser des index négatifs:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

Cela devrait expliquer car à partir de zéro, vous n'atteindrez pas l'un de ces éléments car il n'y en a pas -0.

La deuxième raison derrière cela est probablement que le code C lié aux variables sur zsh utilise intou double intpour définir des index de tableau, et puisqu'il utilise Two's Complement pour représenter des nombres négatifs, il n'y a aucun moyen de représenter -0( Signé zéro ), comme vous pouvez le faire sur float variables ponctuelles.

Si vous êtes vraiment habitué aux index commençant à 0, je vous suggère d'utiliser l' KSH_ARRAYSoption pour résoudre ce problème.

Et en prenant le crochet du commentaire @cuonglm, les cshfonctionnalités implémentées zshsont expliquées ici . Cela ne semble pas être une raison historique mais un moyen de fournir un environnement de travail confortable à ceux qui sontcsh


la source
3
Ensuite, cela devrait vous faire accéder au premier et au dernier éléments du tableau en même temps, brisant toute la logique de l'analyse d'un tableau;) Pourrait même créer un trou noir. LOL
3
pour les tableaux indexés sur 0, remplacez le -par ~.
mikeserv
1
@mfxx - je parlais bash. Je pense qu'il gère les indices négatifs pour les éléments définis comme du sucre de syntaxe, mais ne le fait pas autrement. ne me souviens pas. de mon point de vue, les gens devraient simplement créer un répertoire et utiliser des fichiers pour tout ce qu'ils fourrent dans tout cet état shell. vous pouvez indexer ces éléments comme bon vous semble.
mikeserv du
1
~est l'inversion binaire. ~0est -1. (tous les bits retournés, dépendent de la façon dont les nombres négatifs sont généralement représentés par bits). Sur un tableau non défini ou un tableau avec un seul élément d'indice 0, un [0], un [-0], un [-1] et un [~ 0] vous donneront la même chose dans un tableau de type ksh.
Stéphane Chazelas
1
@ StéphaneChazelas - ouais, je pense que je me souviens avoir manipulé ça avec ~quand ça -indexn'a pas marché. Je suppose que tout ce que j'ai fait est probablement ~-index. Ouais. ça sonne bien. Oui! et bien sûr, cela fonctionne aussi pour les éléments non définis. donc je suppose que le commentaire ci-dessus devrait être - pour les tableaux indexés 0, ajoutez ~ . je suppose qu'il a juste géré la partie -1 plus facilement peut-être. je ne sais pas. ce n'est pas sauter au premier plan de ma mémoire pour le moment ...
mikeserv