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

    0

    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
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    // https://github.com/google/brotli/blob/29dc2cce9090d6c92c908116e11373bc7fdc8ad1/c/enc/static_dict.c#L82
    
            /* Transforms "" + BROTLI_TRANSFORM_IDENTITY + <suffix> */
            if (s[0] == ' ') {
              AddMatch(id + n, l + 1, l, matches);
              if (s[1] == 'a') {
                if (s[2] == ' ') {
                  AddMatch(id + 28 * n, l + 3, l, matches);
                } else if (s[2] == 's') {
                  if (s[3] == ' ') AddMatch(id + 46 * n, l + 4, l, matches);
                } else if (s[2] == 't') {
                  if (s[3] == ' ') AddMatch(id + 60 * n, l + 4, l, matches);
                } else if (s[2] == 'n') {
                  if (s[3] == 'd' && s[4] == ' ') {
                    AddMatch(id + 10 * n, l + 5, l, matches);
                  }
                }
              } else if (s[1] == 'b') {
                if (s[2] == 'y' && s[3] == ' ') {
                  AddMatch(id + 38 * n, l + 4, l, matches);
                }
              } else if (s[1] == 'i') {
                if (s[2] == 'n') {
                  if (s[3] == ' ') AddMatch(id + 16 * n, l + 4, l, matches);
                } else if (s[2] == 's') {
                  if (s[3] == ' ') AddMatch(id + 47 * n, l + 4, l, matches);
                }
              } else if (s[1] == 'f') {
                if (s[2] == 'o') {
                  if (s[3] == 'r' && s[4] == ' ') {
                    AddMatch(id + 25 * n, l + 5, l, matches);
                  }
                } else if (s[2] == 'r') {
                  if (s[3] == 'o' && s[4] == 'm' && s[5] == ' ') {
                    AddMatch(id + 37 * n, l + 6, l, matches);
                  }
                }
              } else if (s[1] == 'o') {
                if (s[2] == 'f') {
                  if (s[3] == ' ') AddMatch(id + 8 * n, l + 4, l, matches);
                } else if (s[2] == 'n') {
                  if (s[3] == ' ') AddMatch(id + 45 * n, l + 4, l, matches);
                }
              } else if (s[1] == 'n') {
                if (s[2] == 'o' && s[3] == 't' && s[4] == ' ') {
                  AddMatch(id + 80 * n, l + 5, l, matches);
                }
              } else if (s[1] == 't') {
                if (s[2] == 'h') {
                  if (s[3] == 'e') {
                    if (s[4] == ' ') AddMatch(id + 5 * n, l + 5, l, matches);
                  } else if (s[3] == 'a') {
                    if (s[4] == 't' && s[5] == ' ') {
                      AddMatch(id + 29 * n, l + 6, l, matches);
                    }
                  }
                } else if (s[2] == 'o') {
                  if (s[3] == ' ') AddMatch(id + 17 * n, l + 4, l, matches);
                }
              } else if (s[1] == 'w') {
                if (s[2] == 'i' && s[3] == 't' && s[4] == 'h' && s[5] == ' ') {
                  AddMatch(id + 35 * n, l + 6, l, matches);
                }
              }
            } else if (s[0] == '"') {
              AddMatch(id + 19 * n, l + 1, l, matches);
              if (s[1] == '>') {
                AddMatch(id + 21 * n, l + 2, l, matches);
              }
            } else if (s[0] == '.') {
              AddMatch(id + 20 * n, l + 1, l, matches);
              if (s[1] == ' ') {
                AddMatch(id + 31 * n, l + 2, l, matches);
                if (s[2] == 'T' && s[3] == 'h') {
                  if (s[4] == 'e') {
                    if (s[5] == ' ') AddMatch(id + 43 * n, l + 6, l, matches);
                  } else if (s[4] == 'i') {
                    if (s[5] == 's' && s[6] == ' ') {
                      AddMatch(id + 75 * n, l + 7, l, matches);
                    }
                  }
                }
              }
            } else if (s[0] == ',') {
              AddMatch(id + 76 * n, l + 1, l, matches);
              if (s[1] == ' ') {
                AddMatch(id + 14 * n, l + 2, l, matches);
              }
            } else if (s[0] == '\n') {
              AddMatch(id + 22 * n, l + 1, l, matches);
              if (s[1] == '\t') {
                AddMatch(id + 50 * n, l + 2, l, matches);
              }
            } else if (s[0] == ']') {
              AddMatch(id + 24 * n, l + 1, l, matches);
            } else if (s[0] == '\'') {
              AddMatch(id + 36 * n, l + 1, l, matches);
            } else if (s[0] == ':') {
              AddMatch(id + 51 * n, l + 1, l, matches);

    Какая-то непонятная херота из архиватора Brotli с кучей магических констант, которые хрен знает что означают. Очевидно, этот код должен находить в текстовых данных какие-то часто встречающиеся куски текста, и таким образом сжимать эту хрень (т.н. словарный метод сжатия) но зачем все так пиздануто рассовывать по буквам в куче if() ?

    Не могли для этого каких-нибудь ГОМОИКОН сделать?

    Запостил: j123123, 04 Июня 2018

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

    • А можно ли хуйнуть список/древо, в котором в узлах/листьях хранить букаффки и ко-ко-константы, и эту хуету заменить на опхот древа?
      Ответить
      • Не царское это дело - деревья обходить.
        Ответить
    • > но зачем все так пиздануто рассовывать по буквам в куче if() ?

      писатели архиваторов часто таким байтоёбством занимаются.

      потому что сами компрессоры программы не просто байтоёбством занимаются - хуже - они битоёбством занимаются.

      пару бит тут, пару бит там - глядишь 0.1% на каком бенче и выиграл.
      Ответить
    • https://github.com/google/brotli/blob/master/research/brotlidump.py#L1289

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

          (*) лол, или мухлеж в бенчмарках компрессии.
          Ответить
    • А другие языки оно не умеет сжимать?
      Ответить
      • Ono sperva perevodit na translit.
        Ответить
        • Очень полезно, если в другом языке есть слова "анд", "фор", "фром", "витх", "тхе".
          Ответить
          • Ы-зы-зы :D :D :D :D :D
            Ответить
            • Лет ми спик фром май харт, май френдз. Итс эн юник мумент ин тайм.
              Ответить
        • Очень полезно, если в другом языке есть слова "анд", "фор", "фром", "витх", "тхе".
          Ответить
      • Можно еще сделать особый алгоритм сжатия, который бы был максимально заточен на сжатие минимизированного JS кода, и потом этот алгоритм использовать для распаковки JS кода прямо в браузере налету
        Ответить
        • Накинуть к этому ещё пару плюшек и получится тот_самый WASM

          Хотя, конечно, непосредственно с JS он не работает - к WASM, который, по сути, js-байткод, приводится лишь IL-хренотень :(

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

          хлебный_троллейбус.жпег

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

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

              > особый алгоритм сжатия, который бы был максимально заточен на сжатие минимизированного JS кода

              А вообще не нужно никакого особого алгоритма. Достаточно взять paq8p.
              Ответить
              • > не нужно никакого особого алгоритма. Достаточно взять paq8p.
                Ну да, как-то глупо вместо исполнения байткода распоковывать его обратно в жыс.
                Ответить
          • Самое интересное, что байт-код для JS существует, но он не стандартизирован (тысячи их: SpiderMonkey и прочие *Monkey, V8, ChakraCore, Carakan, Rhino). Причём в одном и том же браузере байт-код может резко смениться после очередной версии. И зачастую нет способа загрузить в браузер скомпилированный байт-код, чтобы не тратить время на компиляцию (либо документация по способу глубоко запрятана).
            Ответить
            • Исполнять JS интерпретатором - маленький_мозг.jpg
              Исполнять байткод - нормальный_мозг.jpg
              Исполнять байткод джаваскриптом - мозг_сверхчеловека.jpg
              Ответить
              • Исполнять байткод джаваскриптом, скомпилированным в байткод, интерпретируемый джаваскриптом - вселенная.jpg
                Ответить
                • Всиленский разум. Прямо вспомнилась книжка Артура Кларка "Конец Детства".
                  Ответить
    • А лисички взяли спички,
      Подожгли слону яички...


      А что вас смущает? Обычный генерированный код...
      Ответить
      • Красивее только выхлоп FLEX или YACC.
        Ответить
      • А где именно находится код, который генерирует этот код?
        Ответить
    • Просто оставлю это здесь

      Brotli defines a static dictionary that all implementations must support. Zstd lets you generate (train) your own dictionaries – you just point it at a set of files you want it to train on, and it generates a good dictionary for them. I think brotli has some support for custom dictionaries, but it’s not easy for an end-user to create them.
      
      Something is wrong with brotli’s dictionary, and I don’t think anyone knows what’s going on with it. It includes strings like:
      
          CIA World Factbook
          his younger brother
          the Ottoman Empire
          pittsburgh (all lowercase, but brotli’s dictionary includes simple transforms)
      
      but not strings like:
      
          Los Angeles
          tweet
          http://schema.org (or just schema.org)
          <div property=" (or just div property)
          <link rel="dns-prefetch" href=" (or a shorter substring)
      
      which would be really handy.
      Ответить

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