¿Cuál es el origen de contar desde cero en los lenguajes de programación?


8

Esta es una pregunta sobre la que me he preguntado (y me han preguntado) durante mucho tiempo.

En los lenguajes de programación (¿la mayoría? ¿Todos?), Un índice comienza en cero para una matriz, cadena, etc.

Pensé, tal vez, que tenía que ver con que todo estuviera enraizado en binario. Pero no estoy seguro de la idea de llevar a la necesidad en el sistema decimal: ¿por qué no comenzar un índice desde 1?

¿Alguien tiene conocimiento histórico de lenguajes de programación donde se haya explicado la decisión de comenzar índices en cero?

¡Gracias!

EDITAR: Los escritos de Dijkstra son más útiles desde un punto de vista matemático, pero incluso él ha notado que no todos los idiomas están indexados a cero. La explicación de WBT también tiene sentido por qué uno comenzaría con cero en función de las direcciones de memoria. (Sé que algunos idiomas manejan la indexación ligeramente diferente según la manipulación de la matriz).

No busco necesariamente el por qué ( lo cual aprecio mucho porque ayuda a una mayor comprensión), sino más bien en el sentido de cuándo se convirtió en la convención y / o si se puede rastrear a un idioma específico.

Entonces, por ejemplo, en K&R C, cuando se discuten los índices de matriz, K o R explica con naturalidad: "Los subíndices de matriz siempre comienzan en cero en C ..." (p. 22) Más adelante, al discutir una función para procesar el carácter matrices, "... un diseño más útil sería devolver la longitud de la línea, o cero si se encuentra el final del archivo. El cero es un retorno aceptable al final del archivo porque nunca es una longitud de línea válida". (pág. 127)

Basado en K&R, deduzco a) que la convención se adoptó de otra parte, por lo que C no es la inspiración detrás de la indexación cero yb) posiblemente haya razones más profundas para su uso en base al segundo ejemplo. Sé que K&R es ampliamente considerado por su prosa clara, así que esa es otra razón por la que lo incluyo, para dar un ejemplo de lo que esperaba que otro lenguaje documentado hiciera para explicar la razón detrás de la indexación cero.

Creo que tanto WBT como btilly ofrecen razones igualmente buenas; Me preguntaba si alguien que quizás conociera lenguajes antiguos (¿pre-C?) Que documentara la decisión de diseño. Y al mismo tiempo reconozco que tal información puede no existir.


3
La respuesta simple es que cuando las matrices son punteros, tener base 0 es lo más lógico. Entonces myarray [0] y myarray + 0 es el mismo elemento, y myarray [1] y myarray + 1, etc. Piense en ello como un desplazamiento desde el principio. Puede recibir una respuesta más elaborada, así que solo agrego esto como un comentario :)

@ThomasH Eso no es exactamente "base 0". Base se refiere a cuántos símbolos únicos representan valores diferentes antes de agregar una nueva posición en el número. La base se puede encontrar averiguando qué es 10-1 en ese sistema. La base 10 (decimal), la base 2 (binaria) y la base 16 (hexadecimal) son las más conocidas.
WBT

1
@WBT Pensarías eso si solo leyeras el título.

@ user6292850 Estoy de acuerdo en que es una referencia útil, pero no creo que sea un engaño.
WBT

3
Dijkstra escribió esto sobre los índices cero: cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
Thomas Eding

Respuestas:


12

Se trata de compensaciones. Tiene una dirección que apunta a la ubicación en la memoria donde comienza la matriz. Luego, para acceder a cualquier elemento, multiplique el índice de matriz por el tamaño del elemento y agréguelo a la dirección inicial, para encontrar la dirección de ese elemento.

El primer elemento está en el punto de partida, por lo que multiplica el tamaño del elemento por cero para obtener cero, que es lo que agrega a la dirección inicial para encontrar la ubicación del primer elemento.

La convención se extendió porque los programadores comenzaron a trabajar en lenguajes de muy bajo nivel donde las direcciones de memoria se manipulaban directamente y, en la mayoría de los casos, se acumulaban desde allí, manteniendo la misma convención en cada paso para que no tuvieran que volver a aprender o ser propensos a errores cuando cambio entre convenciones. Todavía es importante comprender cómo funciona este direccionamiento, especialmente cuando se trabaja con idiomas de nivel inferior. Estoy de acuerdo en que esto puede ser un obstáculo para las personas que primero están aprendiendo a programar en un idioma de nivel superior.

El artículo de Wikipedia sobre este tema también cita una instrucción de máquina común que se usa cuando se trabaja "hacia atrás" y se detecta el final de un ciclo, a saber, "disminuir y saltar si es cero".

Una excepción: MATLAB y algunos otros idiomas rompieron la tendencia y comenzaron con un índice que comienza en 1, aparentemente bajo la impresión de que sería un primer lenguaje de programación para muchos de sus usuarios objetivo y que para esas personas, comenzar con 1 genera más sentido intuitivo. Esto causa algunas frustraciones para los programadores (¿un subconjunto relativamente pequeño de?) Que frecuentemente cambian entre lenguajes de programación que comienzan a contar con valores diferentes.


1
Si. Nadie que haya tenido contacto con el ensamblador haría esta pregunta :)
Martin James

4

La afirmación "En (¿la mayoría? ¿Todos?) Lenguajes de programación, un índice comienza en cero" simplemente no es correcta. Los idiomas cuya herencia deriva formal o informalmente de C siguen esta convención. Otros pueden no.

C lo hizo así porque C tenía la intención fundamental de ser un ensamblador de "alto nivel". Puso una carga justa de la carga de trabajo en el programador, donde otros lenguajes hicieron que el compilador y la máquina hicieran el trabajo pesado. En el momento en que se desarrolló C, el conteo basado en 1 era la norma, pero exigir que el compilador realizara un seguimiento de ese tonto extra 1 se consideraba demasiado trabajo para el compilador.

C ++ lo obtuvo de C debido al requisito de que C ++ sea compatible con versiones anteriores (algunos podrían decir que es compatible con errores) con C. Java lo obtuvo de C. Los lenguajes desarrollados por programadores de C sin una exposición significativa a nada más copiaron C, porque quería ser popular entre otros programadores de C o no conocían otra forma de hacerlo.

FORTRAN, que es anterior a casi todo lo demás, comenzó en 1, porque los ingenieros, matemáticos y científicos han estado contando a partir de 1 durante milenios. (Esto permite un algoritmo muy conciso y agradable para el problema de las 8 reinas). MATLAB copió FORTRAN, ya que estaba dirigido casi con precisión a la misma comunidad de usuarios.

PASCAL en realidad requiere que el programador diga dónde comienza y termina, lo que le permite a uno definir, por ejemplo, y una matriz cuyos índices se ejecutan, por ejemplo, -7 a +7. Ada siguió a PASCAL. (Mencionar a Ada debería ser bueno para al menos tres votos a favor allí).

Creo que COBOL comenzó en 1, pero no recuerdo con certeza, y no tengo intención de refrescar algunos recuerdos muy dolorosos, porque los contadores, como ingenieros, científicos y matemáticos, comienzan a contar en 1.

Es un recuerdo lejano que PL / I te permitió comenzar y detenerte donde quisieras. Divulgación completa: nunca hice codificación PL / I, solo hojeé un libro y no tengo intención de cambiar eso.

Nunca utilicé matrices en GPSS (paquete de simulación de eventos discretos de IBM), durante mi breve exposición, por lo que no puedo decirte cómo lo hizo GPSS.

Los lenguajes de ensamblaje generalmente comienzan desde 0 porque las matrices se definen tradicionalmente en términos de una dirección de inicio y un desplazamiento de la dirección de inicio. (Este no es siempre el caso. El IBM 1130 Executive tenía una gran tabla de vectores residentes, cuya "dirección inicial" estaba realmente en el centro de la tabla. Lo hicieron porque el direccionamiento indexado 1130 permitía compensaciones firmadas, lo que requería que las compensaciones comenzaran en cero habría tirado la mitad del tamaño posible de la mesa, y esa mesa NECESITA ser grande).


0

Intentando una respuesta corta.

Contar desde cero es popular no solo en lenguajes de programación sino también en matemáticas en términos más generales.

El conteo es mucho más antiguo que el cero. Desde que se inventó la notación cero y posicional, todos cuentan 10, 100, 1000, etc. desde cero: es el nuevo dígito más bajo. Contar unidades desde cero también trae algunas ventajas de consistencia, especialmente con intervalos medio abiertos y matrices (multidimensionales). Para obtener más detalles y ejemplos, consulte los enlaces del lado derecho y https://en.wikipedia.org/wiki/Zero-based_numbering


1
Los números van del 0 al 9, no del 1 al 10.
Ignacio Soler Garcia

En mi experiencia, los índices que van de 1 a n son más populares que los índices que van de 0 a n-1 en matemáticas.
CodesInChaos

-3

Se han probado todas las convenciones posibles de contar. El conteo desde la convención cero se ha vuelto dominante porque las alternativas tienden a ser más propensas a los accidentes.

Consulte https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html para obtener una explicación de por qué esta versión funciona mejor.


2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. - De la opinión
Vinoth Krishnan

66
"Se han probado todas las convenciones posibles de contar". ¿Incluye eso el que comienza en - e y se incrementa en unidades de π ?
WBT
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.