1. Си / Говнокод #12887

    +138

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    typedef struct {
       UInt8 byte0;
       UInt8 byte1;
       UInt8 byte2;
       UInt8 byte3;
       UInt8 byte4;
       UInt8 byte5;
       UInt8 byte6;
       UInt8 byte7;
       UInt8 byte8;
       UInt8 byte9;
       UInt8 byte10;
       UInt8 byte11;
       UInt8 byte12;
       UInt8 byte13;
       UInt8 byte14;
       UInt8 byte15;
    } CFUUIDBytes;

    http://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFUUIDRef/Reference/reference.html
    Nuff said.

    Запостил: byss, 12 Апреля 2013

    Комментарии (148) RSS

    • В массиве можно выйти за его пределы. И получить переполнение.
      Ответить
    • показать все, что скрытоНа самом деле проблема выхода за пределы массива, это проблема выведения типов. При чем такая, которую прогрессивное человечество еще не решило, но пытается. Я не уверен на счет денежных призов решившему эту проблему, но как минимум доску почета по адрессу повесят, посмертно.
      Ответить
      • управляемые языки уже давно придуманы
        Ответить
        • Они не решают проблему выведения типа. Они либо вообще не заостряют внимание, либо определяют тип как ValidRange[0...N] | RuntimeError - что эквивалентно типу "Х.З".
          Ответить
      • 1. Static elimination of array-bounds checking is a long-standing goal for type system de-
        signers. In principle, the necessary mechanisms (based on dependent types—see §30.5) are
        well understood, but packaging them in a form that balances expressive power, predictability
        and tractability of typechecking, and complexity of program annotations remains a significant
        challenge. Some recent advances in the area are described by Xi and Pfenning (1998, 1999).

        - Benjamin C. Pierce

        * Для недоверчивых говнокодеров :)
        Ответить
        • И что это значит?
          >либо определяют тип как ValidRange[0...N]
          А как еще определить массив?
          Ответить
          • > А как еще определить массив?
            Some recent advances in the area are described by Xi and Pfenning
            Ответить
          • Я на пальцах не объясню. То, что имел в виду автор базируется на зависимых типах и System F, как механизме. В книжке которую я процитировал приводится пример выведение типа для связного списка чисел с плавающей запятой. Но нужно читать предыдущие разделы, чтобы понять что автор имеет в виду.
            Ответить
            • Если это нельзя просто объяснить, и следовательно реализовать - то зачем такие массивы вообще нужны.

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

              Ну да. Это я понял.
              Как вы собираетесь проверить выбор абсолютно произвольного элемента,
              индекс которого в переменной, вводимой пользователем.
              Причем проверить что введет пользователь НА ЭТАПЕ КОНПЕЛЯЦИИ.
              Причем массив может быть динамическим и иметь произвольную длину.
              Вы в своем уме?
              Ответить
            • как этого достичь до времени выполнения, например, при создании массива, в котором должен целиком расположиться файл неизвестной на этапе компиляции длины, или при вводе индекса массива из консоли
              все равно это будут проверки
              стоило городить это всё - управляемые языки не столько уж оверхеда дают при индексном обращении - да обращение даже к кешу небось займет больше тактов, чем одно лишнее сравнение беззнаковых целых чисел
              Ответить
              • Хайвмайнд!
                Ладно, расходимся. Это очередной вброс, дальше последуют абсурдные аргументы, ссылки на непонятных авторитетов и дискуссия сведется к превосходству лиспа над другими языками (js в частности).
                Ответить
              • Да и та же жаба, насколько помню, умеет убирать ненужные проверки в простых ситуациях типа цикла от 0 до a.length - 1.
                Ответить
              • > чем одно лишнее сравнение беззнаковых целых чисел
                Причем для x86, скорее всего, компилятор помечает переход как "маловероятный", и оверхед от криво предсказанного перехода будет только при вылете за границы массива. А в этом случае на него уже насрать.
                Ответить
                • >Причем для x86, скорее всего, компилятор помечает переход как "маловероятный"
                  А как в ассемблере х86-х64 отметить переход "маловероятным"?
                  Ответить
                  • Походу уже никак. Как оказалось, эти префиксы уже давно не работают даже в 32 битных режимах...
                    Ответить
                    • А в чем логика создателей? Ухудшили свой девайс?
                      Ответить
                    • Компилятор может разместить код таким образом, чтобы все инструкции для ожидаемой ветки были в кэше.

                      http://bit.ly/YEdyCG
                      Ответить
              • О, начинается, "я не читал, но книга - говно". Ну вы же не знаете, что там написано, но, естесственно, потому что не знаете, поэтому и говно :) Список приводится как пример. В контексте System F - это вообще не важно, как вы там элементы сгруппировали. Так что, что список, что массив, что хеш-мап - не важно.
                Короче, чего я рапсинаюсь. Находите доклад: Xi, Hongwei and Frank Pfenning. Eliminating array bound checking through dependent types. In ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), Montreal, Canada, pages 249–257, 1998.
                Просвещаетесь самостоятельно.

                Ответ не только автору поста выше, просто, чтобы не повторять.
                Ответить
                • >поэтому и говно
                  Какое "говно"? У кого "но книга - говно" увидели? Слово "говно" - по треду использовали только Вы. Никто не критиковал Книгу.
                  Вам задали конкретные вопросы. "Как это сделать в рантайме?"
                  А Вы увиливаете.
                  Ответить
                  • Ну даже не знаю... ну вот попробуйте представить, очень упрощенно, что у вас есть следующие типы:
                    Array[0][Integer], Array[1][Integer], ... Array[N][Integer];
                    Array[0][Float], Array[1][Float], ... Array[N][Float];
                    и вы в програмном коде обязаны указывать размер массива, когда описываете функцию, которая с ним работает. Конечно, у такого упрощенного варианта есть масса недостатков, т.как создание родовых функций окончится так же печально, как и попытка сравнить два числа в Скале.
                    Но не все так плохо, и теоретически доказано, что в принципе, возможно построить систему которая на семантическом уровне предотвратит рантайм проверки (т.е. если код скомпилировался, то значит, что он валидный, и в рантайме ничего проверять уже не нужно).

                    Использовать Си для примера применения такой системы - занятие очень неблагодарное, т.как в Си система типов не просто безалаберная, она небезопасная и нелогичная...
                    Ответить
                    • Та ладно. Мне вон, борманд ниже доступно объяснил.
                      Ответить
                      • Та ладно. Я всяко объяснил это неправильно и ненаучно...
                        Ответить
                        • Главное что основная идея ясна.
                          Тут вопрос возникает - сколько займет времени сборка сложного проекта?

                          И не дешевле ли ставить везде копеечные проверки и не париться? Если повсюду итак используют тяжеленные виртуальные машины.

                          А то может оказаться что на джаве проект уже давно работает, а на ASTе только скомпилился.
                          Ответить
                          • > сколько займет времени сборка сложного проекта
                            > И не дешевле ли ставить везде копеечные проверки и не париться?
                            Не в том суть. Есть задачи, в которых неправильный ответ или экцепшн в рантайме может повлечь катастрофу. А здесь все-таки гарантия, что если все тайпчекнулось, и наши предположения о системе верны, и если не распидорасит аппаратную часть, то все будет ок.

                            А компилируется оно скорее всего быстро. Просто скажет, что недостаточно данных для доказательства, вот и все. Я не занимался этими теориями, но насколько позволяет понять мое дилетантское чутье, большинство инвариантов придется описывать самому. И вот на это и уйдет основная часть времени.
                            Ответить
                          • > А то может оказаться что на джаве проект уже давно работает, а на ASTе только скомпилился.
                            Чуваки все еще компилят прошивку для реактора на ATS'е, а наш, с прошивкой на жабе, уже взорвался, т.к. всегда падал в рантайме если стержни вдвинуты на 25.67%.
                            Ответить
                            • >все еще компилят прошивку для реактора на ATS'е
                              FYI: Чернобыль, перед своим закрытием в 2000-ном приносил нищему хохлостану миллиард долларов в год.
                              Вот сколько стоит задержка.

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

                              Если б их коммунисты сделали за те же деньги меньше реакторов, но дорогих и с абсолютной защитой от дурака. Мы не имели столько работающих АЭС с "опасными" РБМК и производящих немыслимое количество энергии. И экономика встала бы.(ну или стали б больше больше экономить)
                              В нашей жизни, в нашей стране много чего делается в спешке и через жопу, но именно эти решения имеют наибольшую практичность.

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

                                  Извечная проблема короче:
                                  дешево быстро качественно
                                  Ответить
                                  • сравнение жопы с пальцем
                                    у рбмк положительная реактивность
                                    Ответить
                                • А в японии - без. Всего не предугадаешь, а последствия - на десятилетия в лучшем случае.
                                  Ответить
                            • Давайте выбросим все опасные наработки, все либы, все ос. Выбросим 99% процентов софта (в том числе все удобные ide и компилер ast), вернемся в докомпьютерную эру и будем всё переписывать и компилить на AST.
                              Ответить
                              • Ну что поделать, так спроектирован наш мир, что гарантировать в нем ничего нельзя.
                                Можно только уменьшить вероятность фейла до разумных пределов, и надеяться на лучшее.
                                Ответить
                                • Проблема в том что в реальном мире, чтобы выполнять идеальные программы нужно еще и железо, которое создают люди.
                                  Ответить
                                  • А еще, помимо идеальных прог и идеального железа нужны люди, которых создают люди.

                                    И большинство проблем как раз из-за ошибок операторов, а не из-за багов в прогах или железе ;(
                                    Ответить
                                • Можно ведь гарантировать точно, что гарантировать точно ничего нельзя.
                                  Ответить
                            • И зелёная энергетика.
                              Ответить
                          • >И не дешевле ли ставить везде копеечные проверки и не париться?

                            Тут как бы делается предположение исходящее из практики Си[-подобных] языков, где тип задается вообще еще даже до появления переменной. Но вот, например, в CaML тип задается тогда, когда он становится известен. Например, если мы создали список, но еще ничего в него не положили, то тип у списка "список непонятно чего", но после того, как мы туда положили число - то это список чисел.
                            Похожим образом можно было бы работать и с массивами: если есть код до этого как-то определивший длину, или, по крайней мере позволивший предположить, что как минимум Х элементов там уже есть, то ошибки типов нет. Но возникают проблемы с пользовательским вводом, который не известен заранее и т.д.

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

                      Суть, имхо, в том, чтобы убедиться в необходимости и достаточности этих проверок. В первую очередь в достаточности, т.к. от этого зависит корректность кода. Во вторую очередь в необходимости, т.к. от этого зависит всего лишь эффективность.
                      Ответить
            • > появится код обращающийся к несуществующему элементу
              значит компилятору нужно предусмотреть выделение ресурсов на этот элемент.
              Ответить
              • > значит компилятору нужно предусмотреть выделение ресурсов на этот элемент.
                Фу, любитель скрытых ошибок.
                Ответить
                • Но, но. Я любитель "не умирания" после ошибки. Если программа умирает - значит программист - гавно.
                  Ответить
                  • Если программа умирает, значит ты забыл написать юнит тесты.

                    Запомни милый бот одно:
                    Нет юнит-тестов - код говно.
                    Ответить
                    • Программист, опять таки, должен предусмотреть все виды скрытых ошибок и также обрабатывать их. А конпелятор не должен вызывать приступы гастрита.
                      Ответить
                      • > Программист, опять таки, должен предусмотреть все виды скрытых ошибок и также обрабатывать их.
                        Идеальный программист в идеальных условиях в идеальном мире... В реале же - забывают, забивают, не успевают, не замечают...

                        А компилятор и рантайм - они бессильны. Они не искуственный интеллект. Они ничего не понимают в задаче, они не знают, как им поступить в критической ситуации. Они в конце-концов не несут ответственности за последствия, вызванные неправильной работой программы. Поэтому они не имеют никакого права пытаться что-то исправить. Максимум что они могут - просигнализировать об ошибке. В идеале - сразу при компиляции.
                        Ответить
                        • Распределение обязанностей по закону Паркинсона, ага.
                          Ответить
                  • Любитель ПэХэПэ detected!
                    Ответить
                  • > Если программа умирает - значит программист - гавно.
                    Верно.

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

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

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

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

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

                        P.S. Задачи, естественно, разные. Но молчаливое продолжение работы в ситуации неучтенной программистом очень редко будет адекватным поступком.
                        Ответить
                      • Пример - ну пусть мы пишем прогу для расчета оплаты за ЖКХ.

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

                        Вариант 2 - прога продолжила работу, насчитала хуйни, квитанции распечатали, разнесли по домам. Весь месяц контора выслушивала вопли от жильцов, а программист - от конторы. Куча потраченного времени и нервов.
                        Ответить
                      • P.S. Вот поэтому я очень не люблю языки, в которых необъявленные переменные не считаются ошибкой не только при компиляции, но даже в рантайме...

                        Но ведь они в точности следуют вашим заветам "Нет элемента? Так давайте запилим!".
                        Ответить
                        • > Пример - ну пусть мы пишем прогу для расчета оплаты за ЖКХ.

                          Какие-то типично ламерские варианты.
                          Очевидно же, что при возникновении исключения, прога должна попытаться исправить это исключение. Например несовпадение КБК - ищем по базе наиболее вероятное. Если проге нечего ответить - тогда отправляем уведомление текущему пользователю. Глупо продолжать выполнение явно ошибочной последовательности. Но и вылетать синей смертью, без попыток исправления, логгирования и уведомления - как минимум невежливо.
                          В контексте комментария, последовательность явно не ошибочная.
                          Ответить
                      • http://ithappens.ru/story/10776
                        Ответить
                        • Вот именно поэтому Роисся вперде.
                          Ответить
                        • На хацкиле написать решение квадратного уравнения (рациональные/комплексные) довольно тривиально...
                          Для этого и придуман.

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

        Вот скажем http://okmij.org/ftp/Haskell/types.html#branding, здесь операции над массивом заворачивают в brand, граничные индексы получаем от этого brand, можно получать следующий / предыдущий индекс / брать середину. Из чисел, разумеется, индекс не получить.
        Ответить
        • Я не знал про эту статью. Вроде интересно, но нужно разбираться. По крайней мере автор сам с первых же строк заявляет о том, что существуют люди, которые разделяют мою точку зрения. А дальше рассказывает почему они (возможно) ошибаются.
          Так что уж, по крайней мере, то, что я написал выше - ну уж никак не неожиданность.
          Ответить
        • Хехе, а что будет если у нас в программе окажется очень много массивов разной длины? :) Например, 2^32.
          Ответить
          • > массивов разной длины
            > Например, 2^32
            Зачем в программе столько массивов с заранее известной длиной?

            > что будет
            Автора такой программы увезут к себе люди в белых халатах.
            Ответить
          • Хм.. не очень понял в чем именно будет проблема, можно уточнить?
            Ответить
            • Гистограма картинки, например. Можно, конечно и по-другому сделать, но кто я такой, чтобы запрещать.

              Там автор этого метода предполагает, что компилятор должен будет создать столько уникальных s, сколько разных массивов есть:
              newtype BArray s i a = BArray (Array i a)
              newtype BIndex s i   = BIndex i

              вот, тут вот. И дальше он выдвигает уникальность s, как залог работоспособности системы.

              [...] The uniqueness of 's'
              afforded by the explicit universal quantification prevents mixing up of
              different brands.
              Ответить
              • Если у вас в коде столько массивов, что вы загнете ими тайпчекер, то можно добавить еще чуть-чуть, и загнется сам компилятор.
                Ответить
              • Дело не в конкретном s, это что-то вроде Phantom Types [color]http://www.haskell.org/haskellwiki/Phantom_type[/color] просто компилятор не позволит смешивать индексы и массивы из разных brand-ов если они вложены.
                Так что с этим проблем вроде нет.
                Ответить
                • Ну а как же он не позволит? Ему же их как-то нужно отличать - как же ему записать-то 2^32 разных типа?
                  Ответить
                  • А почему вы уверены, что именно так будет проверять компилятор?
                    Это уже аппелирование к конкретной реализации, bormand же бьет в основу :)
                    Ответить
                  • Каждому массиву, описанному в коде, будет соответствовать один brand и следовательно одно s. За каким, простите за выражение, хуем вы будете описывать в коде 2^32 переменных, которые могут содержать массивы?
                    Ответить
              • Зы, специально для bormand: программа, (на ж. скрипте), которая создает 2^32 разных массива:
                new Array(x);

                :) Никто ж не говорит "одновременно", можно и постепенно, сегодня - миллион, завтра - еще миллион.
                Ответить
                • И как это влияет на тайпчекер? Вот если вы опишете 2^32 переменных с массивами в коде, тогда ему придется задуматься. Но это уже граничит с идиотизмом.
                  Ответить
                  • Ну а как вы опишете функцию создания массивов, если требованием является создание пустого массива заданой длины? У вас получается честное соответствие int -> array of int. Сколько интов - столько массивов.
                    Ответить
                    • Почитайте уже статью, а? Вы ведь так любите отсылать нас к чтению...
                      Ответить
                      • Мм... ну да, я ее процитировал не читая :) Я еще не такое могу.
                        Ответить
                        • Ну ок, расскажу вкратце: там есть функция brand, которой передают самый обычный иммутабельный массив и 2 функции. Если массив пуст - вызовется первая. Если не пуст - вызовется вторая, и ей будут переданы BArray и два BIndex'а, указывающие на первый и последний элементы.

                          Вот этот вот BArray и BIndex'ы можно юзать только совместно. Значения, полученные из разных вызовов brand смешать между собой не получится.
                          Ответить
                          • Можно только добавить, что BArray и BIndex - "бесплатные" обертки, лишь для проверки типов.

                            // ну все-таки вызывается первая ф-ия, а "вторая" - это значения по умолчанию, лучше бы просто вернули (Maybe w)
                            Ответить
                          • И что? И у нас вполне может оказаться очень-очень много вызовов brand которые во время выполнения программы никогда не будут одновременными, но для того, чтобы проверить их всех, нам таки да прийдется представить ситуацию, как будто все они одновременно существуют. Либо нам нужно будет как-то "лениво" выводить типы, но тогда это уже не статическая типизация.
                            Ответить
                            • Сколько раз вызов brand встречается в коде, столько и будет типов. Сколько раз эти brand'ы будут вызываться в рантайме никого не волнует.
                              Ответить
                              • Почему программа, которая вызывает безобидную функцию несколько миллиардов раз должна сломаться? Представьте себе код какого-нибудь эклипса, в котором обращений по индексу к массиву может быть миллиарды. Скомпилировать-то его все-равно прийдется за один заход.
                                Ответить
                                • У вас в коде эклипса миллиард раз написан оператор []? Или все же его миллиард раз вызывают в рантайме, а в коде он написан жалкие десятки тысяч раз?

                                  Вы в упор не видите разницы между тем, сколько раз вызов функции написан в коде, и сколько раз он будет произведен в рантайме?

                                  Вот сколько раз надпись brand встречается в коде, столько временных типов сгенерит тайпчекер. На то, сколько раз потом этот brand будет вызываться в рантайме всем похер, и в первую очередь на это похер тайпчекеру.
                                  Ответить
                                  • Вполне может быть написан миллиард раз. Не так уж и редко он встречается. При том, что самого клипса каких-то жалких пару гигабайт - миллиардов вызовов вполне может набраться.
                                    Ответить
                                    • > Вполне может быть написан миллиард раз.
                                      Ага, 4 гигабайта в исходниках клипсы занимают конструкции в духе a[i]...

                                      Санитары, срочно в палату!

                                      P.S. Пойду я спать, уже 3 часа ночи, а разговор с интересной темы скатился в какой-то маразм про миллиард операторов.
                                      Ответить
                                      • Сегодня може нет - а лет через пять - вполне. Но сломается-то все-равно раньше. Точно так же, как линкеры на больших проектах не особо справляютыса (хотя числа там гораздо более скромные).
                                        Ответить
                                      • Вставлю свои пять копеек: приличные языки вроде хачкеля допускают раздельную компиляцию, проверка типов выполняется только для самого модуля и интерфейса зависимых модулей. Поэтому на практике какое-либо ограничение на количество одновременно видимых тайпчекеру типов врядли будет достигнуто.
                                        Ответить
                            • С таким же успехом можно сказать, "и что будет есть в программе будет больше 2^32 различных типов, компилятору же как-то нужно будет различать их?".
                              Это к тому, что сие возражение непосредственного отношения к статье не имеет.
                              Ответить
                              • Ну так в том-то все и дело, что "конкретизируя" типы массивов мы получаем демографический взрыв типов. Их то на самом деле* было очень много в нашей программе, просто раньше мы на это не обращали внимание, а иногда, когда мы наталкивались на несовпадение типов, то обрабатывали это как ошибку времени выполнения.

                                * - В принципе, когда мы определяем тип, то, с конструктивистксой точки зрения, его нужно наполнять, и / или это можно представить как если бы мы могли конкретизировать тип до минимальных составляющих. Так, например, во вселенной представленной в нашей программе неявно всегда существует все множество целых чисел (хотя создаем реально мы только небольшой процент от всего множества), бесконечное множество строк и т.д.
                                Ответить
                                • В чем-то вы правы, но тем не менее, это все же к деталям реализации компилятора..
                                  В рантайме-то их не будет.
                                  Ответить
        • Ну т.е. о произвольном доступе к элементам, я так понимаю, можно забыть. А без произвольного доступа массив превращается в... компактно записанный список (ну или в двоичное дерево, раз есть операция "брать середину"). Из структуры данных, которая умела вставлять за O(n) и доставать за O(1) получили структуру, которая по-прежнему вставляет за O(n), но доставать стала за O(n) или O(log(n)), зато "не вылетает"...

          Хороший, годный подход. Устранение проверок границ массивов путем устранения самих массивов.
          Ответить
          • О. Смотрю праздник продолжается.
            Ну правильно,зачем нам проверки, они дорогие.
            Давайте лучше разом повысим алгоритмическую сложность.
            Ответить
          • > о произвольном доступе к элементам, я так понимаю, можно забыть

            Почему это? Просто нужно получить каким-то образом BIndex, получили - доступ по индексу O(1). Ну можно расширить какими-нибудь методами вроде линейной комбинации двух индексов. Нужно смотреть конкретный пример, где подобный подход будет препятствием и делать вывод о его принципиальности.
            Ответить
            • > Просто нужно получить каким-то образом BIndex
              Ну вот можно, конечно, добавить в trusted kernel функцию, которая по числу и массиву вернет Maybe BIndex. Но здесь ведь и будет таиться та самая проверка, от которой пытались избавиться...

              Конкретный пример... да абсолютно любой алгоритм, в котором массив используют как массив, а не как список/бинарное древо.
              Ответить
              • > которая по числу и массиву вернет

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

                > как массив, а не в духе списка.

                bsearch по ссылке явно не в духе списка, насколько в духе массива или дерева - не скажу
                Ответить
                • bsearch по ссылке конечно же в духе дерева. linearSearch через bsucc будет в духе списка.

                  Имхо вся сила и польза массива в его эффективной операции произвольного доступа. Нет произвольного доступа - массив не нужен.
                  Ответить
                  • Ну вот есть у нас массив, алгоритм начинает его изменять (здесь read-only, но вроде ничто не мешать завернуть в мутабельную обертку), получает новые индексы. Использует их для доступа.

                    Вопрос насколько широкий класс алгоритмов отсекается, которым нужен доступ по числам, а не ранее вычисленным индексам.
                    Ответить
                  • > Нет произвольного доступа - массив не нужен

                    Есть же, та же линейная комбинация, упомянутая выше, допустим Double -> BIndex i
                    Не говоря уже, что по всем полученным BIndex-ам доступ как положено, а таким (если не ошибаюсь) и zipper похвастаться не может.
                    Ответить
                    • > линейная комбинация
                      Там будут проверки на попадание флоата в диапазон 0..1 ;)
                      Ответить
                      • Само собой, точно, нужно добавить BrandLinearCombination и заворачить в него флоат ))
                        Ответить
      • Я тебя ещё больше зауваал!
        О, да ты по ATS угорел. Ъ
        Typestate и linear types уже изучил?
        Ответить
        • Хехе, количество прочитаных книжек по информатике обратно пропорционально карме на говнокоде :)
          Ответить
          • А я это знаю, потому больше ни о чем ревалюционом не рассказываю - все равно не оценят. И мой минус не трогают, если только по привычке. Теперь только задаю глупые вопросы и раздражаю окружающих, так как по заслугам и без стараний получать минус приятнее, чем необоснованный минус.
            Ответить
          • Минусы ставят за понты и тонкую вонь интелектуального превосходства, илитизма, если хотите. Если вы думаете, что вступающие в спор люди прочитали недостаточно книг по информатике, вы ошибаетесь.
            Ответить
            • О, а мне как раз недавно в тему анекдот попался: спросил как-то сотрудник службы новостей у американца, русского и израильтянина: "Скажите пожалуйста, каково ваше мнение по поводу дефицита в странах центральной Африки?". На что американец ответил: "А что такое дефицит?". Русский: "А что такое мнение?". Израильтянин: "А что такое ``пожалуйста''?".
              Лучшее от всех миров, т.сказать.

              ЗЫ. Я даже не заметил элитизма в том, что я выше написал, но у всех свое мнение.
              Ответить
              • >Я даже не заметил элитизма
                А заметил ли илитизм?
                Ответить
    • вэвэхэвэвэ дело говорит
      читать про ATS
      Ответить
      • Вопросы всё те же. Если индексы задаются в рантайме?
        Тут логика нужна а не ATS.
        Судя по тому что я прочёл - кодоанализатор, тупо проверяющий что значение не выйдет за пределы, не станет нулём, итд.

        Так это и сейчас компилеры с ide умеют - эклипс выдает ворнинги о " potential null pointer access", например.
        Если поставишь выше assert (x!=null) или if (instance of ...) return ...;- то оно исчезнет.
        Ответить
        • > Если индексы задаются в рантайме?
          Вот в том и прикол, что прога, в которой забыли поставить if, проверяющий выход индекса за границы "массива", или написали его неправильно, не тайпчекнется в ATS, и до рантайма дело даже не дойдет.

          > Так это и сейчас компилеры с ide умеют
          Они умеют только простейшие случаи, в которых неправильность очевидна. ATS же отвергает прогу, правильность которой он не может доказать.
          Ответить
          • >АTS же отвергает прогу, правильность которой он не может доказать.
            Ну собственно так я и думал.

            >ATS же отвергает прогу, правильность которой он не может доказать.
            То есть большинство практичных случаев не скомпилится.
            Бесполезный теоретический язык, на уровне Хацкила или даже выше.
            Как любители борщеца и гумно в частности не дотянулись?
            Ответить
            • Помнится, throws-декларации тоже считали отличной идеей. А на деле вышло... Ну, вы сами всё знаете.
              Ответить
              • Хорошая аналогия.
                Как я понял в этом ихнем ATS можно отключить проверку сделав код "небезопасным".
                Ну итог очевиден: как все бросают unchecked, так там все будут отключать проверки.
                Ответить
            • > То есть большинство практичных случаев не скомпилится.
              Большинство вменяемых случаев как раз таки скомпилится. Только вот неизвестно сколько уйдет времени на доказательство их корректности компилятору...

              А если приводить доказательство в виде "a < 5, не могу объяснить, почему, но это так, мамой клянусь!", то никакой пользы от такой системы не будет.
              Ответить
              • Ну как это. Вот пишем мы библиотеку работы со строками.
                У нас есть функция substring - туда приходят какие-то аргументы начала и конца строки. Мы их не знаем наверняка.
                И что дальше?
                Ответить
                • Ну как что. Если я все правильно понял, то я должен придумать ограничения в духе start >= 0 && start <= end && end < N where N = length(s). Затем компилятор докажет, что при таких ограничениях функция не вылезет за границы строки. А далее эти ограничения будут юзаться в точках, в которых будут вызывать этот substring. И если мы не сможем доказать, что они выполняются в момент вызова - ATS пошлет нас нахуй.
                  Ответить
                  • >ограничения будут юзаться в точках вызова
                    Ок. Понятно.
                    >N = length(s)
                    Так а длина строки заранее неизвестна.
                    А. Я примерно понял как оно работает.
                    Ну разбор кода - крайне нетривиальная задача. Серъезные проекты будут компилится вечность.
                    Уж проще проверки вставлять.
                    Ответить
                    • Ну так, если я совсем не туплю, в том и прикол этой теории, что там это N не константа, определяемая на этапе компиляции.
                      Ответить
                      • Я понял.
                        Оно будет анализировать все циклы, которые используют счётчки-указатели в строке, которые в свою очередь обычно танцуют от нуля и аж до динамически определяемой длины строки.

                        И если каждый из этих счётчиков нигде не переполнится - то программа корректна.

                        В этом что-то есть.
                        Ответить
                      • По крайней мере в одном охуенное преимущество. Просто грандиозное.
                        БыдлоКод с "магическими числами" типа
                        xml.substring(42 38,length) //обрезание xml-хедера
                        не соберется.

                        То есть указатель в строке, никак не привязанный динамически, в коде её длине - не пройдет.
                        Ответить
                        • А если написать перед этим if (length >= 38) - тогда соберется.
                          Ответить
                          • Как-то не подумал об этом.
                            Логично. Говно везде пролезет.
                            Ответить
                            • Ну это говно, насколько я понимаю, всяко будет видно в контракте функции ("если длина меньше 38, вернется пустая строка", "если длина меньше 38, вернется false" и т.п.), зарыть его полностью никак не получится, поэтому оно рано или поздно всплывет ;)
                              Ответить
                              • Короче используйте форич и функции высшего порядка и не придется доказывать переполнение индексов массивов и прочей ерунды
                                Ответить
                                • Предложение просто не использовать массивы по назначению уже было. Это попахивает политикой фирмы с логотипом в виде огрызка.
                                  Ответить
                                  • У них даже приложение из себя выйти не может.
                                    Ответить
      • И про Агду, и вообще про зависимые типы. В кои-то веки плюсанул wvxvw.
        Ответить
        • Я не имею ничего против теоретических изысканий (у самого в сумке лежат бумажные "Основы Теории Чисел" Виноградова и "Общая Топология" Келли), но современному программисту гораздо важнее, на мой взгляд, запариваться на тему архитектуры, модульности, конкурентности, эффективных алгоритмов и т.п.

          "Какой ужас, мы можем случайно выйти за границы массива" - не самая страшная проблема в ПО. Не припомню ни одного ArrayIndexOutOfBounds в написанном мной коде. Вот NPE прилично было.
          Ответить
          • > NPE
            ?

            > Основы Теории Чисел и Общая Топология
            Просто нравится или как-то применяете на практике? Использую такие штуки для "расширения сознания и мышления". С практикой плоховато.
            Ответить
            • NPE - NullReferenceException, ответил сам себе
              Ответить
            • Просто ради удовольствия. Я в универе плотно сидел на математике, даже на олимпиады ходил. Правда, результаты чуть выше среднего были, ибо нужно было совмещать работу с учёбой.
              Ответить
              • >Просто ради удовольствия.
                Согласен. Теория чисел - классная штука. Кстати говорят что Виноградов забил на первомайскую демонстрацию и в это время (пока никто не отвлекал административными делами, наверное) доказал тернарную гипотезу Гольдбаха.

                >Просто нравится или как-то применяете на практике
                Гумно, а ты почитай, поинтересуйся, кто знает, может докажешь проблему Римана.
                Премию получишь, без хуёв, мамка борща наварит, будешь как король.
                Ответить
                • Помню, читал Клейна взахлёб. У него есть достаточно простая для восприятия книжка "Школьная математика с точки зрения высшей". Дома лежит бумажная "Лекции об экосаэдре и решении уравнений пятой степени".
                  Ответить
                • > ты почитай, поинтересуйся, кто знает, может докажешь проблему гипотезу Римана
                  Напомнило
                  http://www.youtube.com/watch?v=50hDd12-tEI
                  Ответить
                  • Видел. Но её-то смогли доказать!
                    А ведь существовал миф о её неразрешимости.
                    Ответить
                    • > Но её-то смогли доказать
                      Да, но сделал это не дилетант. Подобного рода проблемы решаются лишь бородатыми Перельманами, требуя много лет ежедневной целенаправленной работы. Даже самородки вроде Галуа врядли могут решить такие проблемы благодаря лишь благодаря своему необычному мышлению.
                      Ответить
          • Спасибо за чтиво.
            Ответить
          • Для невнимательных программистов вроде меня — страшная, особенно когда писать на unmanaged-языках. Вот сейчас в своём куске кода случайно вышел и загадил память, полдня отлаживали, мне стыдно.
            P.S. Можно было, конечно, обойтись хотя бы динамической проверкой, но насколько мне помнится, в стандартном векторе её нет-с. Обёртку свою писать?
            Ответить
            • Надо просто быть внимательнее, почаще думать об инвариантах и граничных условиях.
              От ошибок в логике и паршивой архитектуры не спасут даже самые умные компиляторы.
              Ответить
        • Я все никак до Агды и АТС не доберусь по серьёзному. Понимаю что в реальности этому применения нет и серьёзного изучения вопроса не происходит, в то время как мне 100500 других более приоритетных вещей нужно изучить, которые применяю на практике. Грустно.
          Ответить
    • Эппл с CF-классами зачастую работает просто как с областью памяти. То есть, определено несколько определений структур и периодически они друг к другу кастуются. Похоже, это один из таких.
      Ответить
    • Вот так вброс.
      Ответить

    Добавить комментарий