Прошу не судить строго, это моя первая статья на хабре. Лучше оставляйте замечания в комментариях, а я обещаю сделать соответствующие выводы.

Итак, первое моё знакомство с языками программирования состоялось в школе, и был это Бэйсик. С тех пор с языками программирования я не пересекался. Прошло больше 20 лет и мне понадобилось изучить один из современных языков программирования. Всем критериям предъявляемым мной языку программирования, которые я смог сформулировать на тот момент, полностью удовлетворял C#. Засучив рукава, я принялся его изучать и у меня появилась возможность оценить насколько изменились языки программирования за это время.

Многое было привычно, если не по внешнему виду, то по концепции: переменные, циклы, операторы ветвления… А что-то было совсем новым: ООП с его классами (полями, методами, свойствами), наследованием и т. д.
Конечно, многое порадовало. Классы теперь позволяют заниматься распределением обязанностей: Так, ты мне принеси «то»; Ты сделай «это»; Ты посчитай мне «это», результат сообщишь. Это очень напоминает наше взаимодействие с окружающей средой. Например, зашли в прачечную, отдали грязное постельное бельё, забрали чистое. Зашли в ателье, отдали ушить брюки, забрали готовый вариант. Зашли в закусочную, сделали заказ, получили завтрак. Очень удобно и наглядно.
Но вернёмся с теме статьи. Я никак не ожидал спустя 20 лет увидеть в языках программирования некоторые вещи:

1. Индексация с 0.

Для меня было большим удивлением, что индексация массивов, списков, да и любых других коллекций начинается с 0, а не с 1. Зачем? Это же неудобно, подумал я.

Затем я помогал младшему брату с изучением азов C# и объяснял, что считать тут надо с 0, а не с 1 и уже он у меня спросил: «А зачем? Это же неудобно!».

Потом ради интереса я стал рассказывать своим друзьям и знакомым, что в современных языках программирования (за редким исключением) считать нужно с 0, а не с 1. И все спрашивали: «А зачем? Это же неудобно!» и я до сих пор не знаю что ответить им на этот вопрос.

Если раньше в этом была какая-то логика, то сейчас, когда современные компиляторы делают огромное количество всевозможных оптимизаций, это теряет всякий смысл. Сделать поправку на -1 для них ничего не стоит.
Сейчас программисту приходится делать эту поправку в уме. Но вопрос в том, а не для того ли созданы языки программирования, чтобы избавить нас от части работы, особенно рутинной, постоянно повторяющейся? Так зачем же мы до сих пор продолжаем считать с 0?

2. Числовые типы данных.

Ещё одним удивлением для меня стало большое количество числовых типов данных. Почему-то мне казалось, что уже давно должен был остаться один тип числовых данных, всё-таки 21-й век на дворе. Если программист уже не заботится о выделении памяти, всё за него делает сборщик мусора, если есть динамически изменяющие размер коллекции, то почему мы до сих пор не имеем единого числового типа данных, например, так же динамически увеличивающего место занимаемое в оперативной памяти без участия программиста?

Во первых, это просто не удобно, постоянно думать какой числовой тип данных использовать в данном конкретном случае.
Во вторых, нужно постоянно заботиться о правильном приведении типов.
В третьих, нужно следить за переполнением типа. А между прочим, из-за этого ракеты падают. Привет Ariane 5. Неужели 7-8 миллиардов долларов это адекватная плата за подобного рода ошибки?

3. Разделение типов данных на целые и дробные.

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

Была на хабре статья о Smalltalk, там рассказывалось о расчётах без потери точности в Smalltalk.
Расчеты без потери точности. Основная проблема во многих языках – потеря точности при делении. Например: 1/3 – это 0.3333 и 3 в периоде. Соответственно в других языках оговаривается количество знаков после запятой, и точность теряется. В Smalltalk эту проблему решили очень красиво. В результате этого деления мы получим число класса Fraction. Оно содержит в себе числитель (1) и знаменатель (3). То есть, как такового деления не будет, а будет дробь. Ничего не теряем. И все последующие операции подчиняются правилам работы с дробями. Когда необходимо получить десятичное число, просто говорим этому объекту asFixedPoint: с нужным числом знаков после запятой и получаем результат. При этом само число остается неизменным, и мы можем продолжать вести расчеты без потери точности.
Так почему у нас до сих пор нет единого типа данных для любых чисел, который бы состоял из числителя, знаменателя и динамически увеличивал занимаемое место в памяти при достижении предела?

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

Если язык программирования высокоуровневый, то не лучше ли иметь чуть меньшую производительность языка, но несравненно большее удобство в работе с ним?

Приглашаю всех к обсуждению данной темы. Быть может, каких-то вещей я просто не понимаю или не учитываю?

P.S. Не знаю, кто такой SkidanovAlex, но спасибо тебе, добрый человек, за приглашение на хабр.

Комментарии (420)


  1. WST
    03.12.2015 08:52
    +18

    Если эти вещи за 20 лет не изменились, значит, на то были определённые причины. Программисты, всё-таки, должны думать, а не возлагать на «умную машину» всё сразу. Проще говоря, определённый уровень контроля должен оставаться. Хотя в мире есть языки, где реализованы описанные вами идеи, например, нумерация с 1 есть в Lua, если мне не изменяет память. Но нумерация с 0, как ни удивляйтесь, является даже более «интуитивной» для тех, кто в программировании уже давно. Прежде всего потому что первыми коллекциями исторически были массивы, а индекс в массиве означал просто смещение от начала отведённого под массив участка памяти. Поломаете эту традицию — и негодовать уже будут не изучающие, а те, кто программировал профессионально.


    1. VasakaInc
      03.12.2015 09:04
      -8

      Не обязательно ломать эту традицию в существующих языках программирования. Меня удивляет, что новые языки программирования до сих пор продолжают эту традицию.

      Почему когда-то давно была принята индексация с 0 мне понятно. Только сейчас это не имеет никакого смысла. Компиляторы делают оптимизацию при сборке. В C# вообще программа транслируется в CIL. Сделать смещение во время компиляции элементарно.

      И судя по карме и рейтингу, я замахнулся на святое! )))


      1. WST
        03.12.2015 09:17
        +7

        Хорошо, допустим даже нет никаких архитектурных ограничений — компилятору пофиг. Но есть психологическая сторона вопроса. Языков программирования сейчас просто море — и когда вы создаёте новый, вам нужно сделать его интересным для сообщества, т.е чтобы порог вхождения не был слишком высоким, были какие-нибудь удобные синтаксические конструкции, которых нет у конкурентов. Индексация с 1 — пример такой вещи, которая способна, не дав вашему языку ничего нового семантически, крайне негативно сказаться на пороге вхождения. Потому что опытные программисты, работавшие с другими языками, изучая ваш, неожиданно начнут совершать кучу нелепых и неочевидных ошибок. Будет затруднён перенос существующих проектов на ваш язык, как кода, так и данных.


        1. VasakaInc
          03.12.2015 09:31

          Все ваши доводы мне понятны. Но есть неопытные программисты, такие как я, например. Им не нужно ничего переносить, им не нужно ломать традиции, ибо их традиция это всё считать с 1.
          В общем, насколько я вижу, даже если у создателей языков программирования и появляются такие мысли, то продолжения они не имею из за боязни того, что их предложение будет принято, мягко говоря, не с распростёртыми объятьями.
          Помню, как создатель языка Питон, заикнулся про индексацию с 1. Потом пришлось быстро это всё в шутку переводить.


          1. WST
            03.12.2015 09:35

            Хм, не знал о таком факте, но, в принципе, я не удивлён — Python создавался с мыслями о простоте и читаемости и я вполне допускаю, что его автор мог думать «сказано первый элемент — пусть и обозначается a[1]». И я рад за него, что он взвесил аргументы «за» и «против» и пришёл к мудрому решению :)


            1. VasakaInc
              03.12.2015 09:47
              -2

              ))) Ну, тут наши определения «мудрости решения», очевидно, не совпадают, но каждый имеет право на своё видение ситуации. Почему-то мне кажется, что со временем, всё равно придут именно к большей высокоуровневости в языках программирования. В том числе и к тем вещам о которых я писал в статье. Однако, история нас рассудит. Поговорим об этом снова лет через 40-50? )))


              1. WST
                03.12.2015 09:51

                Дожить бы для начала. И надеяться, что доживут также Хабр и интернет в его современном виде. А на последнее в свете политической обстановки надеяться всё труднее с каждым годом.


              1. ad1Dima
                03.12.2015 10:00
                +7

                В том же C# вы можете писать асинхронные запросы на сервер императивно. Вот это и есть «высокоуровневость». А вариации того, с чего начинаются индексы ничего не упрощают.


                1. VasakaInc
                  03.12.2015 10:20
                  -5

                  Это упрощает освоение языка новичками.


                  1. Xardas2000
                    03.12.2015 10:22
                    +5

                    зачем упрощать один момент новичкам, если это вызывает больше трудностей в дальнейшем для них самих же(пример с заполнением ячеек вам продемонстрировали)?


                    1. VasakaInc
                      03.12.2015 10:53
                      -1

                      Почему-то мне кажется, что можно спроектировать язык программирования таким образом, чтобы избежать тех проблем о которых вы говорите. Почитайте ниже, где люди пишут о Эрланге, Фортране и Луа.


                      1. ad1Dima
                        03.12.2015 11:02
                        +2

                        Спроектировать язык, где n = n — 1 при n ? ??


                        1. a_batyr
                          03.12.2015 12:38
                          +1

                          Сокращаем левую и правую часть, получаем 0 = -1


                          1. ad1Dima
                            03.12.2015 13:05

                            получаем выход за пределы ?0


                          1. Zenitchik
                            03.12.2015 15:17

                            Взаимно уничтожаем.


              1. Suntechnic
                04.12.2015 01:37
                +4

                А почему в недели 7 дней? Это же неудобно! Надо сделать 10.
                ну и погуглите чем это закончилось…


          1. Temmokan
            03.12.2015 11:19
            +2

            «Программисты полагают, что в килограмме 1024 грамма. Остальные люди полагают, что в килобайте 1000 байт».

            Цена за массивы, где можно начинать отсчёт с чего угодно (тот же PHP, хотя там не массивы, строго говоря) — потеря эффективности и в большинстве случаев большая вероятность ошибок. Или проверку ошибок (неважно, каким механизмом реализована) тоже надо поручить компилятору?

            Да, кстати, надо бы определиться, что такое «по-настоящему высокий уровень». С моей точки зрения — это когда говоришь программе «считай пси от кси!» — и она считает именно то, что сказавший подумал.

            Но, по моему ретроградному и консервативному мнению, машина не должна думать. Машина должна ездить. А специалист в области программирования, который знаком с теорией алгоритмов, не будет очень уж страдать от массивов, начинающихся с нуля.


            1. Zenitchik
              03.12.2015 12:37
              +1

              В бэйсике можно объявить массив с любыми верхним и нижним пределом. При этом внутренне он остаётся массивом, просто компилятор считает сдвиг с учётом нижнего предела.
              В школе использовал это для табличного задания функций.


          1. defuz
            03.12.2015 11:34
            +2

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


            1. VasakaInc
              03.12.2015 11:45
              -8

              Ну да, вы же можете залезть к Гвидо в голову. )) Это исключительно ваше суждение на этот счёт. А я считаю, что он решил прощупать почву, но столкнувшись с ярым противодействием ретировался и обернул всё это в шутку и троллинг. И как вы собираетесь доказать что ваше мнение на этот счёт правильное, а моё нет, без того, чтобы заглянуть в голову Гвидо?


              1. defuz
                03.12.2015 11:55
                +9

                Я, как автор той самой статьи, из-за которой вы вообще по всей видимости узнали об этой истории, могу лишь скромно сделать предположение, что Гвидо человек досточно умный, и что если бы он действительно «хотел», то вынес бы этот вопрос на обсуждение в виде PEP в чуть более аргуметированом и развернутом виде, а не ограничился ответом «считайте уже сделано» во внутренней переписке разработчиков. Есть определенный регламент и устоявшиеся подходы для того, как подобные решения принимаются.

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


                1. VasakaInc
                  03.12.2015 12:32
                  -8

                  Я как психолог, могу утверждать, что люди охотно интерпретируют события в свою пользу даже вопреки явным свидетельствам обратного не говоря уж о ситуациях где события можно трактовать двояко. Поэтому, меня нисколько не удивляет ваше утверждение, как и плюсы/минусы в вашу поддержку того инерционного большинства, которое вас поддерживает.
                  Можете считать так, как вам больше нравится. Это статья для тех, кто имеет некоторое количество здравого смысла, чтобы задуматься, а не для тех, кто уже всё давным-давно для себя решил.


                  1. defuz
                    03.12.2015 12:37

                    Я как дилетант в психологии готов полностью с вами согласится в том, что люди охотно интерпретируют события в свою пользу даже вопреки явным свидетельствам обратного. Только вот объясните мне пожалуйста, как человек с некоторым количеством здравого смысла, почему этот аргумент действует именно в вашу пользу, а не в мою? :)


                    1. VasakaInc
                      03.12.2015 12:50
                      -6

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


                      1. defuz
                        03.12.2015 12:59
                        +5

                        Спору нет, вот только это путь в никуда: «железобетонные» доказательства существуют исключительно в математике и только в рамках одной принятой за основу аксиоматической базы. В любой другой естественной науке (не говоря уже о гуманитарных науках и реальной жизни) любое утверждение являтся лишь более и менее обоснованым, и любая теория является лишь такой, которая находит или не находит убедительные подтверждения. Так что апеляция к отсутствию 100-процентного доказательства в споре просто бесмысленна.


                        1. VasakaInc
                          03.12.2015 13:08
                          -2

                          Я апеллирую не только к отсутствию у вас железобетонного доказательства (заметьте, я не говорю 100 процентного), я дополнительно апеллирую к столь же правдоподобному предположению с моей стороны, которое не имеет явного опровержения.


                          1. Ogra
                            03.12.2015 13:09
                            +4

                            Отсутствие PEP или обсуждений в email — и есть железобетонное доказательство.


                  1. Ogra
                    03.12.2015 12:43
                    +2

                    Смею вас заверить, что Гвидо и не думал вводить индексацию с 1, это действительно было шуткой.


                    1. VasakaInc
                      03.12.2015 13:03
                      -2

                      Скорее всего так, но всколыхнул он это болото знатно! :)
                      Однако, у меня нет уверенности, что это точно была шутка. Даже если сам Гвидо скажет, что это была шутка, за кулисами могла происходить совсем другая история. Человек мог думать, что его авторитета хватит, чтобы поменять отношение к этому, но когда он осознал, что этого не произошло, резко дал задний ход и обратил всё в шутку и троллинг. Эдакий вброс, чтобы посмотреть на реакцию и дальше действовать по обстоятельствам. А если идея не приживается, проще отрицать первоначальную задумку, чем ставить себя под удар.
                      Из своей практики могу рассказать множество случаев в которых люди в буквальном смысле на чёрное говорили белое только из за того, что всё окружение чёрное называло белым. На эту тему в психологии ставилось много опытов. Лишь незначительный процент людей способен выдержать такой прессинг и пойти вопреки мнению большинства.


                      1. Ogra
                        03.12.2015 13:09
                        +1

                        Вам стоит все-таки набраться опыта в программировании и посмотреть на то, как разрабатываются такие проекты как Python. Посмотреть на историю этого проекта и принятые при его разработке решения. Узнать, как и почему до сих пор не произошел полный переход на Python 3. Сложно все описать, но если Гвидо в здравом уме, то это 100% шутка.


                        1. VasakaInc
                          03.12.2015 13:21
                          -2

                          Вам стоит все-таки набраться опыта в программировании и посмотреть на то, как разрабатываются такие проекты как Python. Посмотреть на историю этого проекта и принятые при его разработке решения. Узнать, как и почему до сих пор не произошел полный переход на Python 3.
                          Обязательно. В свободное время, в виде хобби этим и занимаюсь. Правда мало свободного времени, поэтому продвигается у меня всё очень медленно.

                          Сложно все описать, но если Гвидо в здравом уме, то это 100% шутка.
                          Вот видите, и у вас появилось «если».
                          А я могу сказать, что там могут быть ещё и другие «если», не только «если» он в здравом уме.


                      1. defuz
                        03.12.2015 13:35

                        Опять же, ваша теория выглядит не убедительной именно потому, что поведение Гвидо с самого начала выглядело как троллинг. И то, «троллингом» оно было разве что для тех, кто был не совсем теме. А для тех, кому непосредственно писался этот ответ, это выглядело как чистой воды сарказм, который даже внимания не стоит.

                        Я думаю, что если бы Гвидо действительно хотел сделать «вброс», он воспользовался бы гораздо более серьезными инструментами для того, чтобы иметь шанс склонить сообщество на свою сторону, но он ними не воспользовался. Опять же, не прозвучало вообще никаких доводов «за» с его стороны, даже в виде троллинга, только саркастический ответ в стиле «ага, уже встали и побежали делать», который как раз и заставил людей со стороны истерить и бурно дискутировать.


                  1. defuz
                    03.12.2015 12:53
                    +2

                    Кстати, Гвидо предельно ясно и аргументированно изложил свою точку зрения на этот счет, как это и принято обычно делать в нашем сообществе. Жаль конечно, что ему пришлось пойти на поводу у инерционного большинства, и он понятия не имеет о том что вам кажется что ему кажется что он хотел бы на самом деле чтобы все было не так.

                    А если серьезно, то я бы с радостью с вами аргументированно подискутировал по этому вопросу. Поверьте, я задумывался над теми же вопросами, над которыми сейчас задумываетесь и вы, и тема эта весьма не банальна и лично для меня интересна. Вот только ваши аргументы к сожалению пока сводятся к заявлениям в стиле «если бы Земля была действительно круглой, то люди бы с нее падали вниз» и аппеляциям к тому что вы психолог по-этому лучше меня знаете, что на самом деле хотел сделать Гвидо.


                    1. VasakaInc
                      03.12.2015 13:27
                      -2

                      Вряд ли я могу с вами аргументированно дискутировать в области программирования. Моё видение этого просто и незамысловато:
                      1. Высокоуровневые языки, это языки на которых просто и удобно программировать. (Повторюсь, это моё упрощённое понимание того, что является высокоуровневым языком программирования)
                      2. Программируя на одном из них я столкнулся с вещами, которые неудобны и не просты.

                      Мы не имеем возможности сделать это проще и удобней? Да похоже имеем, насколько я понимаю.
                      Тогда почему мы это не делаем?
                      Вот об этом и статья.


                      1. ad1Dima
                        03.12.2015 13:32
                        +1

                        Говорить тоже не просто и не удобно. Есть вещи, которым все равно надо учиться.


                      1. Ogra
                        03.12.2015 13:37
                        +3

                        Тогда почему мы это не делаем?


                        1. Груз обратной совместимости. Да-да, с Си, ассемблером и машинным представлением. Те люди, которые разрабатывают языки программирования часто уже привыкли к таким вещам, как индексация с нуля.
                        2. Текущие или дырявые абстракции. Хорошо по этому поводу написал Джоэл, это нужно прочитать. Если вкратце — хочешь не хочешь, даже с самым высокоуровневым языком программирования, рано или поздно ты встретишься с аппаратной частью, которая… да-да, индексирует от нуля, очень быстро считает int и float, но медленно bigDecimal и fraction. Закон Мура сохраняется, но производительность на поток растет все медленнее и медленнее.
                        3. Хвост виляет собакой. Популярными становятся языки, которые удобны для программистов, поэтому Java, C#, да даже PHP радуют нас фигурными скобочками, циклом for (;;), ну вы поняли — все дело в старом, добром Си.

                        Не надо думать, что все плохо. Может быть вам вообще нужен Matlab? Зачем критиковать C#, если он вам просто не подходит?


                        1. VasakaInc
                          03.12.2015 15:10

                          Про обратную совместимость я давно понял, но появляются языки с индексацией с 1, значит не так смертельно отсутствие этой обратной совместимости.

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

                          Не надо думать, что все плохо. Может быть вам вообще нужен Matlab? Зачем критиковать C#, если он вам просто не подходит?
                          Я хочу поделать для себя игрушки, а Матлаба, Октава и Луа для Unity 3D нет.
                          Но это опять же вопрос какой мне и для чего нужен язык программирования, а я просто хотел поднять для обсуждения тему: «Почему до сих пор в высокоуровневых языках мы используем то, что уже давно не обязательно использовать.»


                          1. lair
                            03.12.2015 15:21
                            +2

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

                            Прекрасно, и как потом эти «дети» будут программировать на языках, в которых индексация с нуля?

                            Почему до сих пор в высокоуровневых языках мы используем то, что уже давно не обязательно использовать

                            Потому что предполагаемый выигрыш меньше предполагаемых затрат.


                            1. VasakaInc
                              03.12.2015 15:34
                              -1

                              А каков процент задач в которых приходится спускаться на низкий уровень?
                              Думаю, большинство из этих детей, процентов 80-90 будут писать на высокоуровневых языках и им никогда не понадобится индексация с 0. Тем же кому придётся работать с невысокоуровневыми языками программирования, придётся освоить индексацию с нуля, бесспорно.


                              1. lair
                                03.12.2015 15:37
                                +1

                                А каков процент задач в которых приходится спускаться на низкий уровень?

                                А речь не о низком уровне, речь о всех существующих сейчас языках с индексацией с нуля.

                                Думаю, большинство из этих детей, процентов 80-90 будут писать на высокоуровневых языках и им никогда не понадобится индексация с 0.

                                А им вообще понадобится индексация, раз уж на то пошло?

                                Тем же кому придётся работать с невысокоуровневыми языками программирования, придётся освоить индексацию с нуля, бесспорно.

                                И в этот момент им придется переучиываться. Лично мне их жалко.


                                1. Mrrl
                                  03.12.2015 15:41
                                  +1

                                  Вот не помню проблем с индексацией при переходе с Фортрана на С. Хотя у студентов неоднократно наблюдал, как они пытались обратиться к элементу матрицы M[N][N] (где N — размер матрицы).


                                  1. lair
                                    03.12.2015 15:45

                                    Лично у меня тоже не было проблем при таком переходе. Но при этом я знаю людей, у которых такие проблемы были.

                                    Вопрос еще во многом в том, когда и как это объясняли.


                                    1. Mrrl
                                      03.12.2015 15:52

                                      В моём случае объясняли, как котёнку, которого учили плавать :) Возможно, это лучший метод.


                            1. Ogra
                              03.12.2015 15:45

                              Прекрасно, и как потом эти «дети» будут программировать на языках, в которых индексация с нуля?


                              Ну как-то же мы переучивались с Паскаля на Си. Помните, какие в Паскале строки? Первая буква доступна по индексу 1, вторая по индексу 2 и т.д.


                              1. Alexeyslav
                                03.12.2015 16:03
                                +2

                                Там просто индекс 0 занял сам размер строки, иначе было бы с нуля…


                                1. Ogra
                                  03.12.2015 16:06

                                  Это я помню =)


                          1. bromzh
                            03.12.2015 15:29
                            +2

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

                            Взять ту же мышку: многие говорят, что это интуитивно понятное устройство для ввода/вывода. Однако для людей далёких от компьютера это совсем не так. Просто первая группа привыкла.


                            1. VasakaInc
                              03.12.2015 15:40
                              -3

                              Вы вроде психолог, но почему-то не можете (или не хотите) понять простую вещь, свойственную человеку: то, что для вас «интуитивно понятно», для других людей не будет являться таковым. И наоборот.
                              Ну, отлично написано, никаких претензий. Вот только если мы на входе имеем 100% популяцию тех для кого это непривычно и нам их всех надо переучить, возникает вопрос, зачем это делать? Не проще ли что-то поменять, чтобы не пришлось этого делать? Мы не имеем такой возможности?
                              Имеем. Так в чём проблема?


                              1. lair
                                03.12.2015 15:45
                                +5

                                Вот только если мы на входе имеем 100% популяцию тех для кого это непривычно и нам их всех надо переучить

                                А мы ее имеем?

                                Не проще ли что-то поменять, чтобы не пришлось этого делать?

                                А вы уверены, что поменять на индексацию с единицы — правильно?


                              1. defuz
                                03.12.2015 16:09
                                +2

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


                              1. fedor1113
                                05.12.2015 17:37
                                +1

                                Мне больше нравится индексация с нуля (привычно). Особо не переучивался. :) Может, я и аномалия, но по моему мнению изучение этого полезно.
                                Индексация с нуля логичнее, удобнее, интуитивнее и помогает разобраться во многих вопросах (имхо).


                                1. VasakaInc
                                  05.12.2015 17:58
                                  -4

                                  Мне больше нравится индексация с нуля (привычно).
                                  Привычно — ключевое слово.
                                  Проводили эксперименты, одевали человеку очки, которые переворачивали изображение вверх ногами. По началу был ужас и караул. Человек ничего не мог делать, даже толком дверцу холодильника открыть. Через несколько дней, испытуемый привыкал настолько, что не испытывал никакого дискомфорта. Всё делал чётко и без сбоев. Тогда с испытуемого снимали очки… И наблюдали ту же картину, как когда их ему только одели. Приходилось заново привыкать к нормальному зрению.
                                  Основная масса изучающих программирование удивляются индексации с 0 и мучаются с ней, пока не привыкнут. Дальше, естественно, или практически не испытывают дискомфорта или совсем не испытывают. Вопрос в другом. Если мы пишем более человеческие языки называемые высокоуровневыми, какой смысл в переучивании всего потока школьников (студентов), если можно это в высокоуровневом языке программирования спокойно изменить?

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


                                  1. lair
                                    05.12.2015 18:42
                                    +4

                                    Если мы пишем более человеческие языки называемые высокоуровневыми, какой смысл в переучивании всего потока школьников (студентов), если можно это в высокоуровневом языке программирования спокойно изменить?

                                    Я вас еще раз спрошу: зачем вам вообще в «высокоуровневом языке» индексация (с нуля или с единицы, пофиг), если без нее можно прекрасно обойтись?


                                  1. Temmokan
                                    09.12.2015 21:16
                                    +4

                                    > Основная масса изучающих программирование удивляются индексации с 0 и мучаются с ней, пока не привыкнут.

                                    Чем-то можно подкрепить это утверждение, кроме «я думаю, что это истинно»?

                                    Есть такой грубоватый, но очень уместный аргумент, «отучаемся говорить за всех». Я вот не мучился. Заметьте: говорю исключительно за себя.


                            1. defuz
                              03.12.2015 16:02
                              +3

                              А еще, кстати, часть людей использует «инверсированный» скроллинг, а часть «обычный» – и тем, и другим «естественно» и «интуитивно понятно».


                          1. Ogra
                            03.12.2015 15:51
                            +2

                            Я хочу поделать для себя игрушки, а Матлаба, Октава и Луа для Unity 3D нет.


                            Держите LOVE и пользуйтесь! Это движок для разработки 2д игр на Луа.
                            Если хочется 3Д, берите Urho3D, вот уроки на Хабре. Там в качестве скриптового языка используется та же Луа.


                            1. VasakaInc
                              03.12.2015 18:09

                              Держите LOVE и пользуйтесь! Это движок для разработки 2д игр на Луа.
                              Если хочется 3Д, берите Urho3D, вот уроки на Хабре. Там в качестве скриптового языка используется та же Луа.
                              И ещё раз спасибо.


                          1. defuz
                            03.12.2015 16:12

                            Мне вот интересно, а вы задумывались, почему все эти столь прекрасные высокоуровневые языки программирования не используются для Unity 3D? :)


                            1. Ruckus
                              04.12.2015 10:07

                              Они слишком прекрасны для программистов Unity. =)
                              Вы же правда не думаете, что C# идеален, поэтому они использовали именно его?


                              1. defuz
                                05.12.2015 03:40

                                Я думаю, все гораздо банальнее – дело в производительности.


                      1. defuz
                        03.12.2015 13:50
                        +2

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

                        Программируя на одном из них я столкнулся с вещами, которые неудобны и не просты.
                        Обычная ситуация – вы выбрали неправильный инструмент для решения своей задачи. Я думаю, что Python вам подошел бы гораздо лучше.

                        Мы не имеем возможности сделать это проще и удобней? Да похоже имеем, насколько я понимаю. Тогда почему мы это не делаем?
                        Смотрите какая тут ситуация. Касательно чисел все уже сделали – Python и Ruby являются удачными тому подтвреждениями. Только вот не для всех такое решение оказалось приемлемым, так что языки, в которых нужно думать о размере числа еще надолго останутся с нами.

                        Что касается индексации, то я убежден что у вас просто «дух неприятия» к не привычной вам новой концепции. Тут не сделали не потому что не смогли или религия не позволяет. В конце концов, можно было бы просто добавить новый метод .nth(number), или ввести по два разных типа коллекций, или добавить опцию компиляции, или придумать еще какое-нибудь удачное или не очень решение. Только вот опытные программисты смотрят на это с недоумением, просто потому что для них это выглядит неестественно. Ведь именно индексация с нуля является базовой по объективным причинам, и любая другая индексация будет лишь надстройкой над обычной. А значит, добавление еще одного способа индексации на уровне языка будет создавать избыточность, а программисты очень не любят избыточные API, тем более если речь идет о стандартной библиотеке языка.


                        1. VasakaInc
                          03.12.2015 15:19
                          -1

                          Обычная ситуация – вы выбрали неправильный инструмент для решения своей задачи. Я думаю, что Python вам подошел бы гораздо лучше.
                          Я думаю, на Питоне нельзя писать под Unity 3D, а значит я выбрал лучший вариант из возможных, но речь в топике шла не обо мне. Я лишь описал то, что увидел в современных языках программирования то, чего никак не ожидал увидеть. Думал прогресс шагнул намного дальше.


                          1. AllexIn
                            03.12.2015 15:25

                            Возьмите UE4 и пишите на BluePrints. Зачем вам эти языки, может оно просто не ваше.


                            1. VasakaInc
                              03.12.2015 15:46
                              -4

                              Надо будет почитать про БлюПринт. Спасибо за наводку.

                              P.S. Блин, опять этот вы не можете комментировать чаще чем 1 раз в 5 минут.
                              Я, когда топик писал, думал меня сразу отправят в глубокий и беспросветный минус, а -5 карма при 23 голосах это очень даже неожиданный результат для меня. :) Людей готовых взглянуть на проблему непредвзято оказалось гораздо больше, чем я ожидал.


                              1. defuz
                                03.12.2015 16:05
                                +2

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


                              1. Alexeyslav
                                03.12.2015 16:08
                                -1

                                Это может быть большим заблуждением. Вероятно, много несогласных просто не имеют возможности поставить минус в карму…
                                Еще погодите, народ поприходит с работ и начнётся второй наплыв посетителей.


        1. GarryC
          03.12.2015 14:29
          -2

          Вообще то, на секундочку, в Паскале вообще можете нумеровать массивы хоть с 0, хоть с 1, хоть с -42, хоть со слова ВЛЕВО, и мне как то это не слишком мешало, когда я на нем работал. Автор не ведет речь о том, с какого конца разбивать яйцо удобнее, а всего лишь спрашивает, почему в группе С языков ЗАСТАВЛЯЮТ разбивать яйцо с тупого (ну ладно, с острого), но все равно с одного конца.


          1. defuz
            03.12.2015 14:45
            +2

            Есть конкретные специфические задачи, в которых может быть нужна очень странная индексация, например – задом наперед через 3 значения и чтобы только простые числа. Для всех таких случаев есть возможность определить свой собственный тип и задать в нем такую индексацию, которая заблагорассудиться. Почему все это должно быть в языке из коробки – не совсем ясно. Наоборот, все стараются по максимуму разгрузить стандартную библиотеку. По-этому и предлагается одно универсальное и наиболее эфективное решение – индексация с 0. Все остальное в любом случае реализовывалось бы через него. Просто Pascal делает это за вас.


      1. leshabirukov
        03.12.2015 09:29
        +8

        Индексация с 0 это как вращение Земли вокруг Солнца. В повседневной жизни Солнце двигается по небосводу, но в физике или астрономии ни-ни. Не из уважения к Ньютону, а потому что так расчёты проще.
        Кстати, с общей идеей статьи я согласен, «высокоуровневости» нужно больше.


        1. VasakaInc
          03.12.2015 09:41
          -6

          Кстати, с общей идеей статьи я согласен, «высокоуровневости» нужно больше.
          Да, собственно. Именно в этом и был смысл статьи, а не для того, чтобы разводить холивары.
          Это всего лишь мой взгляд со стороны. Пришёл через 20 лет и удивился, а зачем до сих пор лопатами копают, если повсюду тракторы ездят?

          Естественно, никого не хотел обидеть, но, похоже, тема такая, что даже если 100 раз скажешь, что никого не хотел обидеть, всё равно обидятся.


          1. AllexIn
            03.12.2015 09:44
            +6

            Вы примеры неудачные выбрали.

            Я как-то копал яму лопатой. И мимо проходящий мужик посоветовал мне мотыгой копать.
            Вот ваши примеры такого же рода.


          1. WST
            03.12.2015 09:44
            +2

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


            1. VasakaInc
              03.12.2015 10:31
              -6

              Я вообще-то гуманитарий. Случайно коснулся языков программирования в школе и сейчас. А это мой взгляд со стороны на данную область деятельности и мои удивления некоторым положениям вещей. Я просто был искренне удивлён, что это до сих пор так (это я про пункты в статье).


              1. defuz
                03.12.2015 11:02
                +5

                Ваше ощущение «а воз и ныне там» вызвано исключительно тем, что вы как «гуманитарий» совершенно не туда смотрите.

                Существют фундаментальные аспекты из-за которых концепции, которые вызывают у вас удивление, не меняются и менятся не будут.

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


                1. VasakaInc
                  03.12.2015 11:10
                  -8

                  Существют фундаментальные аспекты из-за которых концепции, которые вызывают у вас удивление, не меняются и менятся не будут.
                  Очень сомневаюсь.
                  Ну, да история нас рассудит.


                  1. defuz
                    03.12.2015 11:13
                    +16

                    История рассудит гуманитариев, а здесь общаются люди аналитического склада ума, которые привыкли оперировать фактами и выводами, а не авторитетными мнениями или историей.


                  1. AllexIn
                    03.12.2015 11:14
                    +1

                    Если уж на то пошло, то чтобы понять почему высокоуровневые языки «такие», надо просто разобраться, почему низкоуровневые «такие». И большая часть вопросов сама собой отпадет.


                  1. Mrrl
                    03.12.2015 11:26
                    -1

                    Я тоже сомневаюсь. Почему это современная архитектура памяти и процессора меняться не будет?
                    Как только адреса ячеек памяти перестанут быть числами, процедура выделения новых ячеек (если в ней ещё останется смысл) будет возложена на чип, а все обращения будут ассоциативными, то и понятие массива перестанет быть низкоуровневым — он будет всего лишь частным случаем словаря.
                    Или произойдёт движение в другую сторону, которое пока сложно даже вообразить (объект в памяти — не число, а процесс? Работа исключительно с картами возбуждённых ячеек, как делает мозг? Нейронная сеть, как первичное понятие?) Мало ли что будет. Особенно, когда память будет распределена по всей Солнечной Системе и окрестностям.


                1. leshabirukov
                  03.12.2015 11:16
                  +4

                  Ваше ощущение «а воз и ныне там» вызвано исключительно тем, что вы как «гуманитарий» совершенно не туда смотрите.

                  К сожалению, свежий взгляд всегда дилетантский.


              1. Temmokan
                03.12.2015 11:27
                +4

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

                А вот наоборот…

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


                1. VasakaInc
                  03.12.2015 12:35
                  -6

                  А вы почитайте то, что писал в комментариях товарищ Ogra, возможно и вы для себя узнаете что-то новое.


                  1. Temmokan
                    03.12.2015 12:46
                    +2

                    Поискал там хоть что-нибудь новое — не обнаружил.

                    Собственно, дискуссия ни о чём, потому что
                    — есть языки, где есть упомянутый отсчёт индексов с нуля
                    — есть те, где с единицы
                    — есть те, где откуда хочешь
                    — и где самого понятия индекса нет

                    На любой вкус.

                    Претензии к языкам, которые используют ноль выглядят странно — как если бы укоряли простые числа, что делятся только на сами себя и на единицу (а это ведь так неудобно!)

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


                1. GarryC
                  03.12.2015 14:34

                  Мы пишем программы не для машин, а для людей, так что удобство машина в ЯВУ может быть расмотрено как малозначащий фактор.


                  1. Temmokan
                    03.12.2015 15:18

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

                    Первое относится к функциональности программы, второе — к методике её создания. Мне как пользователю, в целом глубоко фиолетово, писал ли некто привычную мне программу на C, FORTRAN, ..., Brainf*ck или чём-то ещё — главное, чтобы работала приемлемым для меня образом.


                    1. defuz
                      03.12.2015 16:16

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


                      1. Temmokan
                        03.12.2015 16:22

                        Если человек уже пишет на некоем языке с конкретными умолчаниями и рекомендацями — ожидается, что ориентируется в языке.

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


                        1. defuz
                          03.12.2015 16:27

                          Есть языки с более и с менее «человечным лицом». Вспомните например COBOL.


                          1. Temmokan
                            03.12.2015 17:41

                            Да не, я лучше вспомню PL/1 — на нём реально приходилось работать, а Cobol только так, слегка интересовался.


          1. leshabirukov
            03.12.2015 10:07
            +4

            Сделайте свой трактор. Начните с того, что напишите несколько нетривиальных программ на гипотетическом языке из головы. Если получилось, реализуйте транслятор с этого языка.


            1. VasakaInc
              03.12.2015 10:28
              -7

              На данный момент я даже близко не обладаю той квалификацией, чтобы написать свой язык программирования. К сожалению. Моя профессиональная область деятельности — психология и я просто не могу уделить столько времени программированию. Хотя, было бы интересно. :)


              1. leshabirukov
                03.12.2015 11:14
                +4

                Чтобы написать программу на языке из головы не надо быть программистом. Хотя двусмысленность и нечеткость некоторых языковых конструкций всплывёт лишь при реализации. Как психологу, вам возможно будет интересно взглянуть на язык естественный с формальной стороны. Можно почитать что-то по компьютерной лингвистике.


                1. VasakaInc
                  03.12.2015 12:45
                  -4

                  Я, как психолог, могу вам много интересного рассказать. Например то, что каждый человек является программистом. С самого детства каждый из нас начинает писать (сам того не осознавая) программы для своего сознания. Как ходить, как говорить, как читать, как писать, как водить автомобиль… и так далее. Если знать об этом, то можно понаблюдать как формируются эти программы в сознании и как мы вносим в них изменения. Так что понаблюдать за естественным языком программирования можно даже не зная, что существует такая область деятельности — программирование. И это действительно очень увлекательная и интересная область для исследований — программирование человеческого сознания. Но вот написать собственный язык программирования я пока не в силах, хотя и не исключаю, что когда-нибудь и до этого руки дойдут. Мне кажется, это должно быть очень интересное занятие.


                  1. lair
                    03.12.2015 13:04
                    +1

                    Вот только есть программы и программы. Знаете, в чем фундаментальное отличие «программ для сознания» от современных программ для компьютеров?


                  1. defuz
                    03.12.2015 16:25
                    +4

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


      1. misha_shar53
        03.12.2015 09:36
        -8

        Еще как замахнулся. И таких скелетов в шкафу хоть отбавляй. Для программирования типы данных вообще не нужны.И тип данных массив с индексацией с 0 тоже ненужен. В языке высокого уровня MUMPS ни типов ни массивов. А структура данных только одна дерево. Это тебе и массив с индексацией хоть от чего и список и стек. На все случаи жизни хоть в оперативной памяти хоть на диске. А все современные языки это топтание вокруг языка Си с его базовыми концепциями.


        1. VasakaInc
          03.12.2015 09:43
          -1

          Вот и мне так показалось. Спасибо. Не один я такой.
          Обязательно почитаю про MUMPS.


          1. misha_shar53
            03.12.2015 10:09
            -1

            По моему самая простая реализация MUMPS http://www.minimdb.com/
            Там же есть книга по MUMPS http://www.minimdb.com/mbook/mumps_dbms.pdf


            1. VasakaInc
              03.12.2015 10:33
              +1

              Ещё раз спасибо!!!


        1. defuz
          03.12.2015 10:54
          +15

          Для математики числа вообще не нужны! И понятие бесконечности тоже не нужно! Вон в гомотопической теории типов нет ни чисел, ни бесконечности. Все что угодно – это термы определенного типа, и больше ничего не нужно!

          А все современные языки это топтание вокруг языка Си с его базовыми концепциями.
          Вы бесконечно наивны и милы в этом утверждении. Дело не в С, и это не вопрос вкуса. Нравится вам это или нет, хотите вы думать об этом или не хотите, но типы данных действительно существуют, указатели самые настоящие, память выделяется и освобождается, и увы она не бесконечна. Так устроена архитектура компьютера и языки программирования здесь ни при чем.


          1. Alexeyslav
            03.12.2015 11:37
            +1

            И тут надо уточнить, что высокоуровневые языки всё же возможны но плата за это — падение эффективности. Вместо того чтобы одной командой умножить два вещественных числа за пару тактов процессора ЯВУ вынужден обходится операциями с BCD и длинными числами — ведь нам нужны универсальные числа с абсолютной точностью… что занимает по меньшей мере десятки и сотни тактов процессора, требует доступа к медленной RAM и т.д. всё это цена высокого уровня.
            В то время как программа написанная на чистом С выполняется за минуту, ваша программа написанная на естественном языке с применением универсальных чисел делает то же самое за десяток часов.


            1. defuz
              03.12.2015 11:47
              +1

              Никто не спросит с тем, что можно много всяких разных абстракций придумать и реализовать. Хороших или плохих, дырявых или не очень. Просто меня удивляют люди, которые в просвещенном гневе после десятиминутного знакомства с LISP или Haskell кричат «все есть дерево!» или «все есть монада!» и что C – это отстой и нужно все придумать заново. Успех языка С заключается как раз в том, что он очень хорошо отображает то, как программа выполняется на самом деле, предлагая при этом относительно хороший уровень абстракции и удобночитаемость кода.


        1. lair
          03.12.2015 11:59
          +5

          Для программирования типы данных вообще не нужны.

          Ага, как же. То, что в вашем языке полтора типа, еще не значит, что они никому не нужны.


  1. EndUser
    03.12.2015 08:54
    +6

    http://local.joelonsoftware.com/wiki/Закон_Дырявых_Абстракций
    Продолжайте изучать программирование, или откажитесь вовсе.


  1. AllexIn
    03.12.2015 08:57
    +20

    Вы критикуете то, чего не понимаете. Не надо так.

    Я вообще новичков не минусую без веской причины… Но критика индексации с нуля — это та самая веская причина.

    В остальном — откройте для себя скриптовые ЯП.
    Lua — индексация откуда сами захотите.
    Числовой тип один — number.


    1. VasakaInc
      03.12.2015 09:09
      -10

      Я вообще новичков не минусую без веской причины… Но критика индексации с нуля — это та самая веская причина.
      Я уже давно понял, что в среде программистов индексация с 0 это священная корова. Этой темы нельзя касаться никогда просто потому, что нельзя никогда. Не думаю, что это разумный подход.

      В остальном — откройте для себя скриптовые ЯП.
      Lua — индексация откуда сами захотите.
      Числовой тип один — number.
      Спасибо за наводку!
      Обязательно почитаю про Lua.

      P.S. И оказывается я не могу комментировать чаще чем 1 раз в 5 минут, весело.
      Люди, отвечу всем, но тогда придётся подождать.


      1. AllexIn
        03.12.2015 09:11
        +8

        Я уже давно понял, что в среде программистов индексация с 0 это священная корова. Этой темы нельзя касаться никогда просто потому, что нельзя никогда.

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


        1. VasakaInc
          03.12.2015 09:18
          -1

          Верно. Индексация с нуля один из тех нюансов, который помогает решать задачи проще.
          Касаться этой темы можно, но для начала не плохо было бы в ней разобраться.
          Пока что мой опыт говорит как раз совсем о противоположном. Объясните чего именно я не вижу и не понимаю?


          1. AllexIn
            03.12.2015 09:22
            +12

            Пока ощущение, что опыта у вас просто нет.
            Простой пример. Рисование колонки элементов:
            Индексация с нуля:

            for (int item = 0; item<count; item++)
              drawItem(item, 0,item*ITEM_HEIGHT,ITEM_WIDTH,ITEM_HEIGHT); //x,y,width,height
            

            Индексация с единицы:
            for (int item = 1; item<=count; item++)
              drawItem(item, 0,item*ITEM_HEIGHT-ITEM_HEIGHT,ITEM_WIDTH,ITEM_HEIGHT); //x,y,width,height
            


            Примитивный, но распространенный пример, в котором мы имеем лишнюю операцию на ровном месте.
            И так всегда! Почти не бывает примеров, где индексация с 1 удобнее.

            В качестве домашнего задания: напишите вычисление индекса в двухмерном массиве при индексации с нуля и с единицы.


            1. VasakaInc
              03.12.2015 09:37

              Пока ощущение, что опыта у вас просто нет.
              Опыта у меня действительно не много.
              Спасибо за примеры, буду думать.


              1. AllexIn
                03.12.2015 09:39
                +6

                Обратите внимание, что во втором примере вычитание высоты элемента равносильно вычитанию 1 из индекса.
                То есть — приведение индексации к традиционному варианту с 0.


                1. VasakaInc
                  03.12.2015 09:49
                  -1

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


                  1. poxu
                    03.12.2015 10:31
                    +3

                    Про индексанцию с нуля можно сказать гораздо проще и без кода. От еденицы до девяти — девять чисел. А от десяти до девятнадцати — десять. Чтобы первый разряд не отличался от остальных — надо считать с нуля. Так и рассказывайте тем, кто ещё не сталкивался с программированием.


                    1. VasakaInc
                      03.12.2015 10:35
                      -2

                      А мы (ну, обычные люди) всегда считали от единицы и до десяти. Ровно десять получается. Как и от одиннадцати до двадцати.


                      1. Mrrl
                        03.12.2015 10:44
                        +8

                        Но почему-то большинство «обычных людей» решили, что новое тысячелетие началось в январе 2000 года. Хотя, если считать с единицы (как годы и считаются), то оно началось в 2001 году. Так что ещё вопрос, что естественнее.


                        1. Ivan22
                          03.12.2015 10:52

                          Это были программисты — для них самый-самый начальный год имел название: «нулевой год от Рождества Христова»
                          И тогда 2000-й это начало 3-го тысячелетия, все сходится!!!


                          1. defuz
                            03.12.2015 11:11
                            +1

                            Иисус родился предположительно в промежутке от 12го до 4го до рождества Христова. Врядли программисты могли так налажать.


                            1. Ivan22
                              03.12.2015 11:52
                              +2

                              Ха. Это еще невинный баг. Он мог вообще не родится, и даже без обработки исключния. Просто форейн кей в субд на папу не налловый, а в списке всех людей нужного id для отца не нашлось — и бац.


                        1. KvanTTT
                          03.12.2015 12:15
                          +6

                          Я, бывает, путаю века. И это все из-за того, что они начинаются от 1, а не от 0! Как было бы удобно, если 1900-ые, например, были бы 19 веком, а не 20.


                          1. Ruckus
                            04.12.2015 10:22

                            Тут инетерсный момент. Был ли нулевой год? И годом и веком мы определяем текущий промежуток времени, а не прошедший. И тут очень интересный факт по поводу тысячелетий — если текущий год 2000, то прошло 1999? Тогда и правда, о каком миллениуме речь? Новое тысячелетие наступает именно с наступлением 2001 года. Но людишкам нравятся круглые даты и поэтому начало нового десятилетия это XXX0, столетия XX00, тысячелетия X000, увы. Зато по программерски, но начало у них всё же с единицы, пруф.


                        1. KamiSempai
                          03.12.2015 18:48

                          Есть еще вариант — 2048 год.


                      1. defuz
                        03.12.2015 11:07
                        +2

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


                        1. 4dmonster
                          03.12.2015 11:18
                          +2

                          А мне кажется, что «обычные люди» считают количество, а не индекс.


                          1. VasakaInc
                            03.12.2015 11:20

                            Точно! И первый элемент массива у них первый, а не нулевой. :)


                            1. 4dmonster
                              03.12.2015 11:22
                              +2

                              Тогда примите тот факт, что в программировании указывается индекс, а не номер по порядку.


                          1. defuz
                            03.12.2015 11:41
                            +2

                            С первого взгляда вы правы, а со второго подумайте, почему первое называют «первым», второе – «вторым», а третье – «третим». Что это, как не индексация с единицы?


                            1. 4dmonster
                              03.12.2015 11:50

                              Да, вы правы.
                              Получается что это всё — унаследованное.


                              1. defuz
                                03.12.2015 12:03
                                +1

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

                                Именно язык и только он формирует стереотипное представление о том, что счет с единицы – естественный.


                          1. KepJIaeda
                            03.12.2015 12:50
                            +3

                            Нужно учиться мыслить абстрактно. Нужна фантазия и хорошее воображение. «0» одно из гениальных изобретений человечества, наряду с колесом (даже формой похожи). Если хотите считать с единицы, попробуйте создать систему координат без «0». Как же описать отсутствие этого количества (яблок может и не быть, но 0 яблок существуют).


                            1. Ogra
                              03.12.2015 12:56

                              Научиться считать можно хоть с -2, но что это доказывает?
                              Индекс, смещение, порядковый номер, количество — разные понятия, и не надо думать, что раз 0 хорош в описании количества и просто необходим при описании смещения, то ему самое место в порядковом номере или индексе. Учитесь мыслить абстрактно.


                              1. defuz
                                03.12.2015 13:14
                                +2

                                Научиться считать можно хоть с -2, но что это доказывает?
                                Это доказывает то, что считать можно в общем-то начиная с любого числа. И позволяет нам задатся законным вопросом – а какой счет будет наиболее естественным и удобным.

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


                                1. Ogra
                                  03.12.2015 13:20

                                  И эти задачи известны: некоторые математические ряды и адресация ячеек данных, для обоих случаев причины подсчета с нуля объективны. Для абстрактного «давайте все считать с нуля» это не годится.


                                  1. ad1Dima
                                    03.12.2015 13:22

                                    А ещё задачи связанные с UI или вы там тоже начало координат предлагаете в 1 перенести?


                                    1. Ogra
                                      03.12.2015 13:25

                                      Координаты определяют положение, т.е. — смещение от начала координат. Нет такого понятия как «первая» координата или «последняя».


                                      1. ad1Dima
                                        03.12.2015 13:35

                                        Индекс определяет положение, т.е. — смещение от начала.

                                        Я говорю что в случае если у вас массив координат, ширин, либо любых других графических величин — считать индексы с 0 удобнее. Это третий и весьма распространённый класс задач, который вы пропускаете.


                                        1. 4dmonster
                                          03.12.2015 13:40

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

                                          Индекс, оказывается, не тождественен смещению.


                                        1. Ogra
                                          03.12.2015 13:41

                                          Массив ширин? Можно пример?


                                          1. ad1Dima
                                            04.12.2015 10:21

                                            Не массив ширин, но то, что я имел ввиду:

                                            for(int i = 0; i < buttons.Length; i++)
                                            {
                                                buttons[i].X = i * SOME_CONST_BUTTON_WIDTH; 
                                            }
                                            


                                            1. Ogra
                                              04.12.2015 10:32

                                              А теперь прибьем массив кнопок не к левому, а к правому краю экрана:

                                              for(int i = 0; i < buttons.Length; i++)
                                              {
                                                  buttons[i].X = SCREEN_WIDTH - i * SOME_CONST_BUTTON_WIDTH - 1; 
                                              }
                                              

                                              Или вам никогда в UI не встречались задачи вида «прибить к правому краю»?


                                              1. ad1Dima
                                                04.12.2015 10:41

                                                тогда уж

                                                for(int i = 0; i < buttons.Length; i++)
                                                {
                                                    buttons[i].X = SCREEN_WIDTH - (i +1) * SOME_CONST_BUTTON_WIDTH; 
                                                }
                                                


                                                ну, или как вы хотели

                                                for(int i = 0; i < buttons.Length; i++)
                                                {
                                                    buttons[i].X = SCREEN_WIDTH - i  * SOME_CONST_BUTTON_WIDTH - SOME_CONST_BUTTON_WIDTH; 
                                                }
                                                


                            1. 4dmonster
                              03.12.2015 13:02

                              Считают предметы и так все с 1, т.к. традиционно 0 яблок не называется.
                              А вот индексы с 0. Отсюда и споры.


                              1. Ruckus
                                04.12.2015 10:37

                                А что вы называете индексами? «Нулевое яблоко» это индекс?


                                1. Ogra
                                  04.12.2015 10:42
                                  +1

                                  Индекс это «метка», по которой можно найти в коллекции объектов нужный.
                                  array[0] — 0 это индекс, map['abc'] — abc это индекс и так далее.


                                  1. Ruckus
                                    04.12.2015 11:38

                                    Я имел ввиду реальный мир и яблоки. =) Если говорить о программировании, то индекс может быть и строкой, как вы только что продемонстрировали, но стандартные массивы подразумевают именно численное индексирование. Если языки высокого уровня создаются для того, чтобы человеку было проще и интуитивно понятней, то какая аналогия у индекса массива в реальном мире, которая начинается с нуля и имеет исключительно целые неотрицательные значения?


                                    1. Ogra
                                      04.12.2015 11:44

                                      В некоторых математических рядах (Тейлора, например) нулевой индекс имеет значение.
                                      В реальном мире не припомню потребности в нем =)


                                      1. Mrrl
                                        04.12.2015 11:54
                                        +1

                                        Отпуск начался 13-го числа. Каким числом был 5-й день отпуска?
                                        Лифт не работал, и на 16-й этаж пришлось подниматься пешком. Дошли до 6-го этажа. Какую часть пути мы преодолели? Ведь 3/8 же? ;)
                                        В обоих случаях нумерация с нуля была бы удобнее.


                                        1. ad1Dima
                                          04.12.2015 12:14

                                          в соседней ветке уже писали про ground flour. В русском варианте есть цокольный этаж и, когда он есть, именно в него идет вход с улицы (и лифт), а над ним 1й этаж


                                          1. Ruckus
                                            04.12.2015 12:23

                                            Это лишь понятие, которое у нас не очень прижилось. В торговых центрах с подземными этажами нередко в лифтах замечал этажи ..., -1, 1,… без нуля вообще. Так что не менее спорная тема.


                                            1. ad1Dima
                                              04.12.2015 12:35

                                              Это лишь понятие, которое у нас не очень прижилось

                                              если вы про цоколь, то в советское время его мало строили. До этого чаще, сейчас тоже иногда прибегают к нему.


                                              1. Mrrl
                                                04.12.2015 12:40
                                                -1

                                                Но даже когда строят этаж «без номера» и без квартир, этаж над ним оказывается вторым, а не первым.


                                                1. ad1Dima
                                                  04.12.2015 12:43
                                                  +1

                                                  голословное утверждение. Возможно верное в отдельных случаях, но не во всех, и вряд ли даже в половине.


                                          1. WST
                                            04.12.2015 12:29

                                            В ЮВА может быть даже так, что на уровне земли идёт GF, затем UG (upper ground) — и лишь потом «первый» этаж.


                      1. poxu
                        03.12.2015 11:15
                        +4

                        Если считать от одиннадцати до двадцати, то придётся запихнуть в одну группу числа с разным первым разрядом. И этого обычные люди уже не делают ибо тут нелепость происходящего самоочевидна.

                        Людям свойственно путать количество и порядковый номер. И часто им удобно, когда количество совпадает с порядковым номером. И тогда начинают считать от еденицы. Далее людям удобно, чтобы предметы стояли группами по 10. И тогда 11 и 20 приходится ставить вместе. Группы тоже считают с еденицы. И получается, что предмет номер 20 находится во второй группе, а предметы с 21 по 30 в третьей. Что уже тоже неудобно. Приходится постоянно вычитать еденицу, но не всегда, а только когда число делится на 10.

                        Выход из положения — считать с нуля, а для выяснения количества прибавлять еденицу. Всегда, а не только когда число делится на 10. Что собственно и сделано в программировании.


            1. Ogra
              03.12.2015 10:54
              +2

              Простой пример в ответ, рисование рамки вокруг экрана, воспользуемся функцией drawLine(x1, y1, x2, y2).
              Индексация с нуля, попробуйте забыть -1 и получите Access Violation, SEGFAULT или просто порчу данных:

              drawLine(0, 0, ITEM_WIDTH-1, 0); // top line
              drawLine(0, 0, 0, ITEM_HEIGHT-1); // left line
              drawLine(ITEM_WIDTH-1, 0, ITEM_WIDTH-1, ITEM_HEIGHT-1); // right line
              drawLine(0, ITEM_HEIGHT-1, ITEM_WIDTH - 1, ITEM_HEIGHT-1); // bottom line
              


              Индексация с единицы:
              drawLine(1, 1, ITEM_WIDTH, 1); // top line
              drawLine(1, 1, 1, ITEM_HEIGHT); // left line
              drawLine(ITEM_WIDTH, 1, ITEM_WIDTH, ITEM_HEIGHT); // right line
              drawLine(1, ITEM_HEIGHT, ITEM_WIDTH, ITEM_HEIGHT); // bottom line
              


              Индексация с нуля дает плюсы, когда мы работаем с началом массива, но индексация с единицы удобнее, когда надо работать с концом массива (обращаясь к последнему элементу через длину массива без "-1").
              Поэтому я не могу сказать, что какой-то из вариантов лучше, понятнее или проще. Они равнозначны.


              1. Mrrl
                03.12.2015 10:59

                Тогда лучший вариант — в бейсике, где массив Dim(N) имеет индексы от 0 до N. И ничего забыть не удастся :)


                1. Ogra
                  03.12.2015 11:01

                  Еще лучше в Паскале, где можно явно задать границы массива! =)


                  1. Alexeyslav
                    03.12.2015 11:45

                    Но это аукнется дополнительной операцией приведения и проверкой на диапазон перед обращением к ячейке памяти, что в целом скажется на производительности такой программы.


                    1. Ogra
                      03.12.2015 11:48

                      Что имеет огромное значение в низкоуровневых языках, но не такое уж и существенное в языках высокого уровня. Всему свое место.


                    1. VasakaInc
                      03.12.2015 11:51

                      Давайте писать исключительно на ассемблере. Вот где с производительностью нет никаких проблем!


                      1. AllexIn
                        03.12.2015 11:54
                        +8

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


                        1. VasakaInc
                          03.12.2015 13:35
                          -4

                          Вы сравниваете ЛУЧШИЙ код на С++ с СРЕДНИМ на ассемблере.
                          Очевидно, что сравнение некорректно.
                          С таким же успехом можно говорить, что специалист по Яве напишет более эффективный код, чем большинство новичков на С++.


                          1. AllexIn
                            03.12.2015 13:39
                            +3

                            Я сравниваю компилятор с человеком. А не два языка.


                        1. Alexeyslav
                          03.12.2015 14:21

                          Только вот компилятор без подсказок такое может наоптимизировать… А потом оглядываешься и оказывается что программировать с умным компилятором не так уж и легко.


              1. AllexIn
                03.12.2015 11:06
                -1

                Зачем такой сложный пример?
                Вот куда проще:
                for i := 0 to Length(Items)-1 do

                Действительно, приходится дописывать -1 при указании последнего элемента. Вот только вычисления все идут от начала, а не от конца. Соответственно у нас есть куча разных ситуаций, где надо высчитать смещение элемента и все эти ситуации вертятся вокруг начала блока данных. Миллионых разных формул, которые становятся проще при индексации от нуля. И одна не меняющаяся ситуация с -1 для определения конца блока данных.
                Что проще, запомнить один единственный случай когда надо писать -1, или для каждой формулы вводить кучу поправок чтобы в итоге привести индекс к тому же 0.


                1. Ogra
                  03.12.2015 11:09
                  +1

                  Миллионых разных формул, которые становятся проще при индексации от нуля.

                  Можно увидеть хотя бы парочку, не относящихся к Фурье?


                  1. AllexIn
                    03.12.2015 11:10

                    Практически любое вычисление индекса. Вам примеров в этой теме мало?


                    1. Ogra
                      03.12.2015 11:17
                      +1

                      Вот вам пример в ответ, про вычисление индекса:
                      en.wikipedia.org/wiki/Binary_heap#Heap_implementation

                      Let n be the number of elements in the heap and i be an arbitrary valid index of the array storing the heap. If the tree root is at index 0, with valid indices 0 through n ? 1, then each element a at index i has

                      children at indices 2i + 1 and 2i + 2
                      its parent floor((i ? 1) ? 2).

                      Alternatively, if the tree root is at index 1, with valid indices 1 through n, then each element a at index i has

                      children at indices 2i and 2i +1
                      its parent at index floor(i ? 2).


                      1. AllexIn
                        03.12.2015 11:28

                        Поэтому я и написал «практически», а не «все».
                        Вместо «практически», можно использовать «подавляющее большинство».


                        1. Ogra
                          03.12.2015 11:45
                          +1

                          Хотелось бы все же увидеть примеры. А то голословных заявлений «практически все», «почти не бывает примеров, где индексация с 1 удобнее» много, а кода мало. Единственное, что упоминалось толкового — реализация двумерного массива одномерным.


                          1. commanderxo
                            03.12.2015 13:16
                            +1

                            Наверное в этом и кроется причина «проблемы» — память компьютера по своей природе одномерный массив, а в ней сплошь и рядом надо хранить многомерные структуры, будь то классическая таблица или компонента R пикселя с координатами X и Y в кадре Z.

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

                            В JavaScript индексировать можно чем угодно, не обязательно числами, однако недавно мне опять пригодилась индексация с 0 при манипуляции с пикселями на canvas. Хорошо это или плохо, но N-мерные массивы постоянно встречаются в нашей жизни.


                      1. Mrrl
                        03.12.2015 11:30
                        +1

                        Пример хороший. Но конкретно в этой задаче приходится аккуратно следить за тем, до какого места вести цикл и как записать условие «у данного элемента ровно один потомок» и в ситуации, когда индексация идёт с нуля, и когда она с единицы. Усилия и шансы ошибиться одинаковы.


                        1. Ogra
                          03.12.2015 11:34

                          О том и речь, усилия и шансы одинаковы. Ни к чему ломать копья.
                          Индексация с нуля необходима в языках низкого уровня, близких к железу, потому что железо оперирует смещениями. У языков высокого уровня должен быть выбор индексации по запросу программиста, наиболее подходящий для задачи.


                          1. AllexIn
                            03.12.2015 11:36
                            +1

                            Выбор индексации путает.
                            Как минимум должен быть разный синтаксис в зависимости от индекса. Чтобы было визуально видно по коду с какой индексацией мы работаем.


            1. BloodJohn
              03.12.2015 12:00
              +1

              Нюанс в том, что счет с нуля это не количество, это смещение.

              Но понимание таких нюансов требует понимания природы числа, понимание величин.

              Гуманитарию это недоступно. Для него числа ограничиваются счетом яблок в школе.
              Поэтому гуманитарий будет рассказывать нам про коров и про то что никого не хотел обидеть.
              Стена непонимания, которую не пробить.

              Извините!


              1. lair
                03.12.2015 12:06
                +5

                Гуманитарию это недоступно. Для него числа ограничиваются счетом яблок в школе.

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


  1. StrangerInRed
    03.12.2015 09:12
    +1

    Имхо:
    1. Традиции
    2. Оптимизации по памяти (рантайм определенные)
    3. Оптимизация по скорости и памяти (рантайм определенные)

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


    1. AllexIn
      03.12.2015 09:40
      +9

      Индексация с нуля — это не традиции, а математика.

      Математически индексация с 1 также не естественна, как индексация с 2 или 5.


      1. StrangerInRed
        03.12.2015 09:51
        -1

        Да тоже сейчас подумал об этом. Все ведь началось с математики.


      1. Ruckus
        04.12.2015 10:29
        -2

        А детей как учат считать?
        Надеюсь вы своего будете учить «математике» так:
        _
        |_|
        «Здесь 1 кубик, по счёту он нулевой»

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


        1. AllexIn
          04.12.2015 10:31

          Не пытайтесь лезть туда, где ничего не понимаете.
          Этот кубик первый, смещение у него нулевое. А не «по счету он нулевой». Что вообще за выражение «по счету»? Из какого учебника математики вы его взяли?


          1. Ruckus
            04.12.2015 10:47
            -1

            Когда мы оперируем индексами массива логичней брать не машинное понятие «смещение», а человеческое «номер», как это чаще всего и называется. Порядковый номер элемента — самое логичное, что приходит на ум.
            Выражению «по счёту» учат в детских садах и начальных школах нашей необъятно родины. Вырезка из первой попавшейся в интернете презентации:
            «2.Методика обучения детей среднего дошкольного возраста порядковому счету. По мере ознакомления детей с первыми тремя числами их учат порядковому счету в пределах 5 и умению отличать его от количественного счета, правильно отвечать на вопросы: «Сколько всего?», «Который по счету?». Порядковый счет дается вместе с количественным в целях отличия их. На первом занятии необходимо раскрыть значение порядковых числительных. Раскрыть порядковое значение числа позволяет сопоставление его с количественным значением. Количественный счет: «Сколько?» — «один, два, три». Порядковый счет: «Который?», «Какой по счету?» — «первый, второй, третий». » (с) nsportal.ru/detskiy-sad/matematika/2013/04/21/prezentatsiya-po-matematike
            Так же стоит отметить, что программист не обязательно математик, а значит познания высшей математики не должны быть необходимостью. Хотя я был бы не против, если бы вы привели мне вашу математику, в которой индексация с нуля.


            1. ad1Dima
              04.12.2015 11:17

              Так же стоит отметить, что программист не обязательно математик

              Иногда физик…
              Хотя я был бы не против, если бы вы привели мне вашу математику, в которой индексация с нуля.

              Геометрия. Любая система координат.


              1. Ruckus
                04.12.2015 11:25
                -1

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


                1. Mrrl
                  04.12.2015 11:39
                  +2

                  Числовые последовательности индексируются так, как это удобно. Например, коэффициенты многочленов чаще всего нумеруются с нуля (чтобы индекс совпадал со степенью). Какие-нибудь числа Фибоначчи можно задать как F1=F2=1, так и F0=0, F1=1. Более того, отрицательные индексы (вплоть до минус бесконечности) тоже не редкость.
                  Если подумать, то оказывается, что последовательность может с равными шансами как содержать нулевой элемент, так и не содержать его. Это связано с тем, что индекс может использоваться в формуле для самого элемента — и писать k-1 только чтобы избежать наличия нулевого элемента никто не будет.
                  Зато если набор конечен, и индексы не имеют математического смысла — например, координаты вектора — то нумерация практически всегда с единицы. И множество из N элементов — это {1,...,N}… до тех пор, пока мы не начинаем работать с остатками от деления. В этот момент мы переключаемся на {0,..,N-1} (а иногда и {-(N-1)/2,...,(N-1)/2}), и не испытываем по этому поводу абсолютно никаких душевных мук.
                  Свобода лучше несвободы :)


                  1. Ruckus
                    04.12.2015 11:49

                    Вы правы, прошу прощения за свою ошибку. Но в таком случае получается, что индексация с нуля взята вовсе не из математики, как писал AllexIn, а из особенностей реализации массивов в языках программирования. Так?


                    1. lair
                      04.12.2015 11:53

                      1. Ruckus
                        04.12.2015 12:19

                        Я правильно понял, что он рассуждает примерно так:
                        «Вариант а и б лучше, потому что разность границ даст длину»
                        «Вариант б лучше ибо в а нам надо будет прибавлять единицу к концу»
                        ?
                        Это же исключительно субъективное мнение и оптимальность вычислений, которая в ЯВУ как правило скрывается «под капотом»?
                        По мне так самым красивым выглядит вариант «c» так как мы сразу видим какой элемент будет первым, а какой последним, а вам какой вариант больше нравится?


                        1. Mrrl
                          04.12.2015 12:39

                          А когда как. В таких случаях, как быстрая сортировка, двоичный поиск, heapsort, и в других ситуациях, когда приходится работать с последним элементом, удобнее . В большинстве других случаев — (а). Иногда было удобно использовать (b) (заполняя массив операцией M[++a]=x).


                        1. lair
                          04.12.2015 13:15

                          Я правильно понял,

                          Не вполне.

                          Вариант а и б лучше, потому что разность границ даст длину

                          Еще и потому, что для прилегающих интервалов «внутренние» границы будут совпадать.

                          Вариант б лучше ибо в а нам надо будет прибавлять единицу к концу

                          Этого там вообще нет.

                          По мне так самым красивым выглядит вариант «c» так как мы сразу видим какой элемент будет первым

                          Как в варианте выглядит пустая последовательность?

                          оптимальность вычислений, которая в ЯВУ как правило скрывается «под капотом»?

                          Если вас не волнует оптимальность вычислений, зачем вам вообще массив?

                          Это же исключительно субъективное мнение

                          А «мне неудобно» — это не субъективное мнение?

                          (зато вот возможность простых операций по модулю — это объективная данность)


                          1. Ruckus
                            04.12.2015 15:26

                            не волнует оптимальность вычислений

                            Я такого не говорил, я лишь сказал, что её можно спрятать в угоду удобности во внутрь языка(в компилятор, например).

                            А «мне неудобно» — это не субъективное мнение?

                            Субъективное, но объективно, что не знакомым с программированием людям понятней одно, чем другое. Я тоже когда-то учился и для меня был большой вопрос почему это так, приходилось ломать своё мышление и подстраивать под другие реалии. Сейчас мне будет неудобней работать с тем вариантом, который предлагает автор, но я бы не стал утверждать, что он неправильный т.к. я так привык или «так оптимальней» ибо в ЯВУ от «машинности» как раз и надо уходить в «человечность» создавая преобразователь из одного в другое посередине, который и называется ЯВУ(сам оптимизирует, сам следит за памятью, сам делает преобразования типов и т.д.).

                            Этого там вообще нет.

                            when starting with subscript 1, the subscript range 1 ? i < N+1; starting with 0, however, gives the nicer range 0 ? i < N

                            Прошу прощения, бегло пробежал, неправильно понял эту строчку. Мне было бы приятней получить 1 ? i ? N.

                            Как в варианте выглядит пустая последовательность?

                            Любая последовательность, где конец раньше начала? Хотя после питона это тоже неприятно, логично получить при [3:3] третий символ, а [3:1] с третьего по первый (включительно) в обратном порядке.
                            Позвольте задать встречный вопрос, вам часто нужна пустая последовательность?

                            P.S. Я рассуждаю не за ту или иную сторону. Мне на самом деле сейчас удобней нумеровать с нуля, НО я считаю, что развивать языки в человеческую сторону надо и я помню себя, когда я только начинал, мне тоже это было неудобно.
                            Еще и потому, что для прилегающих интервалов «внутренние» границы будут совпадать

                            Пример из реальной жизни:
                            «С первого по пятый налево с пятого по десятый направо»? Так куда же пятому идти? Чаще на самом деле говорят «с шестого по десятый», что и логично.


                            1. lair
                              04.12.2015 15:35

                              Я такого не говорил, я лишь сказал, что её можно спрятать в угоду удобности во внутрь языка(в компилятор, например).

                              Если вы ее прячете, то она вас больше не волнует. Но даже если вы ее «просто» прячете, все равно — зачем вам массив?

                              но объективно, что не знакомым с программированием людям понятней одно, чем другое

                              На основании чего вы делаете такой вывод?

                              Любая последовательность, где конец раньше начала?

                              2 ? i ? 1? Это нелогичная запись.

                              Позвольте задать встречный вопрос, вам часто нужна пустая последовательность?

                              Она регулярно встречается в алгоритмах как базовый случай.

                              «С первого по пятый налево с пятого по десятый направо»? Так куда же пятому идти? Чаще на самом деле говорят «с шестого по десятый», что и логично.

                              «Работаем с часу до трех, с трех до пяти отдыхаем» — что делаем в три часа?

                              Аналогии плохи тем, что на любую аналогию можно подобрать контраналогию.


                              1. Ruckus
                                04.12.2015 16:03

                                зачем вам массив?

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

                                На основании экстраполяции выборки моих бывших одноклассников и одногрупников, которые учились программированию на количество населения. От 80% до 100% из них пытались использовать массивы с единицы или считали последним индексов размер во время обучения.
                                2 ? i ? 1? Это нелогичная запись.

                                В питоне, например, почти эта запись вполне логична и мне это нравится в нём. Правда там она выглядит a[2:1] и выводит элементы со второго по первый не включительно, хотя приятней было бы если единица всё же включалась, но как есть, я привыкну.
                                Она регулярно встречается в алгоритмах как базовый случай.

                                Вот это, как мне кажется, не очень логично. Проводить операции на пустом множестве странно.
                                «Работаем с часу до трех, с трех до пяти отдыхаем» — что делаем в три часа?

                                Аналогии плохи тем, что на любую аналогию можно подобрать контраналогию.

                                Вы правы. =(
                                Но час делим, а люди нет. Потому в вашей аналогии считается момент наступления трёх часов, т.е. до 2:59:59 включительно можно сказать. Но восприятие уже теряется, вы правы. Тем не менее в массивах чаще хранят «работников» нежели время.


                                1. WST
                                  04.12.2015 16:06
                                  +2

                                  Немного не в тему, но всё же… У нас в городе не так давно водоканал расклеивал объявления примерно такого содержания: «вода будет отключена с полуночи 17 октября до полуночи 18 октября». Многим тогда сорвало башню это объявление :)


                                  1. Ruckus
                                    04.12.2015 16:12

                                    Да, очень неприятный пример. Ещё я никогда не мог понять «сегодняшняя ночь» это какая, перед утром или после вечера? Хуже всего, что «единого правила» нет и часть может это использовать в одном смысле, а другая часть в другом (как и ваше объявление), важней всего иметь общие правила и обеспечить, чтобы их все знали.


                                  1. Alexeyslav
                                    05.12.2015 20:28

                                    Это значит с 00:00 17-го октября по 23:59 18 октября, это ж ясно как божий день!


                                    1. Ruckus
                                      05.12.2015 22:28

                                      А вы какой из 00:00 взяли? Утренний или вечерний?
                                      Если рассуждать логически, то 17 октября начинается с 00:00 и заканчивается в 23:59, тогда в вашем утверждении отключение было на двое суток.


                                      1. Alexeyslav
                                        05.12.2015 22:49
                                        +1

                                        Именно! Люди вроде думают что одни сутки, а на самом деле у коммунальщиков есть двое из-за этой неоднозначности.


                                1. lair
                                  04.12.2015 16:11

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

                                  Зачем вам для этого массив? Есть последовательности, есть списки — чем вам массив-то сдался?

                                  На основании экстраполяции выборки моих бывших одноклассников и одногрупников, которые учились программированию на количество населения.

                                  Картинку про экстраполяцию видели?

                                  В питоне, например, почти эта запись вполне логична и мне это нравится в нём.

                                  В питоне нет такой записи.

                                  Правда там она выглядит a[2:1] и выводит элементы со второго по первый не включительно

                                  Это другая запись. Она не означает, что некое i больше (или равно) двум, и одновременно меньше (или равно) одному.

                                  Вот это, как мне кажется, не очень логично.

                                  Ну то есть то, что 0*x — это 0, вам не кажется нелогичным?

                                  Проводить операции на пустом множестве странно.

                                  Ничего странного. Над пустым множеством определены все те же операции, что и над непустым, и они возвращают разумный результат.

                                  Но час делим, а люди нет.

                                  Вот только делимость тут не важна.

                                  Потому в вашей аналогии считается момент наступления трёх часов, т.е. до 2:59:59 включительно можно сказать.

                                  Нет. До 3:00. И это, кстати, очень важно при вычислении времени.


                                  1. Ruckus
                                    04.12.2015 16:25

                                    Есть последовательности, есть списки

                                    Не во всех языках.(?) И да, возможно у меня недостаточная квалификация, в чём отличия в индексации между массивами, последовательностями и списками? И для какого языка?
                                    Картинку про экстраполяцию видели?

                                    Но попробовать стоило =)
                                    Над пустым множеством определены все те же операции

                                    Соглашусь с вами. Да, выбор пустого подмножества из некоторого множества ещё придётся продумать, но остальное выглядит довольно приятно. Вообще это фломастеры, разговаривать о человекопонятности языка с программистом, как мне кажется, не лучший вариант. Просто я не считаю, что сложившееся годами — единственно правильное, а не банальная ошибка с последующей поддержкой легаси стиля.


                                    1. lair
                                      04.12.2015 16:31
                                      +1

                                      Не во всех языках

                                      А кого это волнует, если мы говорим о некоем мифическом высокоуровневом языке, подходящем для обучения школьников, чтобы у них не болело место, отвечающее за индексацию с нуля?

                                      И да, возможно у меня недостаточная квалификация, в чём отличия в индексации между массивами, последовательностями и списками?

                                      У последовательностей и (функциональных) списков нет индексации. Просто нет. Ее можно сделать как внешнюю операцию со стоимостью O(n), но это ровно тот случай, когда как хочешь, так и делаешь.

                                      Просто я не считаю, что сложившееся годами — единственно правильное, а не банальная ошибка с последующей поддержкой легаси стиля.

                                      Вопрос только в том, что «сложилось годами» — программистская «индексация с 0» или «социальная индексация с 1»? По большому счету, и то, и другое — всего лишь устоявшаяся практика. Дийкстра пытается логически рассуждать, какая из них удобнее.


                                      1. Ruckus
                                        04.12.2015 16:45

                                        Дийкстра пытается логически рассуждать, какая из них удобнее.

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

                                        Ну зачем же вы так? =( Я рассуждал о этом мифическом языке как о языке с самым низким порогом вхождения, высоким потенциалом и широкой применимостью, а вы все мои мечты разрушили.
                                        У последовательностей и (функциональных) списков нет индексации. Просто нет. Ее можно сделать как внешнюю операцию со стоимостью O(n), но это ровно тот случай, когда как хочешь, так и делаешь.

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

                                        Боюсь изменить социальную устоявшуюся практику будет сложней, чем программистскую, я не знаю сколько % из населения земли программисты, но «социальной индексацией с 1» пользуется почти 100% населения, включая программистов пока они не за работой. Но вопрос интересный, да.


                                        1. lair
                                          04.12.2015 16:54

                                          Он рассуждал с машинной, низкоуровневой и, отчасти, субъективной точки зрения

                                          Вы статью-то внимательно прочитали? Там вообще нет ни слова о машинах и машинной логике, а языки программирования приводятся только в качестве примера. Эта статья написана в ответ на реакцию математика на поведение студентов, которые начали нумеровать переменные с нуля.

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

                                          Либо язык для обучения, либо язык с высоким потенциалом и широкой применимостью. Не одновременно.

                                          Если в неком мифическом языке сделать такие хранилища это будет идеальный вариант, я за эту идею. Это уже где-то реализовано?

                                          Ну да. В функциональных языках, как минимум. Да даже в C# можно так писать — там нет функциональных списков, но они и не особо нужны в нефункциональных языках.


                                          1. Ruckus
                                            04.12.2015 17:10

                                            Вариант а и б лучше, потому что разность границ даст длину

                                            Еще и потому, что для прилегающих интервалов «внутренние» границы будут совпадать.

                                            Я всё ещё не считаю, что это что-то больше, чем субъективность для технических специалистов. Дальнейшее суждение строиться именно от выбора этого подмножества, в свою очередь я привёл вариант, который, как мне кажется, будет более удобен для неинженеров (назовём это так), а возможно и для меня, если к нему немного привыкнуть (и разобраться с выборкой пустого подмножества).

                                            Спасибо вам за дискуссию, я вынес для себя некоторые интересные вещи.

                                            Для меня, кстати, осталось интересным, почему все так привязались к нумерации и почти никто не написал про единый цифровой тип? Это же тоже интересная идея имеющая свои плюсы, минусы и нюансы, которые не сразу видны.


                                            1. lair
                                              04.12.2015 17:17

                                              Я всё ещё не считаю, что это что-то больше, чем субъективность для технических специалистов

                                              Вообще-то — математиков. Дийкстра рассуждает как математик.

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

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

                                              Для меня, кстати, осталось интересным, почему все так привязались к нумерации и почти никто не написал про единый цифровой тип?

                                              Все, что надо написать, написали — и то, что он в некоторых языках реализован, и то, почему его не реализуют во всех языках.


                                            1. VasakaInc
                                              04.12.2015 17:23
                                              -3

                                              Для меня, кстати, осталось интересным, почему все так привязались к нумерации и почти никто не написал про единый цифровой тип? Это же тоже интересная идея имеющая свои плюсы, минусы и нюансы, которые не сразу видны.
                                              Потому, что индексы, это священная корова которую нельзя трогать.


                                1. bromzh
                                  04.12.2015 16:16
                                  +1

                                  Нет, питоновское a[2:1] совсем не тоже, что 2 ? i ? 1. Ибо в питоне мы таким образом получаем подпоследовательность, которая строится по определённым правилам. В данном случае, цифры означают интервал, а вот их порядок указывает на направление, по которому будет двигаться итератор относительно первоначальной последовательности.
                                  А неравенства служат только для того, чтобы обозначить интервал допустимых значений. И запись 2 ? i ? 1 нарушает одно из свойств неравенств, а именно — транзитивность. Так что эта запись неверна. Зачем тут спорить — неясно.


                                  1. Ruckus
                                    04.12.2015 16:34

                                    А я и не спорю.
                                    У меня ещё в школе были задачки вида
                                    i <=1
                                    i >=2
                                    и надо было найти диапазон допустимых значений i для этой системы неравенств. В данном случае ответ — пустое множество, что и требовалось. На сколько помню это начало средней школы, по крайней мере у меня так было. Я не буду говорить правильные это задачки были или нет, я не математик, если вы считаете, что эта задачка нарушает какие-то законы я вам поверю.


                            1. lair
                              04.12.2015 15:46

                              Любая последовательность, где конец раньше начала?

                              Тьфу ты, банальное же забыл.

                              Попробуйте таким образом записать пустую последовательность, начинающуюся с Int.MinValue.


                              1. Ruckus
                                04.12.2015 15:49

                                Отрицательных индексов в массиве не бывает ^_^


                                1. WST
                                  04.12.2015 15:50
                                  +1

                                  От языка зависит, в том же PHP запросто могут быть. В Python отрицательный индекс даёт отсчёт от конца списка, но отрицательных индексов как таковых нет.


                                1. lair
                                  04.12.2015 15:50

                                  А мы не про индексы, мы про последовательности чисел. Чистая математика, до массивов еще прыгать и прыгать.

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


                                  1. Mrrl
                                    04.12.2015 16:14

                                    Если вы будете рассматривать последовательности uint, начинающиеся с нуля, то наткнётесь на известную проблему: таких последовательностей 2^32+1 (длина от 0 до 2^32 включительно). Закодировать их двумя числами типа uint (одно из которых 0) не получится никак. Придётся либо описывать отрезок началом и длиной (причём длина — long), либо пожертвовать одной из последовательностей (например, всеми числами). В последнем случае пустая последовательность запишется как 0:uint.MaxValue.


                                    1. lair
                                      04.12.2015 16:22

                                      Именно так. Вопрос того, какой именно компромис мы считаем наиболее удачным.


                1. Mrrl
                  04.12.2015 11:43
                  +1

                  А насчёт «отрицательных и дробных индексов» — есть такая штука, как дробно-степенные ряды (ряды Пюизо). Используется при работе с алгебраическими функциями. И если математику покажется удобным проиндексировать коэффициенты этого ряда показателями степени (которые могут быть и отрицательными, и дробными), он это сделает почти без колебаний — формулы станут гораздо удобнее.


                1. ad1Dima
                  04.12.2015 12:11

                  В свою очередь любые числовые последовательности в математике индексируются с единицы, если я не ошибаюсь.

                  ошибаетесь, они индексируются как удобно. Каждый раз обозначается чему принадлежит n. Начинаться может хоть с 0, хоть с 1, хоть с 2, хоть с -42.


                  1. Ruckus
                    04.12.2015 12:20

                    Да, уже сказали, ещё раз прошу прощения за свою ошибку.


  1. VasakaInc
    03.12.2015 09:17

    del


  1. DartRaven
    03.12.2015 09:45

    2. Целочисленный тип переменной длины создаст уйму проблем с реализацией. Например, при вычислении произошло переполнение. Допустим, мы это обработали как исключение или ещё как-то, решили, что нужно увеличить размер. И куда мы его положим теперь? Кто и где выделит память, особенно если наше значение-поле класса?


    1. leremin
      03.12.2015 10:00
      +1

      А утиная типизация в Python, например? И вполне себе считаются выражения типа 2**1000000.


      1. DartRaven
        03.12.2015 10:09
        +1

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


    1. asm0dey
      03.12.2015 11:26
      +1

      В хаскелле, в котором очень сильная и строгая типизация — числа неограниченной точности. как-то справляются. В Java тоже есть число неограниченной точности — BigDecimal. Мне кажется точность — вообще не проблема в наше время.


      1. defuz
        03.12.2015 12:07
        -1

        И что, если в хаскеле числа неограниченой точности, то наверное на нем уже и число пи посчитали до конца? Или, может быть, все-таки строго говоря вы не совсем правы? ;)


        1. asm0dey
          03.12.2015 22:01
          +1

          Строго говоря числа неограниченной точности, что не значит что мы можем вывести бесконечное число.


      1. lair
        03.12.2015 12:13
        +2

        В Java тоже есть число неограниченной точности — BigDecimal.

        Ограниченной. Максимум 231 знаков после запятой.


        1. defuz
          03.12.2015 12:23

          Знаков какой разрядности?


          1. lair
            03.12.2015 12:24

            Не очень понимаю. Вы, наверное, имели в виду основание системы счисления? Десятичной.


            1. defuz
              03.12.2015 12:28

              Да, я имел ввиду основу системы исчисления. Есть понятия «двоичный разряд», «десятичный разряд» и т.д. Странно, что десятичной.


              1. Ogra
                03.12.2015 12:30
                +1

                Ну не зря же оно называется BigDecimal =)


              1. lair
                03.12.2015 12:31

                Ничего странного, если посмотреть, как оно хранится:

                A BigDecimal consists of an arbitrary precision integer unscaledValue and a 32-bit integer scale. [...] The value of the number represented by the BigDecimal is therefore (unscaledValue ? 10-scale).


        1. asm0dey
          03.12.2015 22:00

          Я думал ограничение чисто в памяти. То есть какого размера строки мы можем хранить…


  1. aleks1k
    03.12.2015 09:47

    На самом деле в C# можно создать массив начинающийся не с нуля msdn.microsoft.com/ru-ru/library/x836773a(v=vs.110).aspx


    1. VasakaInc
      03.12.2015 09:58

      Спасибо за наводку, но на самом деле, это не решает проблемы индексации с 0 в других коллекциях.
      Если говорить о себе, то для себя я нашёл приемлемое решение этой проблемы — статический класс «a» с методом «s» который возвращает значение уменьшенное на 1. В итоге с любыми коллекциями я могу обращаться используя индексацию с 1. Просто для себя принял, что индекс указывается не просто числом, а через [a.s(i)]. Но я говорил вообще о положении вещей в современных языках программирования, а не о собственных проблемах при взаимодействии с ними.


      1. aleks1k
        03.12.2015 10:02
        +2

        И зачем придумывать такие костыли? Не легче все же привыкнуть что индексация с нуля, вам уже кучу примеров привели что это удобнее в большинстве случаев


        1. VasakaInc
          03.12.2015 10:40
          -3

          Я объясню зачем выдумывать такие костыли. Мне постоянно приходится считать в уме эту поправку. А чего тогда и всё остальное не считать в уме? Выкинем языки программирования, будем делать всё сами.
          Язык программирования и создан для того, чтобы делать за нас какую-то работу. Ну так пусть делает и эту, зачем мне постоянно над этим голову ломать?
          Но я ещё раз хочу оговориться, речь не обо мне и о том как я пишу программы, я просто удивился, что спустя 20 лет в этом отношении всё остаётся по старому и мне не понятно почему это до сих пор так.


          1. aleks1k
            03.12.2015 11:29

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


      1. ad1Dima
        03.12.2015 10:02

        Ещё можно унаследоваться от класса и переопределить индексатор. тогда можно будет просто писать a[1]


        1. VasakaInc
          03.12.2015 10:43

          Да много чего можно сделать. Я не спорю. Просто статья-то не об этом. Не о том как выкрутиться в данной ситуации, а о том почему высокоуровневые языки программирования до сих пор используют такие вещи как индексацию с 0 и т.д?
          Когда я понял, что просто пишу в уме программу вычитания единицы для пользования индексацией, я подумал, а почкму эта программа до сих пор работает в уме программиста, а не возложена на язык программирования?


          1. ad1Dima
            03.12.2015 11:07

            я подумал, а почкму эта программа до сих пор работает в уме программиста, а не возложена на язык программирования?

            Что бы не возлагать на программиста десяток программ, где надо будет единицу вычитать. Вам привели кучу примеров, где это придётся программисту вычитать единицу в голове, если индексация идёт с 1. Проще уж запомнить, что индексация с 0.


            1. VasakaInc
              03.12.2015 11:18

              Мне привели учу примеров из существующих языков программироваия, которые и проектировались с расчётом индексации с 0.
              Думаю, при проектировании нового языка программирования эти моменты можно учесть и тогда уже наоборот придётся мучиться с индексацией с 0.


              1. AllexIn
                03.12.2015 11:31
                +2

                при проектировании нового языка программирования эти моменты можно учесть

                Например как?
                Как в анекдоте «ну я же стратег. а детали реализации за вами.»


      1. Oxoron
        03.12.2015 12:12
        +1

        Еще можно использовать foreach конструкцию. И indexof, если индекс действительно нужен.
        В целом, вы просто неправильно читаете код.
        a[0] — это не «нулевой» элемент массива, а элемент с нулевым смещением от начала.


        1. Ogra
          03.12.2015 12:16
          +1

          Кстати, сейчас посмотрел в свой код на Эрланге. На весь проект три вызова функции lists:nth (индексация от единицы). Зато вызовов lists:map, lists:filter, [Head | Tail] просто сотни…


  1. Daniro_San
    03.12.2015 09:55
    +3

    Индексация с нуля — плохо? Ааа, мои глаза! И это висит на хабре?
    Объясню вам — на C#`е же который вы вроде бы должны немного знать, раз «показывали брату азы».

    Простейший пример, который должен объяснить вам, почему индексация с нуля лучше и удобнее:

         Int32[] arrOne = new Int32 [15]  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
         Int32[] arrTwo = new Int32 [16]  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
    
         // Теперь сложим эти массивы в один
         // Присмотритесь, ключевой момент для вас, с вашей идеей индексации массивов с 1
    
         Int32[] resultArr = new Int32[arrOne.Length + arrTwo.Length]; 
    
         // resultArr.Length == 31
    
         for(Int32 i = 0; i < arrOne.Length; ++i)  resultArr[i] = arrOne[i];
         for(Int32 i = arrOne.Length; i < arrTwo.Length; ++i)  resultArr[i] = arrTwo[i];
    
        //А теперь представьте, что индексация в Шарпе идет с единицы...
    


    Надеюсь теперь видно, что индексация с нуля — это не просто так?
    Неужели вы думали что вы умнее создателей C, C++, Java, C#?


    1. Mrrl
      03.12.2015 10:11
      +3

      А вы ничего не перепутали в ключевой строчке? Казалось бы, должно быть

           for(Int32 i = 0; i < arrTwo.Length; ++i)  resultArr[i+arrOne.Length] = arrTwo[i];


      А по последнему пункту — почему вы думаете, что создатели C умнее создателей Fortran? В котором массивы, между прочим, индексируются с единицы?


      1. Daniro_San
        03.12.2015 11:43
        -2

        Да, во втором цикле я допустил оплошность, спасибо что показали.

        Надо было написать второй цикл так:

        for(Int32 i = arrOne.Length; i < resultArr.Length; ++i)  resultArr[i] = arrTwo[i];
        

        Вот теперь все правильно.


        1. Ogra
          03.12.2015 11:48
          +2

          Опять неправильно!


    1. VasakaInc
      03.12.2015 10:15

      Речь-то не о C#. Речь о новых языках программирования в которых можно заранее предусмотреть то, что в нынешнем поколении языков может вызывать трудности.


    1. Ogra
      03.12.2015 10:41
      +2

      Надеюсь теперь видно, что индексация с нуля — это не просто так?
      Неужели вы думали что вы умнее создателей C, C++, Java, C#?


      Хорошее объяснение, зачем в низкоуровневом языке нужна индексация с нуля. Выше пример про двумерные массивы тоже хорош.
      Но на высокоуровневом языке эта задача решается вот так:
      ResultArr = ArrOne ++ ArrTwo.
      

      Это Эрланг, а индексация в нем с единицы. Неужели вы думали, что вы умнее создателей Эрланга, Фортрана, Луа?


      1. VasakaInc
        03.12.2015 10:45
        -5

        Вот! Вот так оно и должно быть!!!
        Спасибо умный, добрый человек. :)


      1. lair
        04.12.2015 16:49

        Это Эрланг, а индексация в нем с единицы.

        Кстати, забавно, но нет. С единицы в нем работает nth, которая возвращает n-ный элемент списка. А вот индексы массивов в нем… с нуля:

        Array indices start at 0.


        (Отдельно забавно то, что в F# наоборот: nth начинается с нуля, одномерные массивы — тоже с нуля, но при этом двух- и трехмерные можно создавать с любым стартовым элементом. Talk about weird.)


        1. Ogra
          04.12.2015 17:10

          А символы в строке (модуль string) нумеруются с единицы. Чего только в Эрланге не встретишь ;)


    1. musuk
      03.12.2015 15:12

      Что-то не понимаю, в чём проблема.

      for(Int32 i=1; i<=arrOne.Length; ++i) resultArr[i] = arrOne[i];

      или нет?


      1. Mrrl
        03.12.2015 15:25

        А в этом примере и нет проблемы:

             for(Int32 i = 1; i <= arrOne.Length; ++i)  resultArr[i] = arrOne[i];
             for(Int32 i = 1; i <= arrTwo.Length; ++i)  resultArr[i] = arrTwo[i+arrOne.Length];
        

        При индексации с 1 он выглядит почти так же, как и при индексации с 0. Проблемы начинают возникать, когда вы пытаетесь выделить фрагмент массива, берёте какой-то индекс в качестве первого элемента фрагмента, и пытаетесь обратиться к n-му элементу фрагмента:

        int[] SubArray(int[] array,int start,int length){
          int[] result=new int[length];
          for(int a=1;a<=length;a++) result[a]=array[a+start-1];  // <--- лишнее смещение
          return result;
        }
        

        И вот эти "-1" будут возникать при всех операциях с фрагментами.


  1. j_wayne
    03.12.2015 09:57
    -1

    1. Индексация с 0 — согласен, причины исключительно исторические. Впрочем, доставляет меньше всего проблем.
    2. Пример с Arianne не нравится. Безразмерным числам не место в системах реального времени. Впрочем, в тех же гражданских ruby/python вполне имеет место быть.
    3. Во многих языках есть тем или иным образом реализованный Rational тип. Возможно и с таким поведением как вы хотите.


  1. ad1Dima
    03.12.2015 09:58
    +4

    1. По этому пункту вам все сказали

    2. Откройте для себя языки с динамической типизацией и весь адок неотслеживаемых статически(без запуска кода) ошибок которые они в себе несут. Да, в отдельных случаях удобнее динамическая типизация. но в большинстве — она геморрой.

    3. Интересная идея про SmallTalk. Но простой пример: 1 / 7 / 3 + 1 / 11 / 5. Сколько операций будет произведено при сложении традиционным способом с плавающей точкой, а сколько при делении на числители и знаменатели?


    1. VasakaInc
      03.12.2015 10:18

      2. Откройте для себя языки с динамической типизацией и весь адок неотслеживаемых статически(без запуска кода) ошибок которые они в себе несут. Да, в отдельных случаях удобнее динамическая типизация. но в большинстве — она геморрой.
      Про динамическую типизацию я в курсе. Речь шла о статической типизации и единого числового типа данных в таком языке.

      3. Интересная идея про SmallTalk. Но простой пример: 1 / 7 / 3 + 1 / 11 / 5. Сколько операций будет произведено при сложении традиционным способом с плавающей точкой, а сколько при делении на числители и знаменатели?
      А никто не говорит, что такие языки должны быть супер быстрыми. Пусть будет медленнее но удобнее. В конце концов мы имеем C# и Java которые медленнее C++ и ассемблера, но это компенсируется другим. Удобством.


      1. BloodJohn
        03.12.2015 12:11

        Сформулируйте пожалуйста критерии удобства.


        1. VasakaInc
          03.12.2015 13:46

          Я думал, что в статье ясно написано то, что мне показалось неудобным.
          1. Индексация с 0, а не с 1.
          2. Множество числовых типов данных.
          3. Разделение типов данных на целочисленные и с плавающей запятой.


          1. Ogra
            03.12.2015 13:52

            Попробуйте Octave.


          1. BloodJohn
            03.12.2015 16:23

            Согласен. Я видимо не до конца понял.


      1. Ogra
        03.12.2015 12:14
        +3

        Пусть будет медленнее но удобнее.


        Так есть же языки помедленнее и поудобнее, выбирайте, какой больше по душе. Посмотрите на Lua, в конце-концов, неплохой вариант для начинающих. Вот хорошее начало.


        1. VasakaInc
          03.12.2015 13:41
          +1

          Спасибо. Уже несколько раз посоветовали Луа. Обязательно посмотрю, что за язык.


      1. ad1Dima
        03.12.2015 13:17

        А никто не говорит, что такие языки должны быть супер быстрыми. Пусть будет медленнее но удобнее. В конце концов мы имеем C# и Java которые медленнее C++ и ассемблера, но это компенсируется другим. Удобством.


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


      1. AllexIn
        03.12.2015 13:43

        Совершенно с вами согласен! пусть будет медленней, но удобнее!
        Поэтому у меня весь умный дом на Shell Script. Это удобно, хоть и медленно.
        Но я никогда в здравом уме не заявлю, что от Native языков, или, тем более, от JIT компилирируемых языков надо отказываться.
        Разные языки, разные задачи. Вы бы еще возмутились, что за столько-то лет ассемблер не стал дружелюбнее.


  1. Ivan22
    03.12.2015 10:04
    +2

    Индексация с 0 это так же естественно как двоичный код!!!


    1. AllexIn
      03.12.2015 10:17
      +4

      Двоичный код — ограничение машинное.
      Индексация с нуля — ограничение математическое.
      Поэтому естественность двоичного кода — чисто техническое ограничение. Будет компьютер с троичным битом и двоичность перестанет быть естественной.
      В то же время естественность индексации с нуля никуда не денется, пока не придумают совершенно новую математику. А это врядли случится.


      1. defuz
        03.12.2015 10:27

        Двоичный код — тоже в некотором смысле фундаментальное решение, поскольку бинарный бит – атомарная единица информации, и начиная с этого факта пляшет вся дискретная математика и computer science. Так что это не просто техническое ограничение.


        1. Mrrl
          03.12.2015 10:41

          Нет, просто с двоичным битом работать слегка удобнее.
          Количество информации в троичном бите нельзя выразить никаким целым числом двоичных битов. Так что говорить, что двоичный бит «атомарный» неправильно — они с двоичным битом друг к другу не сводятся.
          Количество информации в объекте, который принимает значение 0 с вероятностью 99%, а 1 с вероятностью 1%, намного меньше 1 бита. Использовать его непосредственно в компьютерах не очень удобно, поскольку нельзя предсказать, сколько таких объектов понадобится для хранения/передачи нужного объёма информации, но в каналах связи они вполне могут присутствовать. И в компьютерах на нечёткой логике, вроде нашего мозга — тоже. Так что двоичный код — это всего лишь частный случай, удобный для детерминированных вычислений. Когда мы пойдём дальше, на квантовый уровень, представление данных может стать другим.


          1. defuz
            03.12.2015 11:29
            +1

            Количество информации в троичном бите нельзя выразить никаким целым числом двоичных битов.
            Зато отлично выражается дробным количеством бит. Если мы говорим об измерении количества информации, то нам понадобится ?1.585 бита. В этом нет никакой проблемы.

            Так что говорить, что двоичный бит «атомарный» неправильно — они с двоичным битом друг к другу не сводятся.
            А они и не должны сводится друг к другу. Под атомарным я имею ввиду наименьшее значение, которое можно взять за основу, то есть принять за «единицу». Опять же, в квантовой механике есть дробные заряды, а в математике есть пространства не целой размерности, и никто пока не умер.

            Количество информации в объекте, который принимает значение 0 с вероятностью 99%, а 1 с вероятностью 1%, намного меньше 1 бита. Использовать его непосредственно в компьютерах не очень удобно, поскольку нельзя предсказать, сколько таких объектов понадобится для хранения/передачи нужного объёма информации, но в каналах связи они вполне могут присутствовать.
            Это и есть кубит, разве нет?


            1. Mrrl
              03.12.2015 12:45
              +2

              «дробное количество бит» не согласуется с «атомарной единицей информации». После того, как открыли дробные заряды, заряд электрона перестал быть атомарной единицей.
              Интересно, как вы будете реализовывать «дробное количество бит». Можно, конечно, взять 5 тритов, перевести их значения в одно число от -121 до 121, и потом представить полученное число в виде одного байта. И сказать, что мы потратили 1.6 бита на трит (потеряв 0.015 бита по дороге).
              Но что мы при этом сделали? Мы представили информацию в её «более базовом» виде — как логарифм числа возможных состояний системы, а уже потом выразили её в навязанных архитектурой и обычаями единицах — «бинарных битах» (binary-binary digits, не так ли?). Ничего базового в этих единицах нет, они ничем не «базовее» тритов или натов.

              Это и есть кубит, разве нет?

              Не совсем. Действительно, у кубита может быть промежуточное или финальное состояние, выраженное этой фразой, и, в зависимости от задачи, его можно как-то интерпретировать. Но я имел в виду, что-то вроде памяти, у которой значение 1 может быть в среднем только у одной ячейки из 100 (например, она может устойчиво поддерживать в возбуждённом состоянии только один атом из сотни). На одну ячейку такой памяти приходится примерно 1/15 бита, но уместить один бит в 15 ячеек не получится. Зато можно сохранить 14 бит в 200 ячейках (закодировав индексами двух возбуждённых атомов). А может быть, и не получится (если, например, есть нижний предел на расстояние между ними) — всё зависит от конкретной реализации.


              1. defuz
                03.12.2015 13:18
                +1

                Да, похоже вы правы, с атомарностью я погорячился.


        1. aleks_raiden
          03.12.2015 10:49
          +1

          не такое уж и фундаментальное, так как существуют машины с троичной системой, к примеру


          1. defuz
            03.12.2015 11:31
            +1

            А люди вообще десятичную умудрились использовать, только как это противоречит тому что я сказал?


      1. EndUser
        03.12.2015 15:20
        +2

        Двоичный код это НЕ машинное ограничение — это матаппарат булевой логики.
        Можно делать машины на троичной базе, на десятичной, на любой.
        Двоичная (и троичная) оптимальнейшие системы счисления, да и рассыпуха становится дешевле, а аппарат в сборе — портативнее. Сравните:
        а) ENIAC с десяток тонн для составления баллистических таблиц для флота — десятичный (двоично-десятичный?)
        б) Zuse с одну тонну как бомбовый прицел для реактивного бомбардировщика — двоичный. Задачи схожие.


    1. Ruckus
      04.12.2015 11:28

      А вы конечно в двоичном коде работаете. А может переменные задаёте «a = 1100» вместо «a=12»? Или за вас всё-таки компилятор двоичные представление делает?


      1. Mrrl
        04.12.2015 11:50

        Иногда a=0x0c. Во времена работы на PDP 11/70 бывало и a=014. Если бы можно было использовать двоичную систему, возможно, иногда и встречалось бы a=0b1100: всё-таки, маску 11011 (когда она нужна) понять проще, чем 0x1b или 27. Иногда вообще хотелось x=3r2202 или x=3r10z1z: задавать смещения в массиве 3*3*3*3… в десятичном виде было не очень удобно.


        1. Ruckus
          04.12.2015 11:59

          Мне кажется вы говорите о достаточно низкоуровневых вещах, а автор пишет о высокоуровневых языках, которые теоретически должны стремиться к человеческому удобству и всё дальше удаляться от необходимости понимания аппаратной платформы, программной реализации и прочих низкоуровневых вещей. Если мне необходимо написать драйвер я сделаю это относительно низкоуровневым С, но в высокоуровневых языках нет необходимости в масках, бинарных и шестнадцатиричных представлениях и т.д., всё это должно быть «под капотом». Или у «высокого уровня» какая-то другая задача, нежели упростить человекопонимание и уйти от машинных понятий в человеческие?


          1. Mrrl
            04.12.2015 12:08

            Я очень давно не работаю с регистрами железа. Но маски попадаются очень часто — в обычных математических задачах. Небольшое множество проще закодировать набором битов в целом числе, чем изобретать для него новый тип или разбираться, как использовать существующий.
            А троичные маски и смещения — так те вообще могут применяться только на высоком уровне. В современном железе необходимости в них точно нет.


            1. Ruckus
              04.12.2015 12:31

              Кто что пишет… Мне кажется в ЯВУ для этого должны быть отдельные типы данных с соответствующими методами дабы делать это не в ручную, на то они и ЯВУ. Но тут конечно от задачи зависит, в совсем общем смысле я считаю, что таких задач в высоком уровне быть не должно, но…
              А приведите пример, мне чисто ради интереса, где вам маски встречались, просто я с ними виделся только когда с запакованными данными работал.


              1. Mrrl
                04.12.2015 12:54

                Ну, например, когда в какой-нибудь задачке из Project Euler нужно уместить 10^11 битов в доступную память. Или для реализации игры «жизнь» — клетка хранилась в одном байте, младший бит — значение, следующие 4 — сумма соседей, бит 0x20 — признак, что на этом ходе значение изменилось. Для хода ко всем байтам применялось преобразование по массиву, а потом просматривались изменившиеся клетки, и у их соседей менялось значение битов 0x2 — 0x10.
                Сейчас работаю с проектом, в котором углы представлены по модулю 2^28 (т.е. 2^28 = 360 гр), но при этом могут выходить из диапазона 0-360. Чтобы скорректировать угол, новое значение которого известно по модулю 360 гр, приходится писать что-то вроде
                newValue=oldValue+ExpandAngularSign(givenValue-oldValue),
                где
                int ExpandAngularSign(int val){
                return ((val^(AngularMask+1)/2)&AnglularMask)-(AngularMask+1)/2;
                }
                Ну, и конечно, статусное слово состояния модели — хранится как набор битов.

                Но это первое, что пришло в голову. Если покопаться по проектам, можно вспомнить и другие случаи.


  1. Mrrl
    03.12.2015 10:31
    +1

    Если при переполнении целых чисел не будет возникать ошибок, то ракеты начнут падать из-за переполнения памяти. Или из-за того, что не успеют за разумное время выполнить нужные расчёты в числах произвольной длины. Всё-таки, компьютеры сейчас очень слабые. И памяти у них очень мало. Поэтому и приходится продолжать выпускать процессоры с фиксированным набором регистров ограниченной разрядности, использовать целочисленную арифметику для доступа к памяти и хранить целые и вещественные числа как значения, а не как указатели.

    А про индексацию с нуля ещё один пример в копилку:
    допустим, вы хотите реализовать двумерный массив на базе одномерного. Если индексы с нуля, то пишете

    double GetElement(int a,int b){ return Array[a*Dim1+b]; }

    Если с единицы —
    double GetElement(int a,int b){ return Array[(a-1)*Dim2+(b-1)+1]; }

    Да, последние -1 и +1 в этом примере сокращаются, но придётся следить за этими единичками во всей программе.


    1. AllexIn
      03.12.2015 10:37

      по сути большая часть операций при индексации с 1 сводятся к переводу индексации к 0. Что ваш пример прекрасно иллюстрирует.


    1. Ogra
      03.12.2015 10:45
      +1

      допустим, вы хотите реализовать двумерный массив на базе одномерного.

      Зачем это допущение в языке высокого уровня? Это совершенно нормальный случай для С, но язык высокого уровня должен предоставлять эту абстракцию из коробки.


      1. Mrrl
        03.12.2015 10:49

        Потому что нужен какой-то пример. И если язык высокого уровня реализует достаточно много абстракций, примеру придётся выйти за их пределы. Найти его, конечно, будет возможно, но он может не уместиться на полях книги…


        1. Ogra
          03.12.2015 11:00

          Это низкоуровневый пример, а на нижнем уровне без индексации с нуля действительно тяжело. Выше я привел пример, когда индексация с единицы проще и безопаснее, а при индексации с нуля приходится «следить за единичками во всей программе»
          Мы можем написать примеры за любую сторону, в ИТ есть языки, которые реализуют индексацию с 1, есть языки, которые позволяют вводить любую индексацию, а если вспомнить математику, то в ней есть ряды Тейлора и Фурье, в которых индексация идет с нуля, и гармонические ряды, в которых индексация идет с единицы.
          Вот о чем, нужно говорить новичкам, а не давить авторитетом и не аппелировать к Кернигану/Ричи/Страуструпу и т.д.


      1. AllexIn
        03.12.2015 10:50
        +1

        Ну так-то да.
        В языке высокого уровня уже все должно быть реализовано.
        И все программирование должно сводиться к вызову одного метода: «сделай мне хорошо.»
        До тех пор пока так не будет язык должен позволять решать определенные задачи и делать он это должен с минимумом костылей.


  1. defuz
    03.12.2015 10:42
    +7

    1. Индексация с нуля – это не просто дань традиции или техническое ограничение. Дело в том, что во многих разделах математики, на которых строится программирование, ноль – это первое число. Все начинается с 0x00. Вот и все. Это просто способ мышления, который является более естественным и эффективным для программистов в исключительно практическом смысле этих слов. Если для вас это выглядит странно, то только потому, что вы еще не мыслите как программист.

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

    3. Тоже самое, что и предыдущий пункт. Проблема рациональных чисел в их эффективности. Из-за этого они плохо подходят для решения большинства задач различных расчетов, и именно по-этому существуют числа с плавающей запятой.

    Вопросы, которые вы подняли – это те аспекты которые отличают фундаментальную математику от програмирования – наличие реальных ограничений на размер памяти, время выполнения и требования к производительности и конечности вычислений. Эти фундаментальные ограничения не позволяют вам определить програмно число в чисто математическом смысле – бесконечного размера и с бесконечной точностью. Вместо этого есть типы, которые эмулируют числа и которые позволяют эфективно решать те или иные задачи.


  1. naryl
    03.12.2015 10:45

    1. Где-то была статья на эту тему о Ruby. Сейчас найти не могу, но суть в том, что индексация с нуля — это не оптимизация и не костыль. Если бы индексация была с единицы, то разрезание (arr[1:5]) массивов выглядело бы в коде с вечными "-1" да "+1". Если кто вспомнит статью — киньте. Вроде бы сам Matz писал, но не уверен.
    2 и 3, ну вот Вы привели в пример Smalltalk. Так же о численных типах практически не надо думать в Common Lisp (есть fractional и bignum, в т.ч. fractional bignum и float bignum, явно преобразовывать численные типы не надо) и Tcl (все числа — безразмерные int/float, fractional нет). Есть замечательные действительно высокоуровневые языки — пишите на них.: ) На самом деле, если у вас нет начальника, который говорит «все используют Java/Python/COBOL и мы будем», то эти три языка (даже последние два) отлично покроют 99% классов задач.


    1. JIghtuse
      03.12.2015 10:57
      +1

      По первому пункту — нечто подобное писал Гвидо про Python: Why Python uses 0-based indexing .


  1. Ivan22
    03.12.2015 10:57

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


    1. leremin
      03.12.2015 11:06
      +1

      LabVIEW?


    1. AllexIn
      03.12.2015 11:09
      +1

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


    1. fido_max
      03.12.2015 11:50
      +1

      В Delphi/C++ Builder на VCL можно написать программку для просмотра/редактирования данных из СУБД не написав ни единой строчки кода.


    1. BloodJohn
      03.12.2015 12:15

      Тогда уж матерный. Покричал на компьютер, ногами потопал — он испугался и сам все сделал как надо.


  1. tangro
    03.12.2015 11:09
    +1

    Читал когда-то книгу о числе 0, истории его появления, восприятии терминов «пустота» и «бесконечность» в разное время в разных странах мира — очень интересная была книга, но сейчас не могу вспомнить как называлась.


  1. Alexeyslav
    03.12.2015 11:22
    +6

    Многие вещи не так очевидны. Когда вам понадобится ограничить индекс массива по модулю N операция остатка от деления на N неожиданно даст диапазон 0...N-1 и вам принудительно придется уже прибавлять 1 чтобы нумерация шла с 1. А такие вещи встречаются сплошь и рядом.
    По поводу чисел.
    Да, целые числа это круто! Когда вам надо считать реально большие числа, или вычисления в целых числах где промежуточный результат превышает разрядность в 10...20 знаков — нет альтернатив.
    Числа с плавающей запятой имеют свои особенности — это обусловлено их представлением в памяти и если попытаться хранить целые числа в виде дробных то рано или поздно мы сталкиваемся с тем что элементарная операция "+ 1" неожиданно не даёт эффекта!
    И то что в некоторых случаях число хранится в виде дроби в нестандартном виде — работа с такими числами будет происходить в 10-20 раз медленней, когда надо посчитать 1-2 числа это ладно но вот если у вас задача численного расчёта с миллиардами операций то речь идет о том будет ваше приложение работать 20 часов или 1 час. Да, из-за какой-то мелочи…
    Во вторых, работа со стандартными числами может быть поручена математическим ускорителям, и вот уже ваша программа вместо часа работы выполняется всего 10 минут.

    Порой, обеспечить одновременно быстродействие и простоту реализации — взаимоисключающие вещи, поэтому приходится оставлять в языке разные реализации на усмотрение программиста.
    Кстати, во всех СУБД числа хранятся очень тупо — в виде текстового представления, и в виде исключения могут быть предусмотрен способ хранения в двоичном виде но это обусловлено тем что скорость чтения из базы данных несоизмеримо меньше чем длительность операций над этими числами, поэтому хранить их в неудобном двоичном виде просто нет смысла, а раз так то разделение на целые и дробные там чисто условное и служит только для контроля.
    Кстати, я несколько удивлён тем что вообще была поднята тема нумерации сущностей, ведь в ЯВУ предусмотрены такие штуки как коллекции и отпадает необходимость вообще работать с их порядковыми номерами! А стало быть проблема 0 и 1 — это проблема неправильного применения современных технологий.
    не используйте явную индексацию элементов и не будет проблемы.


    1. 4dmonster
      03.12.2015 11:25
      +1

      Кстати, во всех СУБД числа хранятся очень тупо — в виде текстового представления, и в виде исключения могут быть предусмотрен способ хранения в двоичном виде

      Как раз наоборот!


      1. Ivan22
        03.12.2015 11:57
        +2

        скорость чтения из базы данных несоизмеримо меньше чем длительность операций над этими числами

        Как раз наоборот!


        1. defuz
          03.12.2015 12:16
          +2

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

          Как раз наоборот!


      1. Alexeyslav
        05.12.2015 20:23

        Где почитать? Там где я сталкивался, в лучшем случае числа хранятся в BCD-виде, а FLOAT если и упоминается то как-то за кадром, ибо для бухгалтерии такие числа неприемлимы из-за принципиальной потери точности.
        В основном приходится работать именно с числовыми полями в виде строк оно заодно и юзер-френдли в отладке.


        1. 4dmonster
          05.12.2015 20:41

          Где почитать?

          В описании используемой СУБД.

          Для бухгалтерии, как правило, используется тип с фиксированной запятой.
          А экзотика типа BCD и строкового хранения — удел узкоспециализированных программ.


  1. Ogra
    03.12.2015 11:39
    +4

    Цитатка в тему:

    < $andman > $months = array(«Нулябрь», «Январь», «Февраль», «Март», «Апрель», «Май», «Июнь», «Июль», «Август», «Сентябрь», «Октябрь», «Ноябрь», «Декабрь»);

    А у вас тоже есть нулевой месяц или вы тупо вычитаете единичку?

    bash.im/quote/111111


    1. 4dmonster
      03.12.2015 11:41

      Только почему «Нулябрь»? Не логичнее и не полезнее разве назвать его «Все»?


      1. AllexIn
        03.12.2015 11:53

        «Все» разве как-то отражает суть элемента?


        1. 4dmonster
          03.12.2015 12:06
          -1

          Удобно использовать например для фильтров. А отображение сути испорчено самим добавлением 13го месяца.


    1. Alexeyslav
      03.12.2015 12:53

      А есть еще и очень часто используется такое понятие как 13-й месяц. Это когда отчитаться нужно в текущем году, а работы и затраты переходят на следующий…


  1. fido_max
    03.12.2015 11:45
    -1

    Про динамические типы свои пять копеек:
    Все эти ограничения типов данных идут от процессора, т.к. процессор сам по себе умеет оперировать только с данными определенных типов. Все что он не умеет аппаратно — программная эмуляция, которая в несколько раз медленне. Допустим, что изобрели процессор, в системе команд которого появилась работа с универсальным типом данных, в который помещается весь числовой диапазон. Программисту больше не нужно думать о числовых типах — процессор сам справится. Только толку от этого не будет, т.к. процессор сам по себе ничего не умеет, кроме как выполнять различные операции. Процессору нужны переферийные устройства (в т.ч. живущие рядом с ним в одном кристалле). Общение с этими устройствами осуществляется по протоколам, в которых типы данных, порядок следования байтов/битов строго оговорен. Эти устройства будут просто не готовы работать с нашим универсальным типом данных. Понадобится однозначная процедура кодирования/декодирования универсального типа в старые добрые byte/word/int/float и т.д. И тут кроме потери производительности будет появляться куча ошибок и неоднозначностей (потеря точности, переполнение). Уже возникает куча проблем только внутри одной ЭВМ. А дальше межмашинный обмен… там все еще сложнее…


  1. Turbo
    03.12.2015 11:52
    +2

    Ну вы выбрали язык со строгой типизацией (не такой уж высокоуровневый как выясняется). Смотрите в сторону чего-то вроде: Python, PHP и.т.д.


  1. art_of_press
    03.12.2015 12:09

    Почему индексация начинается с нуля? Потому что именно 0 это точка отсчёта, а не 1. Когда у вас будут детки, и вы будете учить их считать, используя числовую шкалу, вы поймёте, почему индексация начинается с нуля. Когда ваши детки будут ставить карандаш на единицу, чтобы от неё отсчитывать нужное количество чисел, а вы будете сдвигать его на 0, объясняя, что именно оттуда всё начинается, вы поймёте это очень хорошо ;)).


    1. VasakaInc
      03.12.2015 18:32
      -4

      Когда вы будете искать на улице нулевой дом, вы очень удивитесь.
      Когда вы будете искать нулевой сезон «Друзей», вы очень удивитесь.
      Вы также очень удивитесь когда не найдёте нулевого бегуна в соревнованиях по лёгкой атлетике и нулевой песни на пластинке…
      И когда вы спросите у знакомых какой из их детей нулевой, а какой первый, вы наверное тоже очень сильно удивитесь.


      1. lair
        03.12.2015 18:48
        +1

        Когда вы будете искать на улице нулевой дом, вы очень удивитесь.

        Да нет

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


      1. art_of_press
        03.12.2015 19:44
        +3

        Но при этом вы очень удивите людей, живущих вне экс-СССР, когда захотите выйти из лифта на первом, а не на нулевом этаже.


  1. lair
    03.12.2015 12:10

    Если язык программирования высокоуровневый, то не лучше ли иметь чуть меньшую производительность языка, но несравненно большее удобство в работе с ним?

    На самом деле, половина дискуссии упирается в том, что понятие удобства субъективно. Вам неудобно считать индексы от нуля? Кому-то неудобно от единицы. Вам неудобно иметь разные числовые типы под разные задачи? Кому-то неудобно иметь дело с общим типом, которые все задачи решает одинаково плохо.

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


    1. defuz
      03.12.2015 12:22

      Кстати говоря, высокоуровневость языка совсем не означает потерю производительности. Есть такое понятие как zero-cost abstractions.


      1. lair
        03.12.2015 12:23

        высокоуровневость языка совсем не означает потерю производительности

        В общем случае — да. Но не в тех конкретных примерах, которые приведены в посте.

        (да, бывает потеря времени разработки и потеря времени выполнения)


    1. Mrrl
      03.12.2015 12:29

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

      Неужели это правда?
      Наверное, для задач, где используются числа произвольной разрядности, нужны мощные процессоры — но именно потому, что операции с такими числами требуют гораздо больше тактов. Но есть ли такие задачи, где действительно нужна высокая производительность, и при этом нельзя ограничиться 256 (или 512, или 1024) битами на число?


      1. lair
        03.12.2015 12:32

        Неужели это правда?

        Правда обычно обратное: я не встречал еще прикладной задачи из бизнес-сектора, где была бы нужна произвольная разрядность.


        1. Mrrl
          03.12.2015 12:51

          Вот и я о том же. Такие задачи могут потребоваться на этапе разработки системы, но они, обычно, одноразовые.


  1. KvanTTT
    03.12.2015 12:33
    -2

    Используйте Int, double и string в C#. Их хватит для большинства задач (собственно так все и делают). Необходимость в больших целых и дробных возникает разве что в математических, криптографических и других специфичных задачах.


    1. bromzh
      03.12.2015 12:58
      +1

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

      Как-то ютюб поломался из-за того, что количество просмотров одного небезызвестного видео стало больше, чем 2 147 483 647. Так что такое может случиться в совершенно разных областях.


  1. Zenitchik
    03.12.2015 12:42

    У центральноамериканских цивилизаций, месяцы в году и дни в месяце нумеровались с 0. Кажется, годы в цикле тоже.
    Это чертовски удобно для вычисления разности дат.
    А европейская цивилизация почему-то долго сопротивлялась изобретению числе 0.


  1. a_batyr
    03.12.2015 12:44

    Smalltalk эту проблему решили очень красиво. В результате этого деления мы получим число класса Fraction. Оно содержит в себе числитель (1) и знаменатель (3). То есть, как такового деления не будет, а будет дробь. Ничего не теряем.
    Автор, даёшь извлечение корня и возведение в степень без потери точности!


    1. Mrrl
      03.12.2015 12:50

      Автор, даёшь извлечение корня и возведение в степень без потери точности!

      Любая система компьютерной алгебры только посмеётся над этой задачей.


  1. KvanTTT
    03.12.2015 13:30

    Автор, я тоже так думал, правда еще в старших классах школы. А потом у меня появилось больше опыта…


  1. dom1n1k
    03.12.2015 13:58
    +4

    Нумерация в массиве с 0 кажется неудобной только поначалу и от неопытности. Особенно, если перед этим ознакомился с Паскалем. Но со временем понимаешь — наоборот, это удобно! Подсказка — термин «смещение».


  1. M_Muzafarov
    03.12.2015 16:01
    +5

    Уже отвечали, что нумерация с нуля позволяет проще оперировать с конечным массивов, глядя на него как на поле по модулю N?
    Если программировать математические операции — удобно.


  1. divan0
    03.12.2015 18:37

    Автор молодец, что задаётся вопросами, и задаёт их в нормальном тоне. Зря минусуют.

    Про нумерацию с нуля — en.wikipedia.org/wiki/Zero-based_numbering

    Про числовые типы — тут всё упирается таки в низлежащую реализацию. В реальности у нас пока нет бесконечной мощности ресурсов — и в дизайне языков компромисс удобства и производительности занимает далеко не последнее место. Если будете изучать внутренности реализации языков — сами поймете, почему так.

    Но за критическое осмысление без оглядки на «это ж и так всем очевидно» — респект.


    1. VasakaInc
      03.12.2015 18:42

      Но за критическое осмысление без оглядки на «это ж и так всем очевидно» — респект.
      Всегда уважал Джордано Бруно. :)
      Могу смело утверждать, что мне значительно легче чем ему. По крайней мере сожжение мне пока не грозит. ))


      1. divan0
        03.12.2015 18:47
        +1

        К слову, про аргументы выше о непривычности нумерации с нуля. Во многих странах (Европы, как минимум) индексация этажей в домах идет с нуля. «Первый этаж» там это наш «второй». Так что не всё то, что в постсоветских странах непривычно, является таковым и в остальном мире.


        1. VasakaInc
          03.12.2015 19:12
          -1

          Да, я прочитал статью, ссылку на которую вы дали. Но тут всё равно стоит говорить больше как об исключении, нежели как о правиле.

          Дети идут в школу и первое что они слышат: «Дети, это буква „А“ — первая буква алфавита». И так во всём. Поэтому не удивительно, что когда у них начинается информатика и им начинают объяснять, что первый элемент массива это нулевой элемент, у детей возникает как минимум удивление. А так как они уже привыкли постоянно считать с 1, то это вызывает ещё и неудобство.

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


          1. dougrinch
            03.12.2015 20:19
            +5

            Нету «первый элемент массива это нулевой элемент». Есть «первый элемент массивы имеет индекс ноль».


          1. WST
            04.12.2015 11:36
            +7

            Вы знаете, вот вы тут подчёркивали всячески, что вы гуманитарий. Возможно, в таком случае и не стоило делать предложения, тем кто заведомо знает лучше? Давайте я вам, как гуманитарию, приведу аналогию с реальным миром (вам ведь проще мыслить аналогиями, верно)?

            Смотрите. Вот дети приходят в школу. И с удивлением обнаруживают, что есть непроизносимые согласные, безударные гласные, «жи-ши с „и”» — и так далее. Так вот, ваше предложение относительно индексов, и то упорство, с которым вы не желаете просто почитать сотни комментариев и признать свою неправоту, пахнут такой же «детской» наивностью, как предложение писать всё так, как произносится. «Давайте введём интуитивно понятную систему правописания, зачем детям запоминать столько неочевидностей, 21-й век на дворе давно». Чувствуете?

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

            Вы часто ссылаетесь на неочевидность для новичков и недостаточную «высокоуровневость». Я и по этому поводу могу много написать, но попробую быть краток.

            По поводу очевидности — не находите ли вы, что иногда очевидность в такой сложной теме, как программирование, является скорее недостатком, чем преимуществом? Я думаю, мы все можем привести в пример парочку языков с «слишком» низким порогом вхождения, в результате которого на этих языках стали писать все, кому не лень, и тоннами быдлокода создали этим языкам репутацию «быдлокодерских», хотя на них вполне можно писать элегантно и правильно.

            По поводу высокоуровневости — не знаю, как для вас, но для меня (и для коллег, которые сидят рядом и тоже читают эту тему) высокоуровневость, прежде всего, заключается в синтаксисе. Для того, чтобы сказать, что язык A гибче и высокоуровневее языка B, нужно, чтобы в A были более гибкие конструкции, встроенные структуры данных. Но уж никак не такие мелочи, как индекс.

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


            1. ad1Dima
              04.12.2015 12:18

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


              1. WST
                04.12.2015 12:28

                Всё относительно. Индонезийский вот тоже, казалось бы, «как слышится, так и пишется», а на деле — много непроизносимых (или слабо произносимых), например, “k” в конце слова, “g” после “n”, часто “h” — и так далее. Естественные языки вообще отдельный разговор. Хотя иногда в естественные языки всё же вносятся «реформы» — к примеру, когда “oe”, читаемое как “u” заменили на “u” в том же индонезийском. Но для этого были предпосылки — это самое “oe” было едва ли не единственным, что нарушало гармонию легкочитаемости. Предпосылок для того, чтобы перепиливать индексы или систему типов, нет — не только в существующих ЯП, но и при разработке новых. Языки делаются для людей, которые будут на них программировать. Эти люди, в большинстве своём, предпочитают в таких вопросах не отходить от традиций — лучше отойти в чём-то другом, например, ввести новый оператор какой-нибудь.


            1. VasakaInc
              04.12.2015 12:28
              -7

              Смотрите. Вот дети приходят в школу. И с удивлением обнаруживают, что есть непроизносимые согласные, безударные гласные, «жи-ши с „и”» — и так далее. Так вот, ваше предложение относительно индексов, и то упорство, с которым вы не желаете просто почитать сотни комментариев и признать свою неправоту, пахнут такой же «детской» наивностью, как предложение писать всё так, как произносится. «Давайте введём интуитивно понятную систему правописания, зачем детям запоминать столько неочевидностей, 21-й век на дворе давно». Чувствуете?
              Именно так я и считаю. Объясните мне в чём тайный смысл писать «что», когда слово произносится ка «што»?

              По поводу очевидности — не находите ли вы, что иногда очевидность в такой сложной теме, как программирование, является скорее недостатком, чем преимуществом?
              Не нахожу.

              По поводу высокоуровневости — не знаю, как для вас, но для меня (и для коллег, которые сидят рядом и тоже читают эту тему) высокоуровневость, прежде всего, заключается в синтаксисе. Для того, чтобы сказать, что язык A гибче и высокоуровневее языка B, нужно, чтобы в A были более гибкие конструкции, встроенные структуры данных. Но уж никак не такие мелочи, как индекс.
              Для вас может это и мелочи, для детей — нет.
              Привет коллегам.

              Вот честно, я не знаю уже, как ещё аргументировать свою позицию. Вы смотрите лишь на тех, кому неудобен ноль, но напрочь игнорируете мнение тех, кому неудобна единица и тех, кому это совершенно безразлично, и приходите к «фундаментальному» выводу о том, что «ноль неудобен для всех, но не все ещё это осознали».
              Вы очень правильный пример привели с русским языком. Вот объясните, зачем 100% населению вдалбливать, что «что» пишется через «ч», когда можно писать через «ш» и избавиться раз и навсегда от этой проблемы?
              Вот когда вы мне это аргументированно объясните, тогда я готов продолжить общение с вами и возможно поменять свою точку зрения. Пока же, я считаю, что сотня учёных ослов могут точно так же заблуждаться как один не в количестве дело. Вспоминаем Джордано Бруно с Галилео Галилеем и многих-многих других для примера.


              1. WST
                04.12.2015 12:31
                +4

                Ну тогда всё с вами ясно, простите, против таких, как вы, любые аргументы бессильны.

                В качестве домашнего задания вам: попробуйте написать слова так, как произносите их, а потом с удивлением откроете для себя «местечковые» особенности произношения. А затем попробуйте ещё просклонять написанное. Сможете?


                1. VasakaInc
                  04.12.2015 12:42
                  -2

                  А мои вопросы вы проигнорировали?
                  Жду ответ.


                  1. WST
                    04.12.2015 12:44
                    +3

                    Я ответил, что аргументов не будет. Вам следует научиться воспринимать критику. И да, я точно так же жду результат выполнения моего задания.


              1. ad1Dima
                04.12.2015 12:38
                +6

                Вспоминаем Джордано Бруно с Галилео Галилеем и многих-многих других для примера.

                Изобретателей «вечных двигателей» все равно больше. Так что шанс, что вы — Джордано Бруно — минимален.


              1. lair
                04.12.2015 13:18
                +4

                Объясните мне в чём тайный смысл писать «что», когда слово произносится ка «што»?

                Вы точно гуманитарий?

                Для вас может это и мелочи, для детей — нет.

                А зачем детям индексы в массиве?

                Вот объясните, зачем 100% населению вдалбливать, что «что» пишется через «ч», когда можно писать через «ш» и избавиться раз и навсегда от этой проблемы?

                А почему вы считаете, что написание через «ш» избавит вас от проблемы? Какой, кстати, проблемы?


              1. bromzh
                04.12.2015 14:28
                +2

                Именно так я и считаю. Объясните мне в чём тайный смысл писать «что», когда слово произносится ка «што»?

                Ок, давайте писать всё, как слышится. Лишаца — это лишаться или лишатся? Тут только по контексту станет понятно, инфинитив это. или 3-го множественного. И такие глаголы — только вершина айсберга.
                А ведь можно придумать пример, когда даже контекст не позволит понять, какое слово из 2-х с одинаковым произношением имелось ввиду, только их разное написание позволит отличить.


                1. ad1Dima
                  04.12.2015 14:35
                  +1

                  А ведь можно придумать пример, когда даже контекст не позволит понять, какое слово из 2-х с одинаковым произношением имелось ввиду, только их разное написание позволит отличить.

                  Все уже придумано до нас: Война и мир.


                  1. VasakaInc
                    04.12.2015 14:59
                    -2

                    Вот именно. Как раз хотел написать, что такое и сейчас наличествует в языке — слова с двойным смыслом.


                    1. bromzh
                      04.12.2015 15:31
                      +2

                      А с подходом «писать как слышится» таких двойственностей станет намного больше. Вы будете жаловаться, что в языке много двойных смыслов?
                      Лично для меня написание слов не является проблемой. А вот наличие у одного слова кучи разных значений я считаю плюсом только если язык используется как технический.


                      1. VasakaInc
                        04.12.2015 15:34
                        -1

                        Как раз для технического языка однозначность смысла намного важнее. Почитайте про Немецкий технический и отношение людей к нему.


                        1. ad1Dima
                          04.12.2015 15:42
                          +1

                          Зато как замечательно, когда в языке есть слово имеющее противоположные значения.


      1. poxu
        03.12.2015 19:06
        +3

        Странно. Мне на какой-то момент показалось, что вы сравниваете себя с Джордано Бруно. Но ведь такого не может быть, правда?


    1. poxu
      03.12.2015 19:07
      +2

      Но за критическое осмысление без оглядки на «это ж и так всем очевидно» — респект.

      Это пока кто-нибудь не захочет критически осмыслить Go? Ну, то есть без оглядки на авторитеты :).


      1. divan0
        03.12.2015 19:09
        -5

        Вы путаете «критически осмыслить» и «я так привык».


    1. KvanTTT
      03.12.2015 20:51
      +2

      В реальности у нас пока нет бесконечной мощности ресурсов.

      И никогда не будет, так как скорость света конечна.


  1. Mrrl
    03.12.2015 19:08

    Кстати, в С# индексация массивов с нуля не приводит к повышению эффективности при индексации. Если мы опишем массив int[] A, то элемент A[0] будет иметь адрес [rax+10h], где rax — значение указателя на массив.


  1. lair
    03.12.2015 20:35
    +3

    Для меня было большим удивлением, что индексация массивов, списков, да и любых других коллекций начинается с 0, а не с 1. Зачем? Это же неудобно, подумал я. [...] Если язык программирования высокоуровневый, то не лучше ли иметь чуть меньшую производительность языка, но несравненно большее удобство в работе с ним?

    У меня есть провокационный вопрос. А зачем вам вообще в высокоуровневом — в вашем понимании — языке индексация коллекций порядковыми номерами?

    (это такой более развернутый вариант вопроса «зачем вам вообще нужен массив?»)

    PS Why numbering should start at zero?


  1. Mrrl
    03.12.2015 20:46
    +3

    (это такой более развернутый вариант вопроса «зачем вам вообще нужен массив?»)


    А ведь действительно:

                Dictionary<int,string> Arr=new Dictionary<int,string>();
                Arr[3]="Three+";
                Arr[5]="Five";
                Arr[8]=Arr[3]+Arr[5];
                Arr[3]="Three";
                foreach(var x in Arr) Console.WriteLine("Arr[{0}]={1}",x.Key,x.Value);
    


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


  1. RomeoGolf
    03.12.2015 21:04
    +10

    В языке супер-пупер высокого уровня вообще не должно быть индексации. А также массивов и типов данных. Просто голосом сказал — «Хочу игру». Или «Хочу базу данных». И рефакторинг — «Не, не такую». И отладка — «Чо-та не работает!» И самое забавное — это уже есть, только это не язык. Это программист, который не задает вопросы по типизации и индексации — он их использует, как инструмент. Одно маленькое но — ему надо платить.

    Хочу автомобиль для новичка — чтобы учиться ездить не надо, чтобы можно было ездить выпимши, чтобы меня не штрафовали, чтобы ваще не знать, что под капотом, зачем руль, почему педали, нет бы просто — сел и поехал… Есть такой автомобиль — такси.

    Тут ведь фишка простая — или тратишь время и усилия на освоение (и 98% вопросов снимутся сами), или платишь тому, у кого таких вопросов нет, а он уж выберет — луа или ассемблер.


  1. Suntechnic
    04.12.2015 01:33
    +11

    Когда я первый раз поставил Linux я впал в ступор при попытке настроить файерволл. Я все задавался вопросом — почему к iptables не написали до сих пор удобного, простого и гибкого GUI. В какой-то момент я даже решил что сделаю это и начал вникать в настройки iptables. Когда чуть освоился, решил что между GUI и iptables мне понадобиться еще одна абстрактная прослойка и я за пару вечеров набросал преальфу на bash. Когда я закончил, я понял что уже могу с помощью этого набора скриптов, настроить под себя сеть как мне надо. Что и сделал. GUI мне больше не был нужен…
    И тут я понял почему его нет — те, кому он нужен, не могут его создать. Тем кто может он не нужен.
    То же самое и тут — люди способные создать язык со всеми этими фичами уже привыкли к текущему положению вещей и эти фичи им больше не нужны, а может быть даже и менее удобны.


    1. JIghtuse
      04.12.2015 06:47

      Помню, подобное же испытывал, когда перелез на Linux и искал GUI к ftp-серверу =) не нашёл, только через какое-то время понял, что «не нужно».


    1. VasakaInc
      04.12.2015 10:24
      -5

      Наш мир, по большей части, мир эгоистов. Вот и вы пишите, я не стал писать GUI потому, что: "он МНЕ больше был не нужен." Вот это мне больше не нужен и есть ключевое.

      Он нужен многим другим, которые только приходят на Линукс, но вам же это уже не надо. Пусть помучаются как вы и освоят то, что можно было и не осваивать, если бы был GUI.

      Когда-нибудь найдётся человек, который напишет этот GUI для тех кому он нужен, чтобы они не мучились. Вы наверное почувствуете себя ущемлённым? Как так, я мучился в своё время, а им сразу всё удобно и на блюдечке с голубой коёмочкой?
      В этом же и причина неприятия индексации с 1.


      1. StrangerInRed
        04.12.2015 12:12

        Имхо, никто вам ничего не должен. Это мир эгоистов, и открывать свои проекты(сорцы) это решение исключительно авторов этого проекта.


        1. VasakaInc
          04.12.2015 13:00

          Вы, очевидно, запутались где-то в своём мозгу, ибо я как раз и говорил, что это мир эгоистов, где никто никому ничего не должен, где люди думают в основном о себе, а из за этого и такие проблемы возникают.
          Но похоже вам так хотелось поскорее противопоставить себя мне, что вы даже не заметили, что повторили именно то, что я сказал.


          1. StrangerInRed
            04.12.2015 13:20
            +3

            Я противопоставил свое мнение тому что

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

            Проблемы возникают не из-за эгоизма.
            Но похоже вам так хотелось поскорее противопоставить себя мне, что вы даже не заметили, что повторили именно то, что я сказал.

            Я повторил слова, с интонацией на то, что это не есть плохо. Мир эгоистов — хорошо.


            1. VasakaInc
              04.12.2015 15:05
              -2

              У вас определённо не лады с логикой. Я не понимаю как из:

              найдётся человек, который напишет этот GUI для тех кому он нужен
              у вас получилось:
              он найдется, и напишет GUI, он может спокойной не рассказывать об этом никому, а только втихомолочку соло им пользоватся.

              Предельно понятно написано: «Человек найдётся, напишет, отдаст.»
              Вы читаете это как: «Человек найдётся, напишет, не отдаст.»
              И далее отвечаете мне на: «Человек найдётся, напишет, не отдаст», хотя я такого не говорил.

              Мир эгоистов — хорошо.
              Чего вам и желаю.


      1. poxu
        04.12.2015 12:48
        +2

        Вам несколько раз уже написали, почему индексация с нуля лучше и удобнее, чем индексация с еденицы. Я не к тому, что вам несколько раз сказали, а вы не заметили, а к тому, что написали несколько разных причин, по которым это так. Если бы речь была об языке для обучения — индексанция с еденицы имела бы смысл (кстати она есть например в паскале, созданном для этих целей).

        Гитаристов заставляют с самого начала правильно держать гитару. Поначалу это неудобно, но потом выясняется, что только так и можно. То же самое с индексацией. И похожая вещь с GUI.


        1. Ruckus
          04.12.2015 12:54
          +2

          Ужасная идея делать такие гадости в «языках для обучения», потом придётся ещё больше мучиться с переобучением.
          PS Я не о единице или нуле как первом индексе сейчас, я о том, что учить первой единице того, кому потом работать с первым нулём.


        1. VasakaInc
          04.12.2015 12:55
          -3

          Вам несколько раз уже написали, почему индексация с нуля лучше и удобнее, чем индексация с еденицы. Я не к тому, что вам несколько раз сказали, а вы не заметили, а к тому, что написали несколько разных причин, по которым это так. Если бы речь была об языке для обучения — индексанция с еденицы имела бы смысл (кстати она есть например в паскале, созданном для этих целей).
          Ну, не знаю. А вот хабраюзер Ogre, к примеру (да и не только он один), говорит противоположные вещи. Почему я должен больше верить аргументации этих нескольких, а не нескольких других? Тем более что мой здравый смысл говорит противоположное тому, что говорят те, которых вы привели в пример.


          1. WST
            04.12.2015 13:01
            +2

            Нужно не верить кому-то, а учиться самому и приходить к собственным выводам. Если Ogre что-то говорит, значит, у него есть какой-то опыт за плечами, в пользу такого варианта. С большой долей уверенности это опыт с Lua или erlang (или другим языком, использующим индексацию с 1). Но тот же Ogre в другом комментарии отметил интересный факт: в огромном его проекте на erlang почти нигде не встречается операция доступа по индексу, зато повсеместно использована операция «отсечения головы». Вот это высокоуровневость в действии. Вы же цепляетесь за каждый аргумент, который находите вам по нраву, и не смотрите на остальные. И упорно остальным что-то доказываете.

            Почему нельзя просто взять и понять, что вы не Галилей и не Джордано Бруно? Вы могли бы себя с ними сравнивать (имели бы моральное право), если бы вы имели опыт в программировании на уровне тех, кто вас критикует, и могли противопоставить им ваш собственный язык программирования, а не подборку выдранных из контекста мнений, которые по какому-то известному только вам принципу считаете авторитетными.


            1. VasakaInc
              04.12.2015 13:06
              -2

              Вы ещё про «что» не ответили.


              1. WST
                04.12.2015 13:14

                Так я задание вам дал, написать «как слышите» и просклонять. Или вы не только программировано, но и читать не умеете? :)

                Хорошо, я выполню вашу работу за вас. Предположим, мы будем писать «што». Как это повлияет на слова, образованные от этого слова? К примеру, слово «ничего». «Там нишего нет». Или «Там нищего нет»? Или, быть может, «Там нишэво нет»?

                Правила в естественном языке нужны для того, чтобы существовал критерий, по которому можно было бы однозначно сказать, правильно написано слово или фраза, или же допущена ошибка. Чуть выше я привёл пример с индонезийским языком. Знаете, почему там рискнули и заменили “oe” на “u”? Потому что это “oe” было как бельмо в глазу — ни к селу ни к городу. И его простая замена на “u” ничего не нарушала. Я же показал вам, как трудно что-то заменить в русском языке. В русском языке феерически сложное словообразование, все эти падежи-приставки-суффиксы. И дело с этим языком в том, что вы его введением своего «правила» отнюдь не упростите. Наоборот, язык станет ещё большим тёмным лесом — если раньше в нём были хоть какте-то орфографические и грамматические правила, то после этого окончательно придётся всё забыть и заучивать каждое слово и его форму отдельно. Отдельно каждую форму каждого слова, Карл!

                Возьмите любой достаточно содержательный пост из этого обсуждения и попробуйте переписать его «как слышите». Не для меня — результат вообще можете никому не говорить. А просто для себя.


                1. Ogra
                  04.12.2015 13:16
                  +2

                  Белорусский язык вас сильно удивит =)
                  Например от существительного «малако» прекрасно образуется прилагательное «малочный». Потому что как слышится, так и пишется.


                  1. WST
                    04.12.2015 13:19

                    В каком плане? Тем, что он является примером такого вот «тёмного леса»? Не потому ли в Белоруссии (или Беларуси — я помню, что всем не угодишь) всё больше предпочитают использовать русский?

                    (upd) понятно (отвечу редактированием на редактирование)


                1. VasakaInc
                  04.12.2015 14:54
                  -4

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

                  Хорошо, я выполню вашу работу за вас.
                  Возьмите любой достаточно содержательный пост из этого обсуждения и попробуйте переписать его «как слышите». Не для меня — результат вообще можете никому не говорить. А просто для себя.
                  Вы думаете, я не пошёл у вас на поводу просто потому, что мне лень или узколобый кретин? Тут уже говорили про фундаментальную ошибку атрибуции…
                  Я занимаюсь этим вопросом достаточно, чтобы понимать какие изменения к чему приведут и естественно у меня есть тестовые тексты для анализа и в виде примеров.
                  Есть места в языке изменение которых вызывают цепную реакцию, а есть места, которые можно смело менять без всяких последствий и у меня возникает логичный вопрос, зачем заучивать эти исключения, если можно их изменить?

                  Вот мы и наблюдаем огромную массу людей готовых бороться за статус-кво вопреки всему, вопреки здравому смыслу.


                  1. WST
                    04.12.2015 14:55
                    +4

                    Кто бы говорил о статусе-кво и о здравом смысле…


                    1. VasakaInc
                      04.12.2015 15:12
                      -3

                      Кто бы говорил о статусе-кво и о здравом смысле…
                      Вот это всё, что вы можете сказать? :) Аргумент из разряда: «Сам дурак»?

                      Тогда специально для вас небольшая выдержка из книги по логике:
                      Соблюдение законов логики необходимо, чтобы найти истину. Но если спорящие стороны интересует не истина, а победа в споре, то противники прибегают к способам, запрещённым логикой. Наиболее распространёнными являются следующие:

                      1. «Доказательство (довод) к личности» — вместо опровержения тезиса или аргументов, дают отрицательную оценку его личности.
                      2. «Довод к публике» — вместо обоснования истинности или ложности тезиса стремятся повлиять на чувства людей, чтобы они поверили в его истинность или ложность без доказательства.
                      3. «Дамский аргумент» — сведение к абсурду выдвинутого положения.
                      4. «Готтентотская мораль» — двойственная оценка одного и того же утверждения с целью использовать ту из них, которая в данный момент наиболее выгодна для достижения победы в споре.
                      5. «Бездоказательная оценка утверждений противника» — типа «Ерунда», «Бред» и т.д.
                      6. «Карманные доводы» — подмена вопроса об истинности утверждения вопросом, о вреде или опасности его.
                      7. «После этого, значит по причине этого» — простую последовательность событий во времени понимают за их причинную связь.
                      8. «Поспешное обобщение» — рассмотрев несколько частных случаев, делают вывод обо всех предметах данного класса.
                      9. «Палочные аргументы» — угрозы в адрес противника и др.


                      1. WST
                        04.12.2015 15:34
                        +5

                        Я привожу вам достаточно много аргументов. Вы же постоянно просите ещё и ещё. Я написал вам уже целую стену текста в этом обсуждении (и причём не одну), и после этого вы, терпеливо дождавшись наконец, когда я опубликую комментарий просто на «отвали», вывалите спешное обвинение в том, что все мои аргументы — это «сам дурак»? Что ж, мне всё больше становится ясна ваша стратегия. Беспомощно пытаясь оправдаться, вы всеми силами делаете вид, будто оправдываюсь перед вами я.

                        Ваши аргументы здесь очень похожи на троллинг — только грамотный, хитрый, скрытый. Вы выдвинули 3 тезиса под громким заголовком «почему наши ЯП не такие высокоуровневые), при этом ваши тезисы не имеют никакого отношения к делу. Можете ссылаться на учебник по логике сколько угодно, но в чём смысл поднятия вопроса об индексах, если вы догадывались (и даже хвастались «во, я нащупал больное место» или типа того), что это приведёт к холивару? Почти всегда топики подобного рода приводят к интенсивному срачу в комментариях, потому что будут диаметрально противоположные точки зрения. Вам очень многие (и я в том числе) назвали язык Lua и фреймворк Love, чего ещё вы пытаетесь добиться? Неужели вы спорите с пеной у рта просто ради того, чтобы спорить? Или для вас это способ скрасить ваше времяпрепровождение?

                        Открою секрет: есть лишь одна причина, по которой я сам пишу такие подробные и развёрнутые ответы: мне самому это помогает провести время. Мне интересна ваша мотивация и её причины, я пытаюсь понять, что вами двигает. И, хотя карму здесь принято не обсуждать, я рискну заметить, что несмотря на то, что мой первый голос за вас был отрицательным, на какой-то момент я изменил своё решение, потому что мне показалось, что вы начали находить взаимопонимание с сообществом.

                        Раз уж взялись обсуждать не только ЯП, но и естественные языки… Вот сейчас вы говорите, что русский язык крайне сложен итд итп — не то ли это самое, что я вам сам сказал несколькими минутами ранее? Я отметил, что сейчас в нём есть хотя бы какие-то правила. Что будет, если разрушить и это, как вы предлагаете? Что заставляет вас считать, что язык от этого станет проще? Или, как у вас уже спросили, какая именно проблема будет решена, если вместо «что» мы все будем писать «што»?


                        1. lair
                          04.12.2015 15:36
                          +4

                          Вы же постоянно просите ещё и ещё

                          … при этом игнорируя уже высказанные аргументы и заданные вопросы, да.


                          1. bromzh
                            04.12.2015 15:40
                            +6

                            Может автор просто проводит какое-то психологическое исследование? Потом. может, статью опубликует где-то…


                            1. VasakaInc
                              04.12.2015 16:28
                              -5

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


                        1. VasakaInc
                          04.12.2015 16:22
                          -4

                          Я отвечу что мною движет. Я постоянно, по роду своей деятельности, наблюдаю ситуации в которых люди отстаивают статус-кво только потому, что так было до них.
                          Они продолжают отстаивать это и тогда, когда есть равные аргументы «за» и «против».
                          Они даже продолжают отстаивать это когда не осталось никаких аргументов «за» и статус-кво стал противоречить здравому смыслу.
                          Отчего так происходит?
                          Во всём виновата человеческая психология поведения. Вот конкретный пример-исследование (довольно известное, если постараетесь, можете найти):
                          Брали несколько детей (7-10 ребятишек) и только один из них испытуемый, остальные подставные. Сажали их за стол на котором стояли две пирамидки «чёрная» и «белая» и просили назвать какого они цвета. Сначала опрашивали подставных детей, которые говорили, что обе пирамидки чёрные. Последним спрашивали испытуемого, который тоже говорил, что обе пирамидки чёрные. Так отвечало подавляющее большинство детей за редким исключением. После этого его просили подать белую пирамидку, он безошибочно выбирал белую и подавал. А потом его спрашивали: «А почему ты тогда сказал, что они обе чёрные?» и, как говорится, немая сцена. Дети не могли объяснить почему они сказали, что обе пирамидки чёрные.
                          Таких экспериментов в психологии поставлено довольно много и с детьми и со взрослыми. Все они подтверждают то, что люди готовы идти вопреки здравому смыслу, лишь бы не против окружения и сложившегося положения вещей.
                          Мне казалось, хабросообщество в среднем несколько более разумно, нежели в целом человечество. Так собственно и оказалось, хотя позиция: «так и должно оставаться, потому что так было всегда» или «так и должно оставаться, потому что вы дилетант, а мы скпер-пупер профессионалы» всё же преобладает.
                          Что же касается темы поднятой в топике, то меня волновало именно то, что там написано. Почему наши высокоуровневые языки программирования до сих пор не такие уж и высокоуровневые? Никакого тролинга.

                          А по поводу кармы, вы действительно думаете, что меня волнует положительный баланс местной валюты (в виде кармы). Меня больше волнует погода на завтра чем местная карма. Я ничего не теряю, если меня отхабарят, теряет сообщество.
                          Причём доля упёртых вроде «этот вопрос нельзя поднимать, просто потому, что его нельзя поднимать» растёт, а доля здравомыслящих людей с критическим мышлением, готовых поставить неудобный вопрос — снижается. Не нужно быть провидцем, чтобы предсказать во что в результате превратится сообщество хабра.


                          1. bromzh
                            04.12.2015 16:27
                            +8

                            Они продолжают отстаивать это и тогда, когда есть равные аргументы «за» и «против».
                            Они даже продолжают отстаивать это когда не осталось никаких аргументов «за» и статус-кво стал противоречить здравому смыслу.

                            Вы очень точно описали своё поведение)


                          1. WST
                            04.12.2015 16:47
                            +6

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

                            Ещё раз: вы подняли вопрос о недостаточной высокоуровневости языков. О том, что «воз и ныне там». Вам в ответ заметили, что вы аппелируете не к тому, к чему нужно бы. За минувшие 20 лет языки далеко шагнули в своём развитии — стали намного популярнее функциональные языки (Haskell, LISP, erlang), появилось ООП там, где его не было (PHP), наконец, самое главное — появилось великое множество новых замечательных языков: Go, Rust, Nim. Каждый из них реализует какие-то уникальные идеи, например, Go направлен как раз на лёгкое вхождение. Вы же придираетесь к индексам и типам. Весь сыр-бор из-за того, что не имеет совершенно никакого отношения к делу. Изменились парадигмы, а вы говорите, что «ничего не изменилось».

                            Дальше. По поводу «здравомыслящих людей с критическим мышлением, готовых поставить неудобный вопрос» — по-вашему, такие «неудобные вопросы» нужно задавать лишь большинству? Весь этот хабратопик является, по сути своей, примером критической оценки ваших мыслей. Попыткой направить их в более конструктивное (замечу — не правильное, а более конструктивное, потому что обсуждаемые здесь вопросы носят очень субъективный характер) русло. Но вы провозглашаете «упёртыми» всех, кто пытается вам что-то возразить.

                            Попробуйте взглянуть на ситуацию с точки зрения IT-шника, т.е человека, имеющего техническое, а не гуманитарное, образование. Вы думаете, его больше всего волнуют индексы и типы данных? Он просто молча делает свою работу, используя имеющиеся инструменты. Если он задумывается об их несовершенстве, то думает уж точно не об индексах. Он будет думать об индексах только в одном случае — если ему приходится менять ЯП.

                            Вы также упрекнули меня (пункт 1 выдержек из учебника) в «критике личности». Здесь причина проста: прозанимавшись 20 лет чем-то не относящимся к IT, вы снова пришли в этот мир, и начали искать здесь проблемы, не обладая необходимым для этого опытом. Поймите, что это не критика вашей личности — это констатация факта, аргумента, который здесь не в вашу пользу. Вы умеете аргументировать свою позицию — это замечательно, и это то единственное, что удержало многих ваших оппонентов от более негативных возражений, но вам нужно обращать внимание на все доводы, а не только те, которые вы находите для себя «симпатичными». И не думать о людях настолько предвзято, что, мол, если я говорю, что мне нравится индексация с 0, то это просто потому что все кричат, что она им нравится.


                            1. VasakaInc
                              04.12.2015 17:16
                              -5

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

                              Изменились парадигмы, а вы говорите, что «ничего не изменилось».
                              Из топика:
                              Многое было привычно, если не по внешнему виду, то по концепции: переменные, циклы, операторы ветвления… А что-то было совсем новым: ООП с его классами (полями, методами, свойствами), наследованием и т. д.
                              Конечно, многое порадовало. Классы теперь позволяют заниматься распределением обязанностей: Так, ты мне принеси «то»; Ты сделай «это»; Ты посчитай мне «это», результат сообщишь. Это очень напоминает наше взаимодействие с окружающей средой. Например, зашли в прачечную, отдали грязное постельное бельё, забрали чистое. Зашли в ателье, отдали ушить брюки, забрали готовый вариант. Зашли в закусочную, сделали заказ, получили завтрак. Очень удобно и наглядно.
                              Как из этого следует, что я утверждаю, что ничего не изменилось, мне не понятно.


                              1. lair
                                04.12.2015 17:25
                                +4

                                Омг, и вы это называете изменениями в языках программирования за 20 лет? То, что двадцать лет назад C++ было уже больше десяти лет, вас никак не смущает? А объектно-ориентированному подходу — как бы не тридцать с лишним?

                                Вы действительно не видите того, что на самом деле изменилось в языках за эти двадцать лет. И ваше «высокоуровневые языки не такие уж высокоуровневые» на самом деле сводится только к «C# не такой, как я бы хотел». Ну да, C# — язык не самого высокого уровня абстракции на данный момент. Это не проблема языка, это данность и решение, принятое при его дизайне, не нравится — возьмите другой язык, лучше удовлетворяющий вашим запросам.


            1. Ogra
              04.12.2015 13:09
              +3

              Вы же цепляетесь за каждый аргумент, который находите вам по нраву, и не смотрите на остальные.

              Фундаментальная ошибка атрибуции в действии.
              У меня проект на erlang и с++, я не испытываю проблем ни с индексацией с 0, ни с индексацией с 1, и знаю плюсы и минусы обоих подходов.
              Просто так уж получилось, что в этом топике фанатиков, ратующих за «индексацию с 0» слишком много. Тех, кто просто привык к такому подходу, но уверенных что «так и надо, это самое правильное и гениальное что только можно придумать».


              1. defuz
                05.12.2015 04:06

                В функциональных языка индексация практически никогда не нужна. Индексация нужна для циклов, в функциональных же языках используется map, fold и т. д. И мне вполне понятно, почему в Erlang есть какой-то метод, который возвращает элемент по счету. Только что толку спорить об этом с автором статьи, если ему до функциональных языков как до луны?

                Кстати, подумайте над тем, каково бы вам было именно в С++ с индексацией с нуля. Наверное не очень.


                1. Ogra
                  05.12.2015 07:29

                  Да, я выше уже приводил статистику использования.


                1. Ruckus
                  05.12.2015 22:32
                  +1

                  каково бы вам было именно в С++ с индексацией с нуля

                  Именно в C++ индексация с нуля.


                  1. defuz
                    06.12.2015 18:14
                    +1

                    Это была очевидно ошибка, я хотел сказать «подумайте над тем, каково бы вам было именно в С++ с индексацией с единицы.»


          1. ad1Dima
            04.12.2015 13:09
            +4

            Вы однобоко трактуете высказывания хабраюзера Ogra. Он грамотно объясняет, почему индексация идёт именно с 0, но говорит, что у программиста должна быть возможность индексировать как ему угодно.


  1. Renius
    04.12.2015 11:47

    Вам должно понравиться :)
    ? ~ irb
    2.2.3 :001 > [1,2,3].first
    => 1
    2.2.3 :002 > [1,2,3].last
    => 3


  1. Ununtrium
    04.12.2015 16:02
    +5

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


  1. michael_vostrikov
    04.12.2015 17:04
    +2

    Я тоже как-то задумался, почему в жизни счет ведется с единицы, а в компьютерах с 0. И в чем различие. Получились такие мысли.

    Сначала было бы неплохо определиться, что вообще означает «прибавить единицу», как это можно выразить математически? Началось все со счета на пальцах и палочках. Целочисленный счет на числовой прямой можно выразить набором единичных векторов, следующих один за другим — первый вектор, второй вектор…


    И тут возникает такой вопрос — включать концы вектора или нет в отрезок, соответствующий числу 1? Есть 4 варианта — включать оба, включать правый, включать левый, не включать.


    В первом точка между векторами принадлежит им обоим, в четвертом образуются промежутки. Эти варианты отбрасываем.
    Третий вариант соответствует обычному счету предметов — чтобы с уверенность сказать, что овечка перепрыгнула через забор, надо чтобы она полностью была по эту сторону забора, а если хвост у нее еще по ту сторону, то так сказать нельзя. Перепрыгнула полностью — плюс один. Ноль в этом варианте не принадлежит ни одному вектору. Думаю, это одна из причин, почему он появился позже остальных цифр. Ну типа — мы всех овечек посчитали, каждой овечке соответсвует палочка, какой еще ноль?
    Второй вариант соответствует адресации, которая используется в компьютерах. Допустим, у нас есть массив четырехбайтовых целых чисел. Элементы массива состоят из байтов, байты из битов. На любом уровне удобнее отсчитывать элементы в порядке возрастания. Для получения начального элемента массива надо взять байты со смещением [0, 1, 2, 3]. Аналог обычного счета был бы такой — прибавить к адресу массива размер элемента 4 байта, байты со смещением [-1, -2, -3, -4] это начальный элемент. Опять же big/little endian здесь можно вспомнить.


  1. lair
    04.12.2015 18:26
    +2

    BTW

    В третьих, нужно следить за переполнением типа

    Вообще-то, тот самый C#, которым вы, по вашим словам, пользуетесь, позволяет за этим не следить.


  1. potan
    07.12.2015 18:46
    +3

    1. В математике удобнее считать 0 натуральным числом. По мне так правильнее учить людей математике и менять менталитет (в плодь до внедрения симметричных систем счисления), чем делать извращенным интерфейс к массивам. В прочем в matlab, R и Julia нумерация начинается с 1 — я считаю это недостатком этих языков.
    2. Авторы Erlang так и рассуждали. Но работа с числами неопределенной размерности требует выделение/освобождение памяти, что не слишком эффективно. Оптимизации такого рода будут важны еще долго. Даже в Haskell, где тип Int неограничен, часто испорльзуют специализированные целочисленные типы.
    3. Свойства и цели использования целых и дробных чисел сильно различны. От объединения не будет ни какой пользы, а вреда будет достаточно много.


    1. VasakaInc
      07.12.2015 19:30
      -3

      1. В математике удобнее считать 0 натуральным числом. По мне так правильнее учить людей математике и менять менталитет
      Или так! Важно привести всё «к единому знаменателю», а к какому это уже вопрос другой.
      Вопрос в том что лучше и проще сделать.
      А сейчас у нас набор программистов идёт из обычных людей, которые поголовно считают с 1, отсюда и проблема.
      2. Авторы Erlang так и рассуждали. Но работа с числами неопределенной размерности требует выделение/освобождение памяти, что не слишком эффективно. Оптимизации такого рода будут важны еще долго. Даже в Haskell, где тип Int неограничен, часто испорльзуют специализированные целочисленные типы.
      А есть какие-то осязаемые данные насколько это сказывается на эффективности?
      3. Свойства и цели использования целых и дробных чисел сильно различны. От объединения не будет ни какой пользы, а вреда будет достаточно много.
      Насчёт «не будет никакой пользы» я категорически не согласен. Или считать просто числами, или думать какой тип даных, целочисленный или с плавающей запятой использовать и потом приводить один к другому в случае необходимости.
      Может быть польза не будет очень большой, но говорить, что «не будет никакой пользы», мне кажется, перебор.

      Весь вред, насколько я понимаю, в снижении скорости расчётов? Есть какие-то данные насколько снизится скорость?


  1. VasakaInc
    07.12.2015 21:39
    -2

    А не подскажете случайно ещё какую-нибудь тему, которая вас, программистов заставит кипятком писать, чтобы ещё статью написать? )))))
    Минусуйте мужики! Утолите свою жажду мести!!!


    1. Mrrl
      07.12.2015 22:14
      +6

      Выбирайте:
      — можно ли использовать goto, break и continue?
      — как расставлять фигурные скобки и пробелы?
      — какая должна быть длина метода? А класса?
      — что лучше, C# или Java?
      — надо ли уметь писать стандартные алгоритмы?
      — что лучше — использовать уже написанную кем-то библиотеку, или написать свою, более подходящую к проекту?
      — надо ли знать C (или ассемблер)?
      — нужно ли программисту знать математику? Нужно ли ему высшее образование?
      — что лучше — фриланс, работа в стартапе или работа в крупной известной компании?

      Возможно, что-нибудь ещё добавят.


      1. VasakaInc
        07.12.2015 22:17

        — как расставлять фигурные скобки и пробелы?
        Точно! Как я мог забыть! )))))


        1. poxu
          08.12.2015 10:54
          +2

          Всё это фигня. Вот в php перед каждой переменной нужно ставить знак доллара $ обязательно. Напишите, что это неудобно и что лучше бы это убрать. Вот это будет успех.


          1. VasakaInc
            08.12.2015 12:28
            -1

            Всё это фигня. Вот в php перед каждой переменной нужно ставить знак доллара $ обязательно.
            Это круто! А какое-то логическое обоснование этому есть? Или тоже: «Тут так заведено»?


            1. poxu
              08.12.2015 13:00
              +3

              Логического обоснования нет. Есть тяжёлое эволюционное наследие, корни которого уходят, как мне какжется, к шелл-скриптам, а может ещё глубже.

              Но многие программисты скажут, что так IDE легче строить список используемых переменных для контекстной подсказки, другие скажут, что не так уж это и сложно — набирать знак доллара, все уже привыкли, а третьи скажут, что есть множество других, более важных проблем. И вот эти третьи — ещё лучшие представители профессии, ибо они таки признают, что у языка действительно есть проблемы :).


              1. VasakaInc
                08.12.2015 13:28
                -4

                Теперь всё ясно с этим PHP. :)
                А вообще, такое положение дел наблюдается в любой области, не только в программировании. Везде одни и те же люди, выросшие в одном и том же социуме и учившиеся в одних школах и институтах. Как следствие и проблемы и ошибки у этих людей одни и те же в какую бы профессию они не подались. Небольшие различия, конечно, будут присутствовать в разных областях деятельности, но не значительные.
                Везде наблюдается инерционность мышления и неистовое отстаивание заведённых порядков.


                1. lair
                  08.12.2015 13:32
                  +6

                  Интересно только, откуда ж тогда берутся люди, у которых нет этих проблем и ошибок.


                  1. Mrrl
                    08.12.2015 18:28
                    +3

                    Выходят из леса. Или из дикого прошлого. Поэтому, «заведённых порядков» они не знают, и отстаивать им нечего. И «проблемы и ошибки» у них совсем другие.


    1. VasakaInc
      08.12.2015 13:34
      -5

      Кто-то не удержался, минусонул. )))))
      Ну как, полегчало тебе?


      1. VasakaInc
        08.12.2015 15:23
        -5

        Смешные… )))
        Если бы я был посетителям ресторана, а вы официантами или поварами, вы бы мне от злости в тарелку плюнули из мести? :)
        Хороший повод взглянуть на себя со стороны, но вы вряд ли на такое способны.

        А вот людям которые находятся рядом с вами было бы полезно задуматься каков моральный облик ваших друзей/близких/коллег… (Нужное подчеркнуть.)


        1. ad1Dima
          08.12.2015 15:28
          +6

          Если бы вы были посетителем ресторана, то к вам бы как минимум уже охрану вызвали за дебош.


          1. VasakaInc
            08.12.2015 15:46
            -1

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


            1. ad1Dima
              08.12.2015 15:58
              +2

              Бессмысленно. Это как объяснять шутку: если человек её не понял, можно, конечно, рассказать в чем соль, но смешно ему все равно не будет.


              1. VasakaInc
                08.12.2015 16:02

                Так я и думал.
                Вопросов больше не имею.


        1. bromzh
          08.12.2015 15:37
          +4

          Вы скорее похожи на ресторанного критика из недавней (s19e04) серии южного парка. Ну и конец вполне закономерный.

          Вроде психолог, а ведёте себя как Д'Артаньян в стране… не Д'Артаньянов. Чуть ли не мучеником себя пытаетесь изобразить. Может стоит завести себе бложек или твиттер, и там жаловаться на местных обитателей, а не засорять техресурс?


          1. VasakaInc
            08.12.2015 15:41

            Вычеркнуть данный топик из трекера у вас конечно же мысли не возникало?
            Что вас до сих пор заставляет за ним следить и страдать?


            1. bromzh
              08.12.2015 15:54
              +5

              Кто сказал, что я страдаю? Срачи — это весело!


              1. VasakaInc
                08.12.2015 17:47
                -2

                Тогда, ей богу, не понимаю чем вы недовольны.


                1. poxu
                  08.12.2015 18:08
                  +6

                  Да все в общем довольны. Вас просто информируют, как вы выглядите со стороны. Это можно сказать даже проще. На данный момент вы собой не владеете. По другому

                  Кто-то не удержался, минусонул. )))))
                  Ну как, полегчало тебе?

                  Вот это не объяснить.

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


                  1. VasakaInc
                    08.12.2015 19:05
                    -3

                    А вы решили выплеснуть эмоции, что трактуется как потеря контроля над собой.
                    Правильно было бы вот так: «А вы, как мне показалось, решили выплеснуть эмоции, что, мной было истолковано, как потеря контроля над собой.»
                    Но вы ошиблись.
                    Вам стоило бы усвоить одну простую вещь: между фразами «я убеждён» и «я убедился» большая разница.


                    1. poxu
                      08.12.2015 19:59
                      +4

                      Правильно было бы вот так: «А вы, как мне показалось, решили выплеснуть эмоции, что, мной было истолковано, как потеря контроля над собой.»

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

                      Тогда вы могли бы объяснить, зачем вы на самом деле написали процитированный мной коментарий. Но вы не сделали и этого. Что ж, возможно вы считаете, что я просто не способен вас понять. Тогда меня стоило бы прогинорировать.

                      Но нет, вы решили сообщить мне, что мне всё это показалось и что мне надо бы следить за корректностью своих высказываний. Особенно забавно это выглядит, если учесть, что дальше вы безапеляционно утверждаете, что я ошибся, безо всяких там мне показалось. Но может я и правда ошибся и процитированную мной реплику можно истолковать как-то по другому? Было бы крайне интересно послушать.


                      1. VasakaInc
                        08.12.2015 21:34
                        -3

                        Но нет, вы решили сообщить мне, что мне всё это показалось и что мне надо бы следить за корректностью своих высказываний.
                        Это я сказал не только для вас, но и для многих других, которые способны уловить суть вашей ошибки.
                        Особенно забавно это выглядит, если учесть, что дальше вы безапеляционно утверждаете, что я ошибся, безо всяких там мне показалось.
                        Разница в этих двух случаях в том, что вы не можете заглянуть внутрь меня (или можете? поделитесь тогда как вы это делаете) и лишь делаете предположение о моих истинных мотивах. А я вполне могу заглянуть в себя и увидеть, что истинные мотивы другие.
                        Вот если бы я говорил о вашем поведении и его мотиве без всяких, я предполагаю/мне кажется и т.д., тогда можно было бы провести параллели и упрекнуть меня.
                        Но может я и правда ошибся и процитированную мной реплику можно истолковать как-то по другому?
                        Письменная речь, устная реплика, или даже мимика лица и жестикуляция конечностями это только внешнее выражение. Вопрос только чего?
                        Вы предполагаете, что эмоции напрямую связаны и диктуют это внешнее выражение.
                        (эмоция) Обида. Упала пелена на глаза -> (внешнее выражение) Ах ты морда, да я тебя! И т.п.
                        Но это далеко не всегда так. Внешними выражениями может с такой же лёгкостью управлять ум. Причём, в зависимости от ситуации делать/говорить то, что прямо противоположно эмоциям (которых может и вообще не быть в какой-то ситуации).

                        Есть хороший пример в фильме: «В августе 44-го». В конце убивают коменданта и один из агентов играет крайнее потрясение от гибели друга Васьки (этого коменданта) и кричит, что «я и жить не хочу», и «я тебя сейчас порву», выжившему шпиону, нагоняет на того такой страх, что шпион выдаёт всё что надо было от него узнать. После этого, этот агент, который только что потерял друга Ваську и пребывал в истеричном состоянии спокойно встаёт и уходит. Погибший комендант не то что другом ему не был, его вроде бы даже и не Васькой звали.
                        Казалось бы, со стороны мы наблюдаем реакцию крайнего потрясения и то, что эмоции напрямую управляют агентом, а на самом деле ему просто нужны были данные и никаких эмоций из за убитого коменданта он не испытывал.
                        Вот наглядная демонстрация того, что я описал выше и того в чём вы ошиблись (и фильм классный, очень рекомендую). На самом деле, это не такая уж и редкость, примеров вокруг полно, было бы желание увидеть.
                        Было бы крайне интересно послушать.
                        Ничего секретного. Общаясь с людьми в комментариях к этой теме я увидел очень много интересных, здравомыслящих и просто приятных людей. С ходу всех не вспомню, но на вскидку (Ogra, divan0, asm0dey, Mrrl, leshabirukov, Ruckus, poxu) А так как возвращаться на хабр я больше не собираюсь, я решил напоследок коснуться некоторых вопросов из области психологии, которые могли бы им показаться интересными и пригодиться в будущем. Всё просто.

                        Таким товарищам как lair я уже давно не отвечаю, они мне просто не интересны, а не потому, что мне нечего ответить. Пусть минусуют, как я уже сказал, местная валюта в виде кармы и рейтинга меня не интересует, возвращаться на хабр я не собираюсь. Вероятно, им будет вдвойне обидно. Так старались, минусили… )))


                        1. lair
                          08.12.2015 22:01
                          +2

                          Таким товарищам как lair я уже давно не отвечаю, они мне просто не интересны, а не потому, что мне нечего ответить.

                          К сожалению, у вас есть только один способ доказать это утверждение.


                        1. poxu
                          09.12.2015 00:33
                          +3

                          Внешними выражениями может с такой же лёгкостью управлять ум. Причём, в зависимости от ситуации делать/говорить то, что прямо противоположно эмоциям (которых может и вообще не быть в какой-то ситуации).

                          Ну это уже классическое — «на самом деле я просто притворялся». Часто встречается в молодёжных комедиях.
                          Пусть минусуют, как я уже сказал, местная валюта в виде кармы и рейтинга меня не интересует, возвращаться на хабр я не собираюсь.

                          Создаётся впечатление, что вы уходите потому, что вас заминусовали. Но у вас в карме совсем небольшой минус, а минусы к коментариям это не так уж важно. Вы присутствуете на хабре уже достаточно долго и, если карма и рейтинг и вправду вас не интересуют — зачем вам уходить?
                          Останьтесь, напишите ещё статью, подискутируйте в комментариях. Неужели это совсем не интересно?
                          Вероятно, им будет вдвойне обидно. Так старались, минусили… )))

                          Поставить минус не представляет вообще никакой трудности. Так что обидно будет в основном тем, кто старался объяснить вам в чём вы ошибаетесь и почему. Таким, кстати, как lair, который между прочим дал ссылку на подробное объяснения чем удобна индексация с нуля за авторством Дейкстры. Скажите ему спасибо и, если у вас есть что возразить Дейкстре — напишите об этом статью. Это будет интересно почитать.


                          1. VasakaInc
                            09.12.2015 10:50
                            -2

                            Ну это уже классическое — «на самом деле я просто притворялся». Часто встречается в молодёжных комедиях.
                            Как вам будет угодно.
                            Основную мысль я смог объяснить, а вы, похоже, поняли. Относительно нюансов я спорить с вами не буду.
                            Создаётся впечатление, что вы уходите потому, что вас заминусовали.
                            Именно так.
                            Но у вас в карме совсем небольшой минус, а минусы к коментариям это не так уж важно.
                            Дело не в количестве минусов. Столкнувшись я программированием я удивился некоторым моментам и хотел обсудить почему это так. Я никак не ожидал, что меня заминусуют. Я конечно понимал, что это может быть больной темой, но минусовать только потому что человек посмел спросить, это мне кажется не серьёзно.
                            Вы присутствуете на хабре уже достаточно долго и, если карма и рейтинг и вправду вас не интересуют — зачем вам уходить?
                            Для чтения хабра логин не нужен.
                            Останьтесь, напишите ещё статью, подискутируйте в комментариях. Неужели это совсем не интересно?
                            Благодарю, но нет. Не интересно.

                            Спасибо всем.


                            1. lair
                              09.12.2015 11:07
                              +4

                              Я конечно понимал, что это может быть больной темой, но минусовать только потому что человек посмел спросить, это мне кажется не серьёзно.

                              А вы так и не поняли, что вас минусуют не за то, что вы спрашиваете, а за то, что вы отказываетесь слышать ответы?


        1. lair
          08.12.2015 15:59
          +5

          Если бы я был посетителям ресторана, а вы официантами или поварами

          Как и любая аналогия, эта аналогия врет. Официанты и повара предоставляют посетителю ресторана какие-то услуги. А пользователи хабра друг другу (в рамках хабра) услуг не предоставляют.