Qual è l'origine del conteggio da zero nei linguaggi di programmazione?

6

Questa è una domanda che mi sono chiesto (e che mi è stato chiesto) a lungo.

In (la maggior parte?) tutti i linguaggi di programmazione, un indice inizia da zero per un array, una stringa, ecc. Riconosco che è diventato convenzione nel tempo, adottato in molte lingue, ma qualcuno può indicare l'origine di questo?

Ho pensato, forse, che avesse a che fare con il fatto di essere tutti radicati in binario. Ma non sono sicuro dell'idea che porta alla necessità nel sistema decimale - perché non iniziare un indice da 1?

Qualcuno ha una conoscenza storica dei linguaggi di programmazione in cui la decisione di iniziare gli indici a zero potrebbe essere stata spiegata?

Grazie!

EDIT: Gli scritti di Dijkstra sono ulteriormente utili da un punto di vista matematico, ma ha anche notato che non tutte le lingue sono indicizzate a zero. La spiegazione di WBT ha anche senso sul perché si dovrebbe iniziare con zero in base agli indirizzi di memoria. (So che alcune lingue gestiscono l'indicizzazione leggermente diversa in base alla manipolazione dell'array.)

Non sono necessariamente alla ricerca del perché (che apprezzo molto perché aiuta a capire meglio) ma più sulla falsariga di quando è diventato questo convenzione e / o se può essere rintracciata in una lingua specifica.

Quindi, per esempio in K & R's C, quando si discutono gli indici di array, K o R spiega in modo pratico, "Gli indici di matrice iniziano sempre a zero in C ..." (p.22) Successivamente, discutendo una funzione per elaborare array di caratteri, "... una progettazione più utile sarebbe quella di restituire la lunghezza della linea, o zero se si incontra la fine del file. Zero è un ritorno accettabile di fine file perché non è mai valido lunghezza della linea. " (p 127)

Sulla base di K & R, raccolgo a) la convenzione viene adottata da altrove, quindi C non è l'ispirazione dietro lo zero-indexing eb) ci sono forse ragioni più profonde per il suo uso basato sul secondo esempio. So che K & R è così ampiamente considerato per la sua chiara prosa, quindi questo è un altro motivo per includerlo, per dare un esempio di ciò che speravo che un altro linguaggio documentato facesse per spiegare il motivo alla base dell'indicizzazione dello zero.

Penso che sia WBT che btilly offrono altrettanto buone ragioni; Mi chiedevo se qualcuno che forse conoscesse vecchie (pre-C?) Lingue che documentassero la decisione progettuale. E allo stesso tempo riconosco che tali informazioni potrebbero non esistere.

    
posta gnat 10.05.2016 - 01:26
fonte

4 risposte

10

Riguarda gli offset. Hai un indirizzo, che punta alla posizione in memoria dove inizia la matrice. Quindi per accedere a qualsiasi elemento, moltiplica l'indice della matrice per la dimensione dell'elemento e lo aggiungi all'indirizzo iniziale, per trovare l'indirizzo per quell'elemento.

Il primo elemento è al punto di partenza, quindi moltiplichi la dimensione dell'elemento per zero per ottenere zero che è ciò che aggiungi all'indirizzo iniziale da trovare la posizione del primo elemento.

La convenzione si è diffusa perché i programmatori iniziarono a lavorare in linguaggi di livello molto basso dove gli indirizzi di memoria venivano manipolati direttamente e nella maggior parte dei casi si costruivano da lì, mantenendo la stessa convenzione ad ogni passaggio in modo che non dovessero reimparare o essere inclini agli errori quando si passa da una convenzione all'altra. È comunque importante capire in che modo questo indirizzamento funziona soprattutto quando si lavora con linguaggi di livello inferiore. Sono d'accordo che questo può essere un ostacolo per le persone che stanno imparando a programmare in un linguaggio di livello superiore.

L' articolo di Wikipedia su questo argomento cita anche un'istruzione macchina comune usata quando si lavora "all'indietro" e rilevare la fine di un ciclo, ovvero "decrementa e salta se zero".

Un'eccezione: MATLAB e alcune altre lingue contrastavano la tendenza e andavano con un indice che inizia a 1, apparentemente con l'impressione che sarebbe un primo linguaggio di programmazione per molti dei loro utenti target e che per quelli, a partire da 1, ha un senso più intuitivo. Ciò provoca alcune frustrazioni per i programmatori (relativamente piccoli di?) Che passano frequentemente da un linguaggio di programmazione all'altro che inizia il conteggio a valori diversi.

    
risposta data 10.05.2016 - 01:29
fonte
3

L'affermazione "Nei (più? tutti?) linguaggi di programmazione, un indice inizia da zero" non è semplicemente corretto. Quelle lingue il cui retaggio deriva formalmente o informalmente da C segue questa convenzione. Altri no.

C è stato così perché C era fondamentalmente inteso come un assemblatore di "alto livello". Ha imposto un onere equo al carico di lavoro del programmatore, laddove in altre lingue il compilatore e la macchina eseguivano il sollevamento pesante. Nel momento in cui è stato sviluppato C, il conteggio basato su 1 era la norma, ma richiedendo al compilatore di tenere traccia di quello stupido extra 1 era considerato troppo lavoro per il compilatore.

C ++ lo ha ottenuto da C a causa del requisito che C ++ sia compatibile con le versioni precedenti (alcuni potrebbero dire compatibili con i bug) con C. Java lo ha ottenuto da C. Lingue sviluppate dai programmatori C senza alcuna esposizione significativa a qualsiasi altra cosa copiata C, perché entrambi volevano essere popolari con altri programmatori C o non conoscevano nessun altro modo per farlo.

FORTRAN, che precede quasi tutto il resto, è iniziato all'1, perché ingegneri, matematici e scienziati hanno iniziato a contare da 1 a mille. (Ciò consente un algoritmo molto conciso, molto bello per il problema delle 8-queens.) MATLAB ha copiato FORTRAN, poiché era destinato quasi alla stessa comunità di utenti.

PASCAL richiede in realtà al programmatore di dire da dove inizia e termina, permettendo di definire, per esempio, e array i cui indici vanno da, diciamo, da -7 a +7. Ada ha seguito PASCAL. (Menzionare Ada dovrebbe essere buono per almeno tre downvotes proprio lì.)

Credo che COBOL sia iniziato all'1, ma non ricordo per certo, e non ho intenzione di rinfrescare alcuni ricordi molto dolorosi, perché i contabili, come ingegneri, scienziati e matematici, iniziano a contare a 1.

È il mio lontano ricordo che PL / I ti ha permesso di iniziare e fermarti ovunque ti piacesse. Full Disclosure: non ho mai fatto codice PL / I, ho appena sfogliato un libro e non ho intenzione di cambiarlo.

Non ho mai usato matrici in GPSS (pacchetto di simulazione di eventi discreti di IBM), durante la mia breve esposizione ad esso, quindi non posso dirti come ha fatto GPSS.

I linguaggi di assemblaggio sono in genere iniziati da 0 perché gli array sono tradizionalmente definiti in termini di un indirizzo iniziale e di un offset rispetto all'indirizzo iniziale. (Questo non è sempre il caso: IBM 1130 Executive disponeva di una tabella vettoriale residente di grandi dimensioni, il cui "indirizzo iniziale" si trovava effettivamente al centro del tavolo, poiché l'indirizzamento indicizzato a 1130 consentiva le correzioni firmate, che richiedevano gli offset per iniziare a zero avrebbe gettato via metà della possibile dimensione del tavolo e quella tabella avrebbe dovuto essere grande.)

    
risposta data 20.05.2016 - 00:29
fonte
0

Prova una risposta breve.

Il conteggio da zero è popolare non solo nei linguaggi di programmazione, ma in generale in matematica.

Il conteggio è molto più vecchio dello zero. Da quando sono state inventate la notazione zero e quella posizionale, ognuno conta da 10, 100, 1000 e così via da zero: è la nuova cifra più bassa. Anche il conteggio delle unità da zero porta alcuni vantaggi di coerenza, in particolare con intervalli semiaperti e array (multidimensionali). Per maggiori dettagli ed esempi vedi link sul lato destro e link

    
risposta data 06.07.2018 - 07:06
fonte
-3

È stata tentata ogni possibile convenzione di conteggio. Il conteggio dalla convenzione zero è diventato dominante perché le alternative tendono ad essere più incline agli incidenti.

Vedi link per una spiegazione del motivo per cui questa versione funziona meglio.

    
risposta data 10.05.2016 - 01:33
fonte

Leggi altre domande sui tag