Почему разработчики ColdFusion решили индексировать массивы с 1, а не с 0?

StackOverflow https://stackoverflow.com/questions/420510

  •  05-07-2019
  •  | 
  •  

Вопрос

Мне просто интересно, кто-нибудь знает, почему они нарушили соглашение по этому поводу?

Спасибо, Ciaran

Это было полезно?

Решение

@Кори:Вы будете удивлены, узнав, кто скрывается в StackOverflow.:-)

Вы во многом правы.Первоначальный замысел CFML заключался в том, чтобы позволить непрограммистам создавать сложные веб-приложения.ColdFusion\CFML был первым языком, разработанным специально для создания веб-приложений.В 1995 году Интернет представлял собой в основном статический HTML, и типичный «веб-разработчик» не слишком много занимался программированием.Сам язык был спроектирован максимально простым, поэтому он до сих пор остается одним из самых быстрых и простых языков для изучения.

Это может привести к некоторой путанице, особенно когда код ColdFusion напрямую взаимодействует с Java или .NET.Однако это просто стало одной из таких «причуд».Это решение было пересмотрено еще в 2000/2001 году, когда CF был перестроен в приложение Java EE, но обратная совместимость помешала этому изменению.

Другие советы

Существует два соглашения: одно общее для большинства языков программирования, а другое — для большинства непрограммистов.Вероятно, они были нацелены на людей, которые не начинают счет с 0.

Если мне пришлось догадываться, то это потому, что ColdFusion был нацелен на новичков, и массивы, основанные на единице, могли бы иметь больше смысла - первый элемент имеет номер 1, второй - номер 2 и т. д.

Это мы, компьютерщики, странные!

Что ж, если у нас нет оригинальных дизайнеров, будет сложно делать что-либо, кроме как строить предположения.Но, использовав CF в прошлой жизни, у меня есть некоторые идеи.

Если вы посмотрите на исходный язык, то увидите, что он был разработан для разработки типа RAD для людей, которые хотели создавать динамические приложения без особых сложностей.Я до сих пор помню радость, когда они наконец выпустили пользовательские функции, и мне не пришлось везде использовать теги.

Исходя из этого, было бы разумно, чтобы аспекты языка, с которыми людям приходилось иметь дело, например, массивы, они сделали более «дружественными».На мой взгляд, просмотр массива [0] имеет смысл.Но для людей, плохо знакомых с парадигмой и не усвоивших этого, это не будет иметь никакого смысла.Зачем мне обращаться к объекту в позиции «0»?

Забавно то, что теперь, когда CF является серверной частью Java, вам фактически приходится иметь дело со случаями, когда ваш индекс начинается с 1, и со случаями, когда он начинается с 0.Таким образом, пытаясь быть полезными, они фактически усложняли язык по мере его роста.

Посчитайте количество пальцев на одной руке.Вы начали считать с 0 или с 1?

Абстрактные идеи, которые тесно связаны с реальной жизнью, всегда легче понять и применить (например:подумайте о физическом «стеке», а затем об абстрактной структуре данных).

В качестве альтернативы давайте спросим, ​​почему в некоторых языках индекс массива начинается с нуля?Для подсчета дискретных объектов (например, элементов массива) это не имеет особого смысла и неестественно с человеческой точки зрения.

Первоначально казалось, что это произошло из таких языков, как C (хотя я не утверждаю, что оно впервые возникло в C:Я не знаю, и это не имеет значения для целей данного), в котором язык и его программирование достаточно тесно связаны с управлением памятью (malloc, и т. д).Некоторые особенности языка C довольно близко соответствуют тому, что происходит в памяти под капотом.Переменные являются примером этого:а также имена переменных, мы всегда занимаемся адресом памяти, по которому находится переменная (или начинается в) с указателями и тому подобным.

Итак, мы подходим к массивам в C, и они индексируются таким образом, что в памяти находится ряд элементов, начиная с базовой ячейки памяти, где находится переменная массива, и каждый элемент компенсируется размером типа данных. (например:char — это один байт и т. д.).Итак, чтобы найти каждый элемент массива в памяти, мы делаем следующее:

arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)

И действительно, когда делаешь что-то на C, такие мысли действительно возникают, потому что это довольно близко соответствует тому, что компьютер должен делать под капотом, чтобы найти значение, которое требуется коду.

Итак whichElementItIsInTheArray используется для смещения адреса памяти (в единицах sizeOfDataType).

Очевидно, что если индекс массива начинается с 1, он будет смещен в памяти на единицу. sizeOfDataType, по сути, тратя впустую sizeOfDataType объем памяти между arrayBaseAddress и где на самом деле находится первый элемент.

Можно подумать, что это не имеет большого значения, но в былые времена, когда все это реализовывалось, память была как золото:это не могло быть потрачено впустую.Поэтому можно подумать: «Хорошо, просто компенсируйте whichElementItIsInTheArray на -1 под капотом, и покончим с этим.Однако, как и память, тактовые циклы были золотом, поэтому вместо того, чтобы тратить время на обработку, программисту нужно было просто привыкнуть к неестественному способу счета.

Здесь был законная причина начинать массивы с нулевого индекса в таких ситуациях.

Мне кажется (и это теперь становится редакционным уклоном), когда появились последующие языки с «фигурными скобками» (например, Java), они просто последовали этому примеру, независимо от того, действительно ли это все еще актуально или нет, потому что «так это делается».Вместо того, чтобы «такой путь имеет смысл».

С другой стороны, в более современных языках и в тех, которые еще дальше отошли от внутренней работы компьютера, кто-то задумывался: «Почему мы это делаем?» и «В контексте этого языка и его предполагаемого использования, делает ли это смысл?".Здесь я согласен, в чем ответ — твердое «нет».Потери ресурсов для смещения индекса массива на -1 или просто игнорирования памяти нулевого элемента больше не являются важным фактором во многих обстоятельствах.Так зачем же заставлять язык и программиста компенсировать естественный способ подсчета вещей на единицу по чисто устаревшей причине?Для этого нет законных оснований.

В C есть элемент массива a[0].Это первый элемент массива (не «нулевой» элемент), и если это полный размер массива, его длина равна один.Таким образом, своеобразное поведение здесь связано с языком программирования, а не с тем, как вещи подсчитываются/перечисляются «в реальной жизни» (где проживает большинство из нас).Так зачем упорствовать в этом?

Некоторые люди здесь возражают против этого аргумента «с чего начать индекс» словами «ну, когда мы рождаемся, мы не ЕДИНЫ, мы НОЛЬ».Это правда, но это измерение непрерывной вещи, а это не одно и то же.Так что это не имеет значения для разговора.Массив представляет собой совокупность дискретных элементов, и при измерении количества дискретных элементов (т. е.:считая их), мы начинаем с одного.

Как это добавляет интереса к разговору?Ну, это не так уж и много, но это другой взгляд на одно и то же.И я полагаю, что это своего рода рационализация/реакция на представление некоторых людей о том, что начинать индексы массива с 1 как-то «неправильно».В этом нет ничего плохого, с человеческой точки зрения это правильнее, чем начинать с нуля.Так что позвольте человеку написать код, как это сделал бы человек, и заставить машину разобраться в нем по мере необходимости.По сути, только в отношении устаревших технологических ограничений мы когда-либо начинали считать их с нуля, и нет необходимости увековечивать эту практику, если нам больше не нужно.

Все "ИМО", конечно.

Идея начинать массивы с 0 была популяризирована в языке C.Старые языки, такие как FORTRAN и COBOL, начали считать массивы с 1 (на самом деле в COBOL они называются таблицами).

Не существует соглашения относительно начальной точки массива.Например, большинство основ также начинаются с 1.Некоторые языки позволяют вам начинать массив где угодно или позволяют индексам массива быть перечислениями и т. д. (например, Ada).В C использовалось понятие жало в 0, и многие языки последовали его примеру, но не все.Одна из причин, почему они этого не делают, заключается в том, что массивы, начинающиеся с 1, гораздо более интуитивно понятны.

Даже в мире программирования Java API есть интересное исключение — счет, отсчитываемый от 0:API JDBC.Счет начинается с 1, к большому удивлению каждого программиста, впервые обращающегося к базе данных.

Возможно, это было не просто дело обывателя...Я думаю, что большинство людей, изучающих любой веб-язык, по крайней мере, возились с javascript (и то же самое было 10–15 лет назад).Индексы, отсчитываемые от 0, не были такими уж чуждыми.

Что мне нравится в языках, в которых индексы/позиции (для строк) начинаются с 1, так это то, что вы можете делать такие вещи, как

<cfif find("c","cat")>

который оценивается как true если c найден, так и будет.

тогда как язык с индексом 0, такой как javascript

if ("cat".indexOf("c")) { 

оценивается как false, поэтому вам нужно сказать что-то вроде if ("cat".indexOf("c") >= 0) {

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

Я думаю, если бы Аллер знал, где в конечном итоге будет Интернет и как клиент и сервер смогут работать вместе, у нас были бы индексы, отсчитываемые от 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top