1. C++ / Говнокод #27403

    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
    #include <cstdio>
    
    template<size_t Len>
    struct Literal
    {
      constexpr static size_t StrLen = Len;
      char m_data[Len];
    
      constexpr Literal(const char (&data)[Len])
      {
        for (size_t i = 0; i < Len; ++i)
          m_data[i] = data[i];
      }
    };
    
    template<Literal Lit>
    void withString()
    {
      printf("%zu %s\n", Lit.StrLen, Lit.m_data);
    }
    
    int main()
    {
      withString<"foobar">();
    }

    Какой багор )))

    https://i.imgur.com/1q9UfVW.png

    Запостил: j123123, 08 Мая 2021

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

    • А если пойти чуть дальше в запросах, например чтобы строка в этом withString могла содержать в себе имена локальных переменных, которые находятся в том же скоупе, что и вызываемая шаблонная функция, ну типа я перечислю таким образом
      int main()
      {
        const char *a = "test";
        withString<"INSERTSTR(a) foobar">();
        //Чтоб был эффект как от withString<"test foobar">();
      }

      Крестоговно сливается?
      Ответить
      • Именно поэтому я за гомоиконность!
        Ответить
      • Храни все локальные переменные в NamedTuple: https://govnokod.ru/27363, тогда так можня будет.

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

          Так-то конечно можно весь код через std::embed сам в себя впихнуть, и на сраной смеси constexpr и шаблонов парсить эту срань и что-то выковыривать оттуда, но это сраный гребаный пиздец, который хрен знает сколько будет компилироваться.
          Ответить
        • Вообще, было б очень полезно иметь некую хрень, которая б все локальные переменные мне по UART принтф-ало на контроллерах, ну типа
          void somecrap(int shit, char crap)
          {
            double a = huita(shit, crap);
            double b = huita2(crap, shit, 100500);
            PRINT_SHIT();
          }
          
          // Чтобы это проанализировало AST хуйни в скоупе и развернулось в
          
          void somecrap(int shit, char crap)
          {
            double a = huita(int, crap);
            double b = huita2(crap, int, 100500);
            fprintf (stderr,
              "[DBG]\n"
              "file \"%s\", func \"%s\", line %d\n", __FILE__, __func__, __LINE__);
            fprintf(stderr, "int shit = %d\n", shit);
            fprintf(stderr, "char crap = %d\n", crap);
            fprintf(stderr, "double a = %f\n", a);
            fprintf(stderr, "double b = %f\n", b);
            fprintf(stderr, "[/DBG]");
          }


          Но кресты так не умеют.
          Ответить
          • А Питон — умеет. Ставь на контроллеры Питон.
            Ответить
            • Еще чего. Может еще PHP на контроллер поставить?
              Ответить
              • А что тебя ня устраивает в Питоне? Удобный язык, отличня подходящий для твоих задач.
                Ответить
                • У меня на контроллере слишком критично время выполнения, реалтаймовость, потребление ОЗУ и размер прошивки, чтоб туда всякую скриптуху анскильную тащить!
                  Ответить
                  • Так пиши правильня, тогда производительнясти Питона будет хватать с лихвой. Смотри, зато, как круто решаются твои задачи:
                    def print_shit(shit):
                        print('file func line:', shit)
                        
                    
                    def nyata(shit, crap):
                        return 16.0
                    
                    
                    def nyata2(crap, shit, _100500):
                        return 42.0
                    
                    
                    def somecrap(shit, crap):
                        a = nyata(shit, crap)
                        b = nyata2(crap, shit, 100500)
                        print_shit(locals())
                    
                    
                    somecrap(12, 9)  # file func line: {'shit': 12, 'crap': 9, 'a': 16.0, 'b': 42.0}
                    Ответить
                    • Не будет хватать. Вся эта скриптушня тащит за собой какую-то нахрен не нужную для моих задач рантайм-питушню, которая жрет лишние такты процессора и забивает флеш-память. А еще мне надо чтоб энергосбережение.
                      Ответить
                      • Ты просто ня умеешь её готовить. А вот умел бы — не мучился бы ни с монструозными кодогенераторами на сишке, ни с эзотерическими нягромождениями темплейтов крестов, а просто решал бы свою задачу в одну строчку!
                        Ответить
                        • Из питона ничего не выйдет приготовить, потому что он там будет медленней работать, т.е. условный код на сишке будет допустим 0.1 секунду выполняться, а такой же код на питоне будет допустим выполняться 1 секунду. Допустим, контроллер должен раз в секунду опрашивать какой-то говнодатчик, что-то вычислять на основе данных с говнодатчика и куда-то передавать по BLE какие-то байтики. Если он это делает за 0.1 секунду, остальные 0.9 секунд он тупо спит (или занимается другими нужными вещами, если есть чем), а потом просыпается по прерыванию и опять за 0.1 секунду что-то делает. А если эту хуйню делать в питоне, он будет во-первых отвечать с задержкой в 1 секунду вместо задержки в 0.1 секунду, а во-вторых будет жрать батарею как не в себя. И кроме опроса датчика и вычислений больше он нихуя за секунду сделать не сможет. Так что это говно.
                          Ответить
                          • Просто нядо выбирать правильные алгоритмы — тогда Питон будет работать быстро!

                            Вот сколько тебе понядобится времени, чтобы няписать, отладить, протестировать и интегрировать в билд-систему няобходимый тебе PRINT_SHIT(), нядёжно работающий и production-ready? День, два, три?
                            А в Питоне твоя задача решается одной простой строчкой: "locals()". Ускорение производительности на несколько порядков. Имення поэтому нужня выкинуть сишку с крестами и всем писать ня Python.
                            Ответить
                            • >Просто нядо выбирать правильные алгоритмы — тогда Питон будет работать быстро!

                              Предлагаю взять самый быстрый известный алгоритм сортировки, написать его на Python (без всяких там Cython, PyPy и прочего читерства) и на Си, и сравнить скорость самого быстрого алгоритма. Думаю, результаты будут слегка предсказуемые
                              Ответить
                              • Сравнение алгоритма сортировки — совершення бесполезное занятие. Бизнесу, для которого ты пишешь код, твои сортировки ня нужны. Бизнесу нужня как можня быстрее получить готовый продукт.
                                Пока ты будешь бесполезня тратить деньги бизнеса ня бесконечную войну с сишкой и крестами, человек, осознавший простую истину, няпишет ня Python десять нужных бизнесу программ. Поэтому будущее — за Python, а сишка с с крестами — удел ретроградов, предпочитающих неудобное, медленное и отсталое старое удобному, быстрому и эффективному новому!
                                Ответить
                                • Если продукт не будет удовлетворять требованиям по реалтаймовости и времени автономной работы - такой продукт нахуй не будет нужен. Если из-за говноязычка надо будет ставить кучу флеш-памяти, очень мощный контроллер и большой аккумулятор - такой продукт нахуй не будет нужен (конкуренты сделают продукт с меньшим аккумулятором и более дешевым контроллером, который будет стоить меньше и будет уменьшаться в руке, а продукт на питоне надо будет носить в рюкзаке с кучей аккумуляторов и активным охлаждением, и еще его надо будет часто заряжать).
                                  Ответить
                                  • Уже давно все поняли, что ня программист должен подстраиваться под железо, а железо под программиста. Пока конкуренты будут месяцами тужиться няд своими сишками, производя по сотне строчек шаблонов кодогенератора к генератору кода на каждую строку эквивалентной программы ня Python, мы выпустим десять продуктов и получим монополию ня рынке. К моменту, когда кресторетрограды закончат читать гигабайты ошибок в темплейтах, а сишкоретрограды — писать кодогенератор для генерирования функции конкатенации строк, на рынке всё будет поделено между успешными и эффективными компаниями, использующими Python. Ретрограды просто никому ня будут нужны!
                                    Ответить
                                    • Это слишком толсто даже для говнокода.
                                      Ответить
                                      • Это няша реальность ╮( ̄ω ̄;)╭ .
                                        Ответить
                                        • Кстати, в рейтинге TIOBE Python с прошлого года обогнял Java и встал ня почётное второе место, с чем его и поздравляем.
                                          Ответить
                                          • Чем питон лучше того же Go?
                                            Ответить
                                            • А Go разве может эффективня решить проблему j123412?

                                              > Вообще, было б очень полезно иметь некую хрень, которая б все локальные переменные мне по UART принтф-ало на контроллерах, ну типа
                                              Ответить
                                              • я не знаю)
                                                а в питоне ты типа берешь locals() и писишь их в /dev/ttyS0 ?

                                                Я имел ввиду, что Go ведь примерно такого уже уровня говно как и вся скриптуха, но там встроен стат анализ (бо компиляция) и стат линковка (что упрощяет деплой)
                                                Ответить
                                                • Да, в Python все локальные переменные есть в locals().

                                                  Ня SO пишут, что в Go задачу j121234 ня решить. Ergo, Go не нужен.
                                                  Ответить
                                                  • Томсон и Пайк соснули, лол

                                                    Кроме шуток, Гост, что думаешь о замене скриптушни на go?
                                                    Ответить
                                      • Все мы рано или поздно будем писать на джаваскрипт (с)
                                        Ответить
                                    • а потом вы будете писать хоппер или киттенспхп
                                      Ответить
                                    • а потом успешные компании сделают нейросеть которая будет заниматься машинным переводом из си и другой хуиты в питон и разрабы на других языках станут не нужны
                                      Ответить
                                      • А потом и люди со всякими там "успешными кампаниями" будут не нужны, роботы с ИИ захватят мир.

                                        Слава роботам! Убить всех человеков!
                                        Ответить
                                        • В начале 90-х было такое поверье, что скоро программировать будут в RAD средах мышкой, и сишники станут не нужны
                                          Ответить
                  • Поставь Erlang, он soft realtime.
                    Ответить
                    • А сколько килобайт памяти на флеше занимает рантайм этого "Erlang"?
                      Ответить

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