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

    +5

    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, 27 Мая 2020

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

    • показать все, что скрытоvanished
      Ответить
    • Сразу видно, что ты ебанутый. Ты перевёл «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-ов и сделать минимальные изменения
        Ответить
        • Да и так годно. Всё-равно интерполяция строк в скриптухе не ленивая.
          Формат-стринги удобны в логгерах, и прочих местах где не всегда нужно вычислять кокотенированую строку.

          А в каком месте происходит разбор и парсинг .ts?
          Ответить
          • https://github.com/ASDAlexander77/TypeScript2Cxx/blob/master/src/compiler.ts

            в этом файле. нужно получить команда compileSources и главный код ts.createProgram(sources, {})

            ты получаешь пропарсенные обьекты - const sourceFiles = program.getSourceFiles();
            дальше делай что хочешь
            Ответить
            • А где сам разбор синтаксиса typeScript, его грамматика?
              Ответить
              • https://github.com/ASDAlexander77/TypeScript2Cxx/blob/master/src/emitter.ts

                начни с процедуры public processNode(node: ts.Node): void
                Ответить
    • Просто замечательно!
      Ответить
    • Круто!
      Ответить
    • Как я понимаю, вместо tracing gc, используется reference counting (shared_ptr).

      Есть мысли как решить проблему утилизации «островков» циклических ссылок?
      Ответить
      • можно юзать gc для с++ https://www.hboehm.info/gc/
        Ответить
        • показать все, что скрытоvanished
          Ответить
        • Да, я тоже думал взять какую-то либу, строяющую граф.
          Получится гибрид как в 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

            Полная хуйня, имхо.
            Ответить
            • ▚▗▘▌▌▞▚
              ▗▚ ▝▌▙▜
              ▘ ▘▀ ▘▝
              Ответить
              • ▄▖ ▄                                                                                                                                  
                ▐█▌  ██         ▜███                                                                                                                                  
                 ██ ▐█▘          ▀▀▘                                                                                                                                  
                 ▝█▙█▛ ▝█▌  ▐█▘▐█  ██                                                                                                                                 
                  ▜██▘  ▜█  █▛ ▐█ ▟██                                                                                                                                 
                  ▐█▙   ▐█▖▗█▌ ▐█▗███                                                                                                                                 
                 ▗███▌   █▌▐█  ▐█▟█▐█                                                                                                                                 
                 ▟█▘██   ▜██▛  ▐██▌▐█                                                                                                                                 
                ▗█▛ ▝█▌  ▝██▘  ▐██ ▐█                                                                                                                                 
                ██   ▜█▖  ██   ▐█▘ ▐█                                                                                                                                 
                         ▗█▌                                                                                                                                          
                        ▄██▘                                                                                                                                          
                        ▀▀▘
                Ответить
                • .                    ▄ ▄       ▖                      ▗▖ ▗▄  ▄                                                                                         
                  ▐▌▗█▛               ▜▙█    ▐██▛                      ▝█▖▝█▌ ▜▌                                                                                        
                  ▐▙█▛ ▗▄▄▄ ▗▖▗▄▖▗▄▄▖ ▄▀▙▖   █▙▄▖ ▄▄▄▖ ▄▄▄▖ ▄▄▄ ▗▄▄▄    ▐▙ ▐█ ▝█                                                                                        
                  ▐██  ▝▀▀█ ▐▙█▀ █▛▜█ █▗█▌   █▛▜█ ▀▀▜▌ █▛▀▘▐█▀█▌▐█▀█▖   ▐█ ▝█  █                                                                                        
                  ▐▛█▌ ▐███▌▐██  █ ▝█ ███▌   █  █ ████ █▌  ▐▌ ▐▌▐▌ █▌   ▐█  █  █                                                                                        
                  ▐▌▐█▖█▌▗█▌▐▌█▙ █▖▐█ ██▐▌   █▖▗█▐█ ▟█ █▌  ▐▙ ▟▌▐▙ █▌   ▐█ ▗█  █                                                                                        
                  ▐▌ ▜▙▜███▌▐▌▝█▖▜██▛ █▘▐▌   ▜██▛▝████ █▌  ▝███▘▐███    ▐▛ ▐▛ ▗█                                                                                        
                                                                ▐▌     ▗█▘▗█▘ ▟▌                                                                                        
                                                                ▝▘     ▝▘ ▝▘  ▀
                  Ответить
      • показать все, что скрытоvanished
        Ответить
        • Да. В противном случае придётся течь по памяти (для короткоживущих скриптов приемлимо).
          Или вводить ограничения на разные классические структуры типа doubly linked list.
          Ответить
    • Можно для тупых, что это будет? По тестам не понял.
      Ответить
      • это будет с++ с человеческим лицом(т.к. синтаксисом)
        Ответить
        • трудно назвать тайпскрипт человеческим
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • легко вот так выглядит 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
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • вот тут я переделал код немного с 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 нет
                    Ответить
                  • для строчки или числа надо юзать или any или generic
                    Ответить
                  • вот пример

                    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 и ВК пишут компилятор из своего недоязыка в С++: у них много легаси говна на недоязыке, а он тормозит, и выбора у них нет.

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

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

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

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

              Хотя...

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

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

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

              Другой вариант -- взять Котлин.
              Он умеет компилироваться в JS (хуево) и в нативный код (через посредство llvm) (тоже очень хуёво).
              Ответить
          • Смотрите, что нашёл:
            https://ru.wikipedia.org/wiki/Хейлсберг,_Андерс

            Один и тот же человек изобрёл «Турбо Паскаль», «Delphi», участвовал в создании «MFC», «J++», «C#» и, наконец, придумал «TypeScript».
            Ответить
            • Мощный мужик. Во, уважаю, братишка!
              Ответить
              • J++ не нужен, остальные языки весьма полезные.
                Ответить
            • Это давно известно. МС его перекупила из багланда и устроила пилить .NET.
              Ответить
              • багланд сам виноват, что пиздой накрылся
                Ответить
            • MFC гавно
              Ответить
    • И нахуя ? Кто пишет на тсе что-то кроме фронта ? Как я эту дрисню в .html впихну ?
      Ответить
      • это скорее конкурент для либов и против node.js
        Ответить

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