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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    class Point {
      x = 0;
      y = 0;
    }
    
    function main() {
      const pt = new Point();
      // Prints 0, 0
      print(`${pt.x}, ${pt.y}`);
    }

    вот пока вы тут языки чесали - я наваял новую фичу. а кто догадается что особенного в этом классе? в чем фича?

    Запостил: ASD_77, 12 Июля 2021

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

    • Конструктор (в данном случае неявный) инициализирует поля.
      Ответить
      • какие все умные ... епрст :)
        Ответить
        • Кстати, а потом этот объект утёк? В прошлых версиях ведь new по-сишному работал с ручным delete.

          Или уже автоматом память освобождается?
          Ответить
          • alloca же. Выделяет в стеке. При выходе из функции стек чистится вилкой.
            Ответить
            • P.S. А не, туплю. alloca была, если без new. А тут malloc, значит, должно утечь.
              Ответить
              • GC пока еще не завезли - это будет последнее что я сделаю перед релизом. я уже юзал для cs2cpp конвертора
                Ответить
                • Кстати, нет желания воскресить бекенд «c» в LLVM? Его перестали поддерживать и выпилили где-то в версии 2.9, т. е. очень давно.

                  Или, например, что-то сделать с «gcj»? Из gcc 7 его выпилили, а в старых версиях он как костыль: фронтенд и бекенд смешаны, так что, с одной стороны, нельзя генерировать jvm-байткод из произвольного ЯП; с другой стороны, нативный код из java не очень.
                  Ответить
                  • ты не это хотел https://github.com/JuliaComputingOSS/llvm-cbe ?
                    Ответить
                    • Круто! Оно. Спасибо!
                      Ответить
                    • Оказывается, его несколько раз пытались поднимать. Их проект — это форк другого проекта, заброшенного семь лет назад:
                      https://github.com/draperlaboratory/llvm-cbe
                      Ответить
                    • А ещё, оказывается, когда-то был CppBackend:
                      https://github.com/llvm-mirror/llvm/commit/257fabb18605265a79397d35dd79a3973760ffaf
                      Ответить
                • cs2cpp крутой. Мне бы не хватило усидчивости такой проект осилить. Да и знаний крестов и шарпа...
                  Ответить
                • Boehm?
                  Ответить
                  • он самый.. мне он понравился тем что его легко компилить для многих платформ. много опций и легко включать в свои проекты
                    Ответить
    • Удобно.
      Ответить
    • Так это же C++.
      #include <cstdio>
      
      struct Point {
          float x = 0.0f;
          float y = 16.0f;
      };
      
      int main()
      {
          const auto pt = Point();
          std::printf("%f %f\n", pt.x, pt.y);
      }
      Ответить
      • cppinsights ничего не трансформирует, так и оставляет. Только явный static_cast у аргументов printf показывает.
        Ответить
        • Странно. gcc просто передал аргументы printf'у. clang тоже. Может ты оптимизацию забыл?
          Ответить
          • Это не ассемблерный выхлоп. Это транскомпилятор C++ в C++:
            https://cppinsights.io
            Ответить
            • > транс-компилятор

              Ну вот и что ему не жилось как обычному конпелятору из крестов в асм...
              Ответить
              • govnokod.ru — это наилучший источник информации по теме «транс».
                Ответить
              • К слову, исторически первый компилятор языка «C++» — «Cfront» — на выходе давал сишный файл, а не ассемблер и не машкоды.

                Помню, как обломался, когда пытался скомпилировать сам «Cfront» в «DOS» или в «Windows». Компиляция остановилась на файле «aux.c». Вы теперь уже знаете, почему.
                Ответить
                • а чем разница? разници то никакой после прохода оптимизатора.
                  Ответить
    • Кстати, а твой компилятор умеет иняциализировать поля с инициализаторами, ня инициализированные в явном конструкторе?
      #include <cstdio>
      
      struct Point {
          constexpr Point() noexcept = default;
          constexpr Point(float x_) noexcept :
              x(x_)
          {}
          
          float x = 0.0f;
          float y = 16.0f;
      };
      
      int main()
      {
          const auto pt1 = Point();
          const auto pt2 = Point(7.0f);
          std::printf("%f %f\n", pt1.x, pt1.y);  // 0.0 16.0
          std::printf("%f %f\n", pt2.x, pt2.y);  // 7.0 16.0
      }
      Ответить
      • А тут так показывает:
        #include <cstdio>
        
        struct Point
        {
          inline constexpr Point() noexcept = default;
          inline constexpr Point(float x_) noexcept
          : x{x_}
          , y{16.0F}
          {
          }
          
          float x;
          float y;
        };
        
        
        
        int main()
        {
          const Point pt1 = Point();
          const Point pt2 = Point(7.0F);
          printf("%f %f\n", static_cast<double>(pt1.x), static_cast<double>(pt1.y));
          printf("%f %f\n", static_cast<double>(pt2.x), static_cast<double>(pt2.y));
        }
        Ответить
      • > noexcept

        Это только чтобы выебнуться, да?
        Ответить
    • это чтобы выебнуться код.
      по хорошему надо так:
      function main() { print('0, 0') }
      Ответить

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