Кресты / Говнокод #26695 Ссылка на оригинал

0

  1. 1
https://github.com/ASDAlexander77/TypeScript2Cxx/blob/master/cpplib/core.h

Нужна помощь смелых и умных людей, надо сделать review кода и посоветовать что там по стандартам улучшить... короче любая помощь welcome

https://github.com/ASDAlexander77/TypeScript2Cxx/blob/master/cpplib/core.h

Запостил: ASD_77 ASD_77, (Updated )

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

  • А быстро компилируется?
    Ответить
  • Сразу видно, что ты ебанутый. Ты перевёл «TypeScript» на «C++».
    Ответить
    • Не надо нападать на человека.
      Он всё правильно сделал.
      Дал бой скриптухе.
      Ответить
        • Так-то да. Но коммент читается двусмысленно, особенно новичком.
          Вообще на ГК очень редко проскакивает что-то настолько упорото-гениальное.
          Ответить
          • > Вообще на ГК очень редко проскакивает что-то настолько упорото-гениальное.
            Подтверждаю.
            Ответить
            • А можно пужулуйста создать еще 1 оффтоп этой инвормации.
              #26671 уже забился.
              Ответить
  • > return `Hello, my name is ${this.name} and I work in ${this.department}.`;
    >return "Hello, my name is "_S + this->name + " and I work in "_S + this->department + "."_S;
    Может форматтеры как-то приспособить.
    Или сишные sprintf("Hello, my name is %s"), или что там в кресты завезли.
    Ответить
    • да я хотел как бы хоть и на С++ но для тех кто TypeScript-ер что бы они в ужасе не шарахались от sprintf-ов и сделать минимальные изменения
      Ответить
  • Как я понимаю, вместо tracing gc, используется reference counting (shared_ptr).

    Есть мысли как решить проблему утилизации «островков» циклических ссылок?
    Ответить
      • Да, я тоже думал взять какую-то либу, строяющую граф.
        Получится гибрид как в CPython, где основную часть мусора собирает счётчик ссылок.
        А остальное прибивает традиционный гц.

        Garbage collection algorithms

        Standard CPython's garbage collector has two components, the reference counting collector and the generational garbage collector, known as gc module.

        The reference counting algorithm is incredibly efficient and straightforward, but it cannot detect reference cycles. That is why Python has a supplemental algorithm called generational cyclic GC, that specifically deals with reference cycles.

        The reference counting module is fundamental to Python and can't be disabled, whereas the cyclic GC is optional and can be invoked manually.
        Ответить
          • Чуть ниже скорость алокаций (цена shared_ptr).

            Зато локальные и короткоживущие объекты деаллоцируются мгновенно и детерминированно.
            Десктрукторы срабатывают когда надо. Соответственно ресурсы практически всегда освобождаются сами.

            И не возникает таких багров:
            https://govnokod.ru/26671#comment548754
            https://govnokod.ru/26671#comment549578
            Ответить
            • >Чуть ниже скорость алокаций (цена shared_ptr).
              Я спросил, чем это лучше)

              Я понимаю, что ГЦ быстро аллоцирует (потому что просто берет еще кусок, и всё), но потом долго чистит (или не чистит вовсе).

              >И не возникает таких багров:
              Да, теперь понятно.
              Файл закроется при выходе из функции даже без with, да?


              Еще интересно сделано в C#/.net.

              Там есть структуры, которые могут жить на стеке. И объекты, которые как джаве объекты.

              К сожалению, я не могу выбирать что и где разместить (не C++), но могу сказать struct вместо class, и она всегда будет жить на стеке и копироваться.

              Но кажется что на нее нельзя референс получить вообще никогда.
              Ответить
        • The worst from both worlds:

          - недетерминированные финализаторы, как в языках с GC
          - оверхед от рефкаунтера, как в языках без GC

          Полная хуйня, имхо.
          Ответить
            • ▄▖ ▄                                                                                                                                  
              ▐█▌  ██         ▜███                                                                                                                                  
               ██ ▐█▘          ▀▀▘                                                                                                                                  
               ▝█▙█▛ ▝█▌  ▐█▘▐█  ██                                                                                                                                 
                ▜██▘  ▜█  █▛ ▐█ ▟██                                                                                                                                 
                ▐█▙   ▐█▖▗█▌ ▐█▗███                                                                                                                                 
               ▗███▌   █▌▐█  ▐█▟█▐█                                                                                                                                 
               ▟█▘██   ▜██▛  ▐██▌▐█                                                                                                                                 
              ▗█▛ ▝█▌  ▝██▘  ▐██ ▐█                                                                                                                                 
              ██   ▜█▖  ██   ▐█▘ ▐█                                                                                                                                 
                       ▗█▌                                                                                                                                          
                      ▄██▘                                                                                                                                          
                      ▀▀▘
              Ответить
              • .                    ▄ ▄       ▖                      ▗▖ ▗▄  ▄                                                                                         
                ▐▌▗█▛               ▜▙█    ▐██▛                      ▝█▖▝█▌ ▜▌                                                                                        
                ▐▙█▛ ▗▄▄▄ ▗▖▗▄▖▗▄▄▖ ▄▀▙▖   █▙▄▖ ▄▄▄▖ ▄▄▄▖ ▄▄▄ ▗▄▄▄    ▐▙ ▐█ ▝█                                                                                        
                ▐██  ▝▀▀█ ▐▙█▀ █▛▜█ █▗█▌   █▛▜█ ▀▀▜▌ █▛▀▘▐█▀█▌▐█▀█▖   ▐█ ▝█  █                                                                                        
                ▐▛█▌ ▐███▌▐██  █ ▝█ ███▌   █  █ ████ █▌  ▐▌ ▐▌▐▌ █▌   ▐█  █  █                                                                                        
                ▐▌▐█▖█▌▗█▌▐▌█▙ █▖▐█ ██▐▌   █▖▗█▐█ ▟█ █▌  ▐▙ ▟▌▐▙ █▌   ▐█ ▗█  █                                                                                        
                ▐▌ ▜▙▜███▌▐▌▝█▖▜██▛ █▘▐▌   ▜██▛▝████ █▌  ▝███▘▐███    ▐▛ ▐▛ ▗█                                                                                        
                                                              ▐▌     ▗█▘▗█▘ ▟▌                                                                                        
                                                              ▝▘     ▝▘ ▝▘  ▀
                Ответить
      • Да. В противном случае придётся течь по памяти (для короткоживущих скриптов приемлимо).
        Или вводить ограничения на разные классические структуры типа doubly linked list.
        Ответить
  • Можно для тупых, что это будет? По тестам не понял.
    Ответить
    • это будет с++ с человеческим лицом(т.к. синтаксисом)
      Ответить
        • легко вот так выглядит TS

          function makeRangeIterator(start = 0, end = Infinity, step = 1) {
              let nextIndex = start;
              let iterationCount = 0;
          
              const rangeIterator = {
                 next: function() {
                     let result;
                     if (nextIndex < end) {
                         result = { value: nextIndex, done: false }
                         nextIndex += step;
                         iterationCount++;
                         return result;
                     }
                     return <any>{ value: iterationCount, done: true }
                 }
              };
              return rangeIterator;
          }
          
          const it = makeRangeIterator(1, 10, 2);
          
          let result = it.next();
          while (!result.done) {
           console.log(result.value); // 1 3 5 7 9
           result = it.next();
          }
          
          console.log("Iterated over sequence of size: ", result.value);


          а вот так ужастно выглядит с++

          #include "test.h"
          
          using namespace js;
          
          any makeRangeIterator(js::number start, js::number end, js::number step)
          {
              shared nextIndex = start;
              shared iterationCount = 0;
              auto rangeIterator = object{
                  object::pair{STR("next"), [=]() mutable
                  {
                      any result;
                      if (nextIndex < end) {
                          result = object{
                              object::pair{STR("value"), nextIndex}, 
                              object::pair{STR("done"), false}
                          };
                          nextIndex += step;
                          iterationCount++;
                          return result;
                      }
                      return static_cast<any>(object{
                          object::pair{STR("value"), iterationCount}, 
                          object::pair{STR("done"), true}
                      });
                  }
                  }
              };
              return rangeIterator;
          };
          
          
          object it = makeRangeIterator(1, 10, 2);
          any result = it["next"]();
          
          void Main(void)
          {
              while (!result["done"])
              {
                  console->log(result["value"]);
                  result = it["next"]();
              }
              console->log(STR("Iterated over sequence of size: "), result["value"]);
          }


          и это я еще проигнорировал с++ header
          Ответить
          • Заебато!
            Более поехавших на «Говнокоде» я ещё не видел.
            Ответить
            • вот тут я переделал код немного с JS на TS что бы было более менее типизированно

              function makeRangeIterator(start = 0, end = Infinity, step = 1) : () => [ number, boolean ] {
                  let nextIndex = start;
                  let iterationCount = 0;
              
                  return () => {
                         let result : [ number, boolean ];
                         if (nextIndex < end) {
                             result = [ nextIndex, false ]
                             nextIndex += step;
                             iterationCount++;
                             return result;
                         }
                         return [ iterationCount, true ]
                  };
              }
              
              const next = makeRangeIterator(1, 10, 2);
              
              let result = next();
              while (!result[1]) {
               console.log(result[0]); // 1 3 5 7 9
               result = next();
              }
              
              console.log("Iterated over sequence of size: ", result[1]);


              и получаем С++ код для него

              #include "test.h"
              
              using namespace js;
              
              std::function<std::tuple<js::number, boolean>()> makeRangeIterator(js::number start, js::number end, js::number step)
              {
                  shared nextIndex = start;
                  shared iterationCount = 0;
                  return [=]() mutable
                  {
                      std::tuple<js::number, boolean> result{0, false};
                      if (nextIndex < end) {
                          result = std::tuple<js::number, boolean>{ nextIndex, false };
                          nextIndex += step;
                          iterationCount++;
                          return result;
                      }
                      return std::tuple<js::number, boolean>{ iterationCount, true };
                  };
              };
              
              
              std::function<std::tuple<js::number, boolean>()> next = makeRangeIterator(1, 10, 2);
              std::tuple<js::number, boolean> result = next();
              
              void Main(void)
              {
                  while (!std::get<1>(result))
                  {
                      console->log(std::get<0>(result));
                      result = next();
                  }
                  console->log(STR("Iterated over sequence of size: "), std::get<1>(result));
              }
              Ответить
              • Я только сейчас понял что к js прикручен даже примитивный автовывод.
                Моё почтение.
                function makeRangeIterator(start = 0, end = Infinity, step = 1) {
                any makeRangeIterator(js::number start, js::number end, js::number step)

                Кстати не факт что оно не сломается на каком-то ёбнутом примере со слабой тупизацией, где ф-ция принимает и строку и число.

                Как я понимаю any и shared это просто void *.
                struct any;
                struct shared;

                shared — мусоросборный умный, а any — обычный указатель.
                Не понял пока по каким правилам транспилер понимает какой нужно ставить any или shared?
                Ответить
                • если переменная вне scope (функции или лямбды) тогда надо шарить. а any это когда тип не может быть определен и еще shared - это протипизированная а any нет
                  Ответить
                • вот пример

                  function padLeft(value: string, padding: number)                       
                           function padLeft(value: string, padding: string)                       
                           function padLeft(value: string, padding: any) {                        
                              if (typeof padding == "number") {                                   
                                  return padding + value;                                         
                              }                                                                   
                                                                                                  
                              if (typeof padding == "string") {                                   
                                  return padding + value;                                         
                              }                                                                   
                                                                                                  
                              return null;                                                        
                          }                                                                       
                                                                                                  
                          console.log(padLeft("Hello world", 4));


                  и вот результат

                  #include "test.h"
                  
                  using namespace js;
                  
                  any padLeft(string value, any padding)
                  {
                      if (equals(type_of(padding), STR("number"))) {
                          return padding + value;
                      }
                      if (equals(type_of(padding), STR("string"))) {
                          return padding + value;
                      }
                      return null;
                  };
                  
                  
                  
                  void Main(void)
                  {
                      console->log(padLeft(STR("Hello world"), 4));
                  }
                  
                  MAIN
                  Ответить
                  • > equals(type_of(padding), STR("number"))
                    Хорошо бы довести до type_of(padding) == STR("number").
                    Ответить
                • а вот вариант решить проблему через generic

                  function padLeft<T>(value: string, padding: T) {                        
                              return padding + value;                                         
                          }                                                                       
                                                                                                  
                          console.log(padLeft("Hello world", 4));


                  и результирующий код

                  #ifndef TEST_H
                  #define TEST_H
                  #include "core.h"
                  
                  using namespace js;
                  
                  template <typename T>
                  any padLeft(string value, T padding);
                  
                  template <typename T>
                  any padLeft(string value, T padding)
                  {
                      return padding + value;
                  };
                  
                  
                  #endif
                  
                  #include "test.h"
                  
                  using namespace js;
                  
                  
                  void Main(void)
                  {
                      console->log(padLeft(STR("Hello world"), 4));
                  }
                  
                  MAIN
                  Ответить
    • Если докрутить нормальный сборщик (в теории) это может уделать V8 и прочие ноды.
      Т.к. скриптушня вдруг побежит наперегонки с крестами.
      Ответить
  • >https://github.com/ASDAlexander77/cs2cpp
    >C# to C++ transpiler (Cs2Cpp)

    Слушай, да ты и правда поехавший
    Ответить
    • нефиг смеятсо - он полностью mscore переводил в с++ коды. и еще GC юзал. правда код получался 400МБ
      Ответить
  • Нет, серьезно

    Я понимаю, когда мудаки из FB и ВК пишут компилятор из своего недоязыка в С++: у них много легаси говна на недоязыке, а он тормозит, и выбора у них нет.

    Но тебе-то зачем это?
    Ответить
    • При чем тут легаси говно? ВКовцы не способны переписать рантайм ВКшки на что угодно?
      Ответить
      • У тебя есть охулион строк кода на пыхе. Что ты можешь с ними сделать? Выкинуть, и написать с ноля всё на нормальном языке?

        ps: как же я люблю ВКод.
        Просто читал бы и читал
        if (key_len >= 5 && !strncmp (key, "queue", 5)) {
              int add = 0, x, y;
              if (sscanf(key + 5, "%d,%d%n", &x, &y, &add) != 2) {
                x = y = add = 0;
              }
              if (key[key_len - 1] != ')' || key[5 + add] != '(' || (key_len - 6 >= STATS_BUFF_SIZE)) {
                QRETURN(set, -2);
              }
        
              safe_read_in (&c->In, buf, size);
              buf[size] = 0;
        
              int len = key_len - 7 - add;
              memcpy (stats_buff, key + 6 + add, len);
              stats_buff[len] = 0;
        
              if (!do_add_event (stats_buff, len, buf, size, x, y, TTL_EVENT)) {
                QRETURN(set, 0)
              }
        Ответить
          • Сто лет бы мне не видеть этих строчек!
            Ответить
        • Ну не охулион же. Перепишу на кресты ту часть, которая больше всего тормозит. Постепенно может быть всё перепишу.
          Ответить
          • К тому моменту, когда они уперлись в стену -- был охулион уже. Причем вылизанных.

            А почему ты думаешь они решили писать компилятор подмножества говна в с++? От хорошей жизни?
            Ответить
            • Я без понятия что именно там написано на «PHP». Не система рекомендаций же?
              Ответить
              • Думаю что весь фронт и куча инфраструктурной питушни
                Ответить
                • Фронт можно как за нехуй переписать, а инфраструктурную питушню пока оставить, новую сразу писать на новой, старое само вымрет.

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

                    Слишком высока цена
                    Ответить
                  • Они его несколько раз перепиливали.
                    Вёб-макаки нынче не так дороги.
                    Ответить
                    • Да ладно? Почему-то уверен, что веб-макака и с-макака стоит одинаково. Особенно в ВК. Просто одних могут нанимать меньше других.
                      Ответить
                      • Си-макака все таки чуть более скильная в ВК: там надо уметь в тысячи строк олимпиадного байтоёбства и в хайлоад
                        Ответить
                        • Я не спорю. Но стоят они одинаково.
                          Ответить
    • что бы уделать всю майкрософт с их недо CoreRT и с их Static TypeScript - там вообще Basic более продвинутый энжин блин 🙂
      Ответить
          • Разумеется, но не нужно.
            Тайпскрипт нужен, потому что JS неюзабельное дерьмо без стат типизации, и писать на нем большой проект это полный undefined [Object object] NaN.

            TS же имеет бесплатный интероп с JS и очень хорошо в него компилируется.

            Ровно за этим он и нужен.

            Использовать TS там, где можно использовать нормальный язык -- глупо (имхо).

            Хотя...

            Если я пишу приложение с фронтом в браузере и высоконагруженном беке, то я могу (теоретически) написать его на TS.

            Фронт компильнется в JS, а бек, через твою опердень, в C++.

            Может, не такая уж и плохая идея:)

            Другой вариант -- взять Котлин.
            Он умеет компилироваться в JS (хуево) и в нативный код (через посредство llvm) (тоже очень хуёво).
            Ответить
  • И нахуя ? Кто пишет на тсе что-то кроме фронта ? Как я эту дрисню в .html впихну ?
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8