Почему индексы в XPath начинаются с 1, а не с 0?

117

Некоторые коллеги и я сравнивали прошлые языки, на которых мы программировали, и говорили о нашем опыте работы с VBScript с его странными функциями, такими как индекс на основе 1 вместо индексов на основе 0, как почти у всех других языков, мотивируя это тем, что это был язык для пользователей (например, Excel VBA) вместо языка для разработчиков.

Затем кто-то сказал: « XPath также имеет индексы на основе 1 », во что я не мог поверить, пока не нашел эту статью, в которой приводятся многие доводы в пользу подхода на основе 0, в том числе от самого Майкла Кея:

  • «... индексирование с отсчетом от нуля имеет тенденцию упрощать формулы индекса при доступе к многомерному массиву с помощью выражения доступа к одномерному массиву»
  • «при работе с таблицами или при преобразовании индексов в строки адресация с нуля часто бывает намного удобнее»
  • «... аппаратная адресация - не единственное преимущество адресации на основе 0 ... она также упрощает вычисления ...»

но затем цитируют Майкла Кея в заключение:

... логика на основе 1 была правильным выбором для XPath и XSLT ... потому что язык был разработан для пользователей, а не для программистов, и у пользователей до сих пор есть эта старомодная привычка ссылаться на первую главу книги как на главу Один...

Может кто-нибудь мне это объяснить? (1) Как XPath разработан для пользователей? Я не могу себе представить, чтобы кто-нибудь, кроме разработчика, спорил с синтаксической жесткостью XPath или аспектами декларативного / функционального программирования XSLT. и (2) Почему на самом деле создатели XPath пошли против норм современных языков программирования, выбрав индекс, начинающийся с единицы?

Эдвард Тангуай
источник
7
В той же статье Майкл также цитируется со следующими словами: «Я не могу рассказать вам, какова была фактическая история решения; я могу только пост-рационализировать его». Если даже он не знает, вероятно, удовлетворительного ответа нет.
Dirk Vollmar
5
Я проголосовал ЗАКРЫТЬ этот вопрос как субъективный и аргументированный. Индексирование на основе 0 ничем не лучше, чем индексирование на основе 1, и обратное также верно: индексирование на основе 1 ничем не лучше, чем индексирование на основе 0. У обоих есть плюсы и минусы. Индексация на основе 1 более естественна для непрограммистов. Также это позволяет указать верхнюю границу диапазона как nне очень неестественную и часто приводящую к ошибкам n - 1. Для тех, у кого извращенная логика «современного программирования», начало использования индексации на основе 1 было бы
приятным
3
ответы на этот вопрос о stackoverflow показывают, что индексы на основе 0 предпочтительны по многим причинам: stackoverflow.com/questions/393462/defend-zero-based-arrays
Эдвард Тангуай
9
Мой вопрос на самом деле реальный, поскольку я преподаю программирование и хочу получить ответ на этот вопрос относительно индексов xpath, если он возникнет. Я думаю, что лучший ответ заключается в том, что индекс на основе 1 сопоставляется с position (), который широко используется в xpath.
Эдвард Тангуай,
64
Я считаю, что это законный вопрос, и его не следовало закрывать. Он требует исторического факта, который не является предметом мнения, и ответ был бы поучительным.
Бен Флинн,

Ответы:

30

Индексы массивов и других коллекций представляют собой смещения памяти, поэтому вполне логично, что они начинаются с нуля. Индексы XML и XPATH представляют позиции и счетчики, поэтому достаточно логично, что они начинаются с единицы (и, следовательно, ноль соответствует «пустому»).

Майк Маккечни
источник
8

Чтобы ответить на этот вопрос, мы должны изучить историю некоторых технологий.

RSS XML XSLT и история XPath

Версия 0.9 RSS была первоначально выпущена как RDF Site Summary в 1999 году парой парней из Netscape для портала my.netscape.com Netscape. Позже в том же году он был переименован в RSS (Rich Site Summary) с обновлением v0.91. Разработка проекта несколько раз переходила из рук в руки, но к декабрю 2000 года была выпущена версия 1.0 RSS. С обновлением v1.0 RSS включил поддержку XML.

В течение 2002 года версия 2.0 была выпущена в сентябре как RSS (Really Simple Syndication) и начала развиваться в крупную интернет-технологию. В ранней истории RSS-каналы (и содержащиеся в них XML-данные) читались людьми в необработанном формате. Блоги и другие источники новостей использовали RSS-каналы и XML для вывода постоянно обновляемой информации. Поскольку XML читали простые смертные (непрограммисты), XPath и XSLT также должны были быть легко понятными, чтобы эти простые смертные не были ошеломлены сложностью при взаимодействии с ним. Вот почему XPath имитирует стиль URI, с которым конечные пользователи уже были знакомы. Одна из уступок, сделанных для удобства чтения пользователями, заключалась в использовании устаревших методов нумерации, то есть индексов на основе 1 вместо индексов на основе 0.

Хотя RSS-каналы и XML были созданы для чтения большинством людей, программы чтения RSS были разработаны, чтобы предоставить людям более удобный интерфейс для чтения RSS-каналов. Теперь необработанные данные RSS и XML читаются почти исключительно с помощью какого-либо средства чтения или графического интерфейса. XML по-прежнему часто (возможно, постоянно) используется в сети, но он замаскирован причудливыми графическими пользовательскими интерфейсами, чтобы обеспечить лучший опыт для конечных пользователей.

* Термин « простые смертные » относится к людям, которые не являются программистами.

Андрей
источник
5
Я не уверен, что это так связано с RSS. Например, в этой спецификации XSL (которая позже была разделена на XPath и другие ) от апреля 1999 года: «Функция position () возвращает позицию контекстного узла в списке контекстных узлов. Первая позиция - 1, поэтому последняя position будет равно last (). " Были ли «простые смертные», использующие RDF до апреля 1999 года, когда он был составлен?
Мэтт Гибсон