1. JavaScript / Говнокод #10503

    +152

    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
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    String.prototype.startsWith=function(b){
        if(this.length<b.length){
    	return false
        }
        for(var a=0;a<b.length;++a){
    	if(this.charAt(a)!==b.charAt(a)){
    	    return false
    	}
        }
        return true
    };
    
    String.prototype.endsWith=function(b){
        if(this.length<b.length){
    	return false
        }
        var c=b.length-1;
        for(var a=this.length-1;a>this.length-1-b.length;--a){
    	if(b.charAt(c--)!==this.charAt(a)){
    	    return false
    	}
        }
        return true
    };
    
    String.prototype.contains=function(a){
        return this.indexOf(a)!==-1
    };
    
    String.prototype.LastIndexOf=function(d,c){
        if(this.length===0||d===null){
    	return -1
        }
        if(d.length>this.length){
    	return -1
        }
        if(isNaN(c)){
    	c=this.length-d.length
        }
        var a=false;
        for(var b=c;b>=0;--b){
    	a=true;
    	for(var e=0;e<d.length;++e){
    	    if(this.charAt(b+e)!==d.charAt(e)){
    		a=false;
    		break
    	    }
    	}
    	if(a){
    	    return b
    	}
        }
        return -1
    };
    
    String.prototype.LastIndexOf_char=function(a){
        for(var b=this.length-1;b>=0;--b){
    	if(this.charAt(b)===a){
    	    return b
    	}
        }
        return -1
    };
    
    String.prototype.setCharAt=function(b,a){
        if(b>this.length-1){
    	return str
        }
        return this.substr(0,b)+a+this.substr(b+1)
    };
    
    String.prototype.countCharAppearances=function(a){
        var b=0;
        for(var c=0;c<this.length;++c){
    	if(this.charAt(c)==a){
    	    ++b
    	}
        }
        return b
    };

    Сорри, что много буков, но тут каждую функцию можно воспринимать как отдельное произведение.
    Разбираю бред какого-то безымянного идиота :(

    Запостил: wvxvw, 31 Мая 2012

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

    • Хм... а что такого?
      Ответить
      • Ну, для примера, берем первую функцию:
        String.prototype.startsWith = function(b){
            return !this.indexOf(b);
        }

        Ну и дальше все в таком же ключе.
        Ответить
        • >return !this.indexOf(b);
          Это что еще за неоптимальное говно? Делать поиск во всей строке чтобы узнать начинается ли она с b?
          Ответить
          • Если сильно хочется оптимизации скорости (которая не нужна в Яваскрипте, т.как он никогда быстрым не был, и не пытался):
            String.prototype.startsWith = function(b){
                return this.substr(0, String(b).length) == b;
            }

            Но, на мой взгляд, от етой оптимизации толку не много т.как и строками большими Яваскрипту оперировать не прийдется, а код читать прийдется.
            Ответить
            • Что-то я подозреваю, что это:
              >т.как он (JavaScript) никогда быстрым не был, и не пытался
              как раз и говорит, что нужно искать оптимальные пути. Раз язык не быстр, значит задача производительности на программисте.
              Ответить
              • Скорость Яваскрипта в целом, как такового, как бы кто на нем не писал не пригодна для решения задачь для которых скорость имеет критическое значение. Скорее всего, если найти по коду все реальные случаи использования этой функции, то мы увидим, что изза того, что во втором варианте нужно было вызывать еще одну функцию (вместо того, чтобы ограничиться только indexOf()) то первый мой вариант окажется более еффективным, т.как строки очень короткие, а обращение к только одной встроенной функции занимает меньше времени (т.как вызов функции сам по себе очень дорогой).
                Но самое главное то, что выигрыш копеечный по сравнению с тем, что нужно разбирать код, который делает какую-то фигню.
                Ответить
                • По кой ляд тогда пишут сейчас такие безумные движки, которые ещё и в нативный код компилируют?
                  Ответить
                  • Хорошо бы если бы ето была единственная глупость, которую люди делают. Ну пишут - и пусть пишут, можно и к самокату реактивный двигатель прикрутить.
                    Ответить
                    • Не думаю, что это таки глупость. У ECMAScript есть своя область применения, и она не сводится к показыванию кнопочек.
                      Ответить
                      • Для компиляции желательны:
                        1. Компилятор :) (его нет в ЯваСкрипте, как данности - никто не знает, как он выглядит)
                        2. Языковые конструкции для обращения к компилятору (volatile, inline, define и т.д.) которые на уровне языка позволяют объяснить компилятору что нужно делать с кодом.
                        3. Инструметны для отладки скомпилированого кода. (Дебажить MIR И пытаться понять каким образом оно относится к исходникам? Нет таких инструментов, и не скоро появятся).

                        Ничего такого даже близко нет и не предвидится, да и не особо нужно. А так, конечно, можно скомпилировать, только обидно потом будет за бесцельно потраченное время.
                        Ответить
                        • Может быть я сегодня ушиблен поленом, но.
                          1) V8 increases performance by compiling JavaScript to native machine code (x86, ARM, or MIPS CPUs), before executing it, versus executing bytecode or interpreting it. *
                          2) Всю жизнь думал, что компиляция - процесс преобразования ЯВУ в машинный язык. Есть уйма компиляторов, которые порождают объектные файлы, но, при всём этом, управлять процессом компиляции не получится.
                          3) Вероятнее всего, отлаживаться/профилироваться будет "исходник". Пока не знаю, как это должно выглядеть.

                          * я знаю, что пользоваться цитатами из викижопии некрасиво
                          я знаю, что пользоваться цитатами
                          Ответить
                          • [Citation needed]

                            Это скорее всего гонево.
                            Ответить
                          • И это абсолютно бессмысленно, когда даже анотаций типа нет. Яваскрипт придуман как интерпретируемый язык. То что его можно скомпилировать - ну так какую угодно грамматику можно скомпилировать. Только вот практически что угодно будет компилироваться лучше Яваскрипта.
                            Это на столько бессмысленно, что даже тот же V8 практически ничего с ним не делает - так и оставляет код в виде строк. Он их приводит к какой-то нормальной форме, и так ими и оперирует. Оптимизации может делать JIT гогда компилирует в MIR. На это, вобщем-то вся и надежда.
                            Т.е. представьте себе, что вы пишете на С++, но с условием, что никаких типов кроме хешей и строк использовать нельзя, и представьте, что из этого сделает компилятор, как бы вы ни старались.
                            Ответить
                            • А если компилятор возьмёт и сам расчехлит, что такая-то переменная используется чисто как число, а в таком-то массиве индексы только целые итд?
                              Ответить
                              • Тогда может быть облом, если не угадает...
                                Ответить
                                • Ну фоллбек всегда можно предусмотреть.
                                  Ответить
                                  • Ну так все равно, а смысл такими вещами заниматься? В теории, наверное можно написать очень умный компилятор, который все сам умеет и все ошибки исправит, и предусмотрит и т.д. Но вот, например, какой смысл у неопределенного поведения? - полагаться на то, что программист знает, что делает, и что ошибки не будет. Смысл аннотаций типа? - полагаться на то, что тип будет таким, каким нужно, и, опять же, ошибки не будет - и эту самую проверку можно убрать.
                                    За счет этого языки типа Си и оптимизируются хорошо - т.как все эти проверки можно не делать. Но если начинать поголовно их проверять, так и Си будет не на много быстрее Яваскрипта.
                                    Ответить
                              • Мозилловцы хотели сделать что-то такое
                                Ответить
                              • То он потратит на это больше времени, чем на тупое исполнение кода. А потом придет Вася Пупкин, и из соседнего скрипта засунет в эту целую переменную строку. Очень трудно оптимизировать код на языке, в котором нет приватов, нет модулей но зато есть eval.

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

                                  man escape analysis
                                  Ответить
                                  • man eval

                                    Ну хотя погорячился. Локальные переменные то можно оптимизнуть.
                                    Ответить
                                    • Локальные переменные? Тоже не получится, или не всегда:

                                      function foo(f, a){
                                          return function(b){
                                              a = f(b);
                                          }
                                      }

                                      И никто никогда не узнает какого типа была "а".
                                      Ответить
                            • Я не проверял, что делает V8 унутре, интереса не было, да и к гугловым продуктам отношусь с подозрением.
                              Я, конечно, сам виноват, что задал дискуссии неправильный вектор. Может и не компилируют, но факт остаётся. Есть к языку некий интерес и он сохраняется. Ведутся работы над ускорением тех же браузерных движков, да так, что я уже не знаю, кто там сейчас быстрее - V8, JaegerMonkey или оперское. Есть даже браузерные игры. Теоретически, существует ниша для высокопроизводительной реализации.
                              Ответить
                              • Да вроде есть там возможность оптимизации. Помню сам @wvxvw кидался линкой, по которой Steve Yegge вещает о том, что оптимизировать js можно и нужно (за счёт JIT, разумеется), что для него можно написать приличные инструменты (и типа они будут мало уступать аналогам для статически типизированных языков), только разработка этих инструментов требует других подходов, и пока этим никто особо не занимается.

                                P.S. я сам не являюсь особым фанатом JS
                                Ответить
                              • Вот почитайте, если будет интересно:
                                https://developers.google.com/v8/design

                                P.S. Статейка достаточно короткая.
                                Ответить
                                • Да, благодарствую. Уже читал когда-то давно, но из головы выветрилось.
                                  Ответить
                              • Честно - я не понимаю зачем пытаются улучшать Яваскриптовкие движки. Ну в том смысле, что это изначально проигрышная стратегия. Ничего хорошего из этого не получится. Т.е. конечно, оно будет работать немного быстрее, но если его, положим, можно ускорить в 2-3 раза, то до языков, которые работают с вменяемой скоростью его нужно улучшать в 200-300 раз.
                                Но я могу понять почему их пытаютя улучшать. Изза того, что браузеры не могут договориться о том, чтобы стандартизировать виртуальную машину (и, особенно, Мозила в лице Б. Эйка) под всякими предлогами желающие использовать Яваскрипт. А работать как-то надо же...

                                Главный контраргумент Мозилы заключается в том, что Яваскрипт по факту доступен для просмотра и правки, и это якобы помогает избежать ситуаций с закрытыми исходниками или кодом, который потенциально вредит пользователю.
                                На что есть куча контраргументов. Например, байткод кораздо проще анализировать (не человеку) на предмет вредоносности. Когда Яваскрипт упаковывают, он практически становится нечитабельным, и, вобщем, проще было бы поступать как и с любым другим софтом: нужны исходники - нате адресс, нате лицензию.
                                Но даже если остановиться на варианте с интепретируемым языком, то все равно было бы хорошо если бы этот язык позволял как-то помогать себя оптимизировать. Собственно, такие мысли были при работе над ЕС4, но почему-то ее не приняли, вместо этого есть промежуточное говно ЕС5, и вообще, апогей маразма - ЕС6. В котором вместо возможных оптимизаций понадобавляли кучу дублирующих возможностей, всякий "сахар" и т.д. ничего по-содержанию не поменяв.

                                Так что прогноз на близжайшие лет 5 совсем неутешительный :)
                                Ответить
                                • Я думаю, основная проблема вовсе не в открытости исходников (покажите мне упоротого маньяка, который читает скрипты страничек, которые грузит, если они работают).
                                  Для JS куча библиотек и инструментов, для него есть стандарт, его знает миллионы людей.
                                  Переход на другой язык потребует огромное количество труда и ресурсов. В частности, поэтому Dart и буксует.
                                  К тому же, с появлением Clojure->JS и CoffeeScript, многие предпочитают писать на приличном языке и компилить в богомерзкий JS, который работает во всех браузерах, чем учить какой-то новый язык, который поддерживает один/два браузера и для которого нет библиотек.
                                  Ответить
                                  • Яваскрипт не знает никто, и более того, его гнушаются знать даже те, кто его используют... Этой куче говнобиблиотек за очень короткий срок можно создать аналог, даже не аналог, а что-то на несколько порядков лучшее. Все эти "библиотеки" стоят ноль рублей ноль копеек, т.как полное барахло.
                                    На самом деле, большая часть библиотек направлена на борьбу с самим Яваскриптом или разногласиями между браузермаи в его интерпетации. Опять же, язык высокого уровня тяжело одинаково интерпретировать. Байткод гораздо проще.

                                    Дарт, как бы и не торт... ну чуть лучше, да, но он не сильно воодушевляющий. Хз, может если бы Гугл его активнее продвигали, то пользовались бы... но у них у самих есть много альтернатив, которые они же и продивгают, типа той же GWT. Так что им и не с руки.
                                    Ответить
                                    • Как насчёт альтернативного применения? Например, не в браузере, а в сервере чего-нибудь? (НЕ ГЕРБАЛАЙФNode.js)
                                      Опять же, какой-то практический смысл в этом должен быть, мельком сужу по отрасли.
                                      Ответить
                                      • Ну тут фишка в том, что ПХП еще хуже, например, и с этой точки зрения - возможно, но тут ПХП выигрывает за счет того, что у него есть куча оберток для существующих библиотек.
                                        А так - еть куча хороших языков, куда лучше Яваскрипта, пригодных для того, чтобы использовать на сервере. Даже тот же ЕС4 (Флеш) можно использовать, и он не в пример быстрее Яваскрипта, но вот так вот.
                                        Ответить
                                        • > есть куча оберток для существующих библиотек
                                          В основном пространстве прямо.
                                          Я думаю, если бы был интерес - оболочки написать не так проблематично.
                                          Что мне самому не нравится - прототипированное программирование. Как-то это еретично слегка. Потому, наверное, и пишут одно говно сплошняком.
                                          Ответить
                                      • Есть еще такой момент, что практически все, что написано на Яваскрипте написано черз жопу. И прото нет нормальных программистов, которые бы любили или хотели развивать язык.
                                        Т.е. Ява может и не на много лучше, теоретически, но ее преподают в вузах, книжки пишут и все такое. И поэтому когда попадаются проекты на Яве они, как правило, плохие только на 50-60%, в то время как проекты на Яваскрипте, как правило 100% мусор.
                                        Ответить
                                        • Кроме Крокфорда никто не любит JavaScript. Да и нельзя наверняка сказать, что Крокфорд не притворяется.
                                          Ответить
                                        • >>проекты на Яве как правило, плохие только на 50-60%, проекты на Яваскрипте, как правило 100% мусор.
                                          >>Яве они, как правило, плохие только на 50-60%

                                          Смелое заявление.

                                          >> большая часть библиотек направлена на борьбу с самим Яваскриптом

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

                                          Ну с чистым js бороться не надо. Там не с чем бороться.
                                          Ответить
                                          • > Ну с чистым js бороться не надо.

                                            Практически чуть ли не каждая библиотека пытается добавить к языку строгую типизацию, т.е. всякие проверки типа isString(), isBoolean() и т.д. - это примерно так же, как в PHP все пишут по CMS. Ну и всяческие методы, как ограничить свободу в смысле типов функций, полей объекта и т.д.

                                            Т.е. по-сути, есть 2 главные проблемы: непредсказуемое поведение встроенных операторов, которые конвертируют типы как угодно (особо замечательны в этом плане == и +)

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

                                            Для сравнения можно взять объектную систему eieio (eLisp) - очень упрощенная версия CLOS написаная на самом eLisp'е. Не смотря на то, что eieio классы, так же как и Яваскрипт прототипы не равны в правах "настоящим" типам, можно основываясь на них строить ОО программу (можно запретить создание новых свойств у объектов, можно специализировать методы на объектах и т.п.) В Яваскрипте существуют объекты, но ничего ОО-шного с ними сделать нельзя...
                                            Ответить
                                            • >В Яваскрипте существуют объекты, но ничего ОО-шного с ними сделать нельзя...
                                              И не надо. Идеология ведь другая.

                                              >Практически чуть ли не каждая библиотека пытается добавить к языку строгую типизацию, т.е. всякие проверки типа isString(), isBoolean() и т.д.

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

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

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

                                                Операторы - это не просто "динамика". В Лиспе или Эрланге тоже динамически, но, при необходимости, от этого можно отказаться. Т.е. оператор == работает неправильно, никому он такой не нужен, да и + тоже - только ошибок куча изза него, а заменить на что-то - язык такого не позволяет.
                                                Ответить
                                    • >или разногласиями между браузермаи
                                      Тут наверное уместнее - борьба с IE. Это проблемы не к языку, а к браузерам - есть же стандарт.

                                      >Что мне самому не нравится - прототипированное программирование.
                                      Согласен. Причем серъезная ересь.
                                      Может оно и нужно, но только использовать нужно аккуратно - по чуть-чуть.

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

                                  Да. Это пиздец. Испортят язык.
                                  А фф уперто внедряет эти говнофичи.
                                  Может потому у них и выходит такое монструозное говно годзиллы.
                                  Ответить
                              • ЗЫ. Самый лучший Яваскрипт компилятор у Унитити3Д.
                                Ответить
            • >>>а код читать прийдется.

              Именно. И вариант с substr в разы читабельнее варианта с indexOF
              Ответить
              • function startsWithSubstring(a, b){
                    return a.substr(0, String(b).length) == b;
                }
                
                function startsWithIndexOf(a, b){
                    return !a.indexOf(b);
                }
                
                function testSpeed(){
                    var ts, results = [];
                    
                    function getTime() { return new Date().getTime(); }
                    function iterate(f, t, s, c){
                	while (t-- > 0) f(s, c);
                    }
                    function generate(i, s, j, c){
                	var r = s;
                	var x = c;
                	var ti = Math.floor(Math.log(i) / Math.log(2));
                	var ci;
                	
                	while (ti > 0)
                	{
                	    ti--;
                	    ci = (i >> ti) & 1;
                	    r += r;
                	    if (ci) r += s;
                	}
                	ti = Math.floor(Math.log(j) / Math.log(2));
                	while (ti > 0)
                	{
                	    ti--;
                	    ci = (i >> ti) & 1;
                	    x += x;
                	    if (ci) x += c;
                	}
                	return [r + x, x];
                    }
                    for (var i = 1; i < 1e6; i *= 10){
                	results.push(getTime());
                	ts = generate(i, "s", 10, "c");
                	iterate(startsWithSubstring, i, ts[0], ts[1]);
                	results.push(getTime());
                	iterate(startsWithIndexOf, i, ts[0], ts[1]);
                	results.push(getTime());
                    }
                    for (i = 0; i < 18; i += 3){
                	console.log("startsWithSubstring: " + (results[i + 1] - results[i]));
                	console.log("startsWithIndexOf: " + (results[i + 2] - results[i + 1]));
                    }
                }

                Интереса ради провел эксперимент. В Хроме этот тест показывает, что до 10.000 (десяти тысячь) знаков до искомой подстроки на таком же количестве итераций вы просто практически ничего не заметите. Но если вы собираетесь обрабатывать строки длиннее, то да, есть серьезное преимущество у второго метода.
                Ответить
                • 10.000 в россии означает 10 с точностью до тысячных.
                  >тысячь
                  В принципе та же вонь, что я поднимал на счёт знака копирайта, но мерзко же читать, ребята...
                  За тест спасибо.
                  Ответить
                  • Хз, спелчекер на английском. И, просто, чтобы было не обидно. Английский для меня совсем тоже не родной, но я не вижу смысла в том, чтобы для повседневного общения использовать что-то кроме lojban'a. Но за неимением подходящей аудитории - что ж поделашь, лучше на каком-то одном уже, если нельзя на том, на каком хочется.
                    Ответить
                  • Предлагаю открыть клуб любителей граммар-наци.
                    Ответить
                  • В России "десятичной точкой" является запятая, если что. Точка - разделитель тысяч. Так что 1.000,15 - это 1 тысяча и 15 сотых.
                    Ответить
    • Или, даже, скорее всего идиотов, а то если один был, то какой-то нереально трудолюбивый.
      Ответить
    • > countCharAppearances
      countCharOccurrences?
      Ответить
    • показать все, что скрытоСОСИТЕ ХУЙ, ПИДОРАСЫ!!!
      Ответить

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