¿Por qué los índices en XPath comienzan con 1 y no con 0?

117

Algunos colegas y yo estábamos comparando idiomas anteriores en los que habíamos programado y estábamos hablando de nuestra experiencia con VBScript con sus características extrañas , como el índice basado en 1 en lugar de los índices basados ​​en 0, como casi todos los demás idiomas, el razonamiento era que era un idioma para los usuarios (por ejemplo, Excel VBA) en lugar de un idioma para los desarrolladores.

Entonces alguien dijo: " XPath también tiene índices basados ​​en 1 ", lo cual no podía creer hasta que encontré este artículo en el que se dan muchas razones a favor del enfoque basado en 0, incluidas algunas del propio Michael Kay:

  • "... la indexación basada en cero tiende a simplificar las fórmulas del índice cuando se accede a una matriz multidimensional con una expresión de acceso a una matriz unidimensional"
  • "cuando se manejan tablas o se realizan subíndices en cadenas, el direccionamiento basado en cero suele ser mucho más conveniente"
  • "... el direccionamiento por hardware no es el único beneficio del direccionamiento basado en 0 ... también facilita los cálculos ..."

pero luego se cita a Michael Kay como concluyente:

... la lógica basada en 1 fue la elección correcta para XPath y XSLT ... porque el lenguaje fue diseñado para usuarios, no para programadores, y los usuarios todavía tienen este hábito anticuado de referirse al primer capítulo de un libro como Capítulo Uno...

¿Puede alguien explicarme eso? (1) ¿Cómo está diseñado XPath para los usuarios? No puedo imaginar a nadie que no sea un desarrollador luchando con la rigidez sintáctica de XPath o los aspectos declarativos / de programación funcional de XSLT. y (2) ¿Por qué realmente los creadores de XPath fueron en contra de la norma de los lenguajes de programación modernos al elegir un índice basado en 1?

Edward Tanguay
fuente
7
En el mismo artículo, Michael también es citado con las siguientes palabras: "No puedo decirles cuál fue la historia real de la decisión; solo puedo racionalizarla posteriormente". Si ni siquiera él lo sabe, probablemente no haya una respuesta satisfactoria.
Dirk Vollmar
5
He votado CERRAR esta pregunta por ser subjetiva y argumentativa. La indexación basada en 0 no es de ninguna manera mejor que la indexación basada en 1 y lo contrario también es cierto: la indexación basada en 1 no es de ninguna manera mejor que la indexación basada en 0. Ambos tienen ventajas y desventajas. La indexación basada en 1 es más natural para los no programadores. También permite especificar el límite superior de un rango como n, no muy poco natural y a menudo conduce a errores n - 1. Para cualquier persona con lógica pervertida debido a la "programación moderna", comenzar a usar la indexación basada en 1 sería una experiencia agradable y refrescante :)
Dimitre Novatchev
3
las respuestas a esta pregunta de stackoverflow muestran que los índices basados ​​en 0 son preferidos por muchas razones: stackoverflow.com/questions/393462/defend-zero-based-arrays
Edward Tanguay
9
Mi pregunta es una pregunta real en realidad, ya que enseño programación y quiero tener una respuesta a esta pregunta sobre los índices xpath en caso de que surja. Creo que la mejor respuesta es que un índice basado en 1 se asigna a position () que se usa mucho en xpath.
Edward Tanguay
64
Creo que esta es una pregunta legítima y no debería haberse cerrado. Pide un hecho histórico que no es cuestión de opinión y la respuesta sería esclarecedora.
Ben Flynn

Respuestas:

30

Los índices de matriz y otras colecciones representan compensaciones de memoria, por lo que, lógicamente, comienzan en cero. Los índices XML y XPATH representan posiciones y recuentos, por lo que, lógicamente, comienzan en uno (y, por lo tanto, cero es representativo de "vacío")

mike mckechnie
fuente
8

Para responder a esta pregunta, debemos examinar la historia de algunas tecnologías.

RSS XML XSLT e historial XPath

La versión 0.9 de RSS fue lanzada originalmente como Resumen del sitio RDF en 1999 por un par de chicos de Netscape para el portal my.netscape.com de Netscape. Más tarde ese año, se le cambió el nombre a RSS (Rich Site Summary) con la actualización v0.91. El desarrollo del proyecto cambió de manos varias veces, pero la versión 1.0 de RSS se lanzó en diciembre de 2000. Con la actualización v1.0, RSS incluyó soporte para XML.

Durante 2002 v2.0 se lanzó en septiembre como RSS (Really Simple Syndication) y comenzó a evolucionar hasta convertirse en una importante tecnología de Internet. En su historia temprana, las fuentes RSS (y los datos XML que contenían) eran leídas por humanos en formato sin procesar. Los blogs y otras fuentes de noticias utilizaban fuentes RSS y XML para generar información continuamente actualizada. Dado que XML estaba siendo leído por simples mortales (no programadores), XPath y XSLT también debían ser fácilmente comprensibles, para que estos simples mortales no se sintieran abrumados por la complejidad al interactuar con él. Es por eso que XPath imita el estilo de las URI, que es algo con lo que los usuarios finales ya estaban familiarizados. Una de las concesiones hechas con el propósito de facilitar la lectura a los usuarios fue utilizar técnicas de numeración anticuadas, es decir, índices basados ​​en 1 en lugar de índices basados ​​en 0.

Aunque las fuentes RSS y XML se crearon para que la mayoría de las personas pudieran leerlas, los lectores de RSS se desarrollaron para proporcionar una interfaz más agradable para que los humanos leyeran las fuentes RSS. Ahora, los datos RSS y XML sin procesar se leen casi exclusivamente con algún tipo de lector o interfaz gráfica. XML todavía es de uso frecuente (quizás permanente) en la web, pero está enmascarado por elegantes interfaces gráficas de usuario para brindar una mejor experiencia a los usuarios finales.

* El término " meros mortales " se refiere a humanos que no son programadores.

Andrés
fuente
5
No estoy convencido de que tenga mucho que ver con RSS. Por ejemplo, en esta especificación XSL (que luego se separó en XPath y otras ) de abril de 1999, "La función position () devuelve la posición del nodo de contexto en la lista de nodos de contexto. La primera posición es 1 y, por lo tanto, la última la posición será igual a la última (). " ¿Alguno de los "simples mortales" utilizó RDF en el período previo a abril de 1999, cuando se redactó?
Matt Gibson