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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    function main() {
        for (const q of [1, 12]) {
            print(q);
        }
    
        for (const l of "HW") {
            print(l);
        }
    
        print("done.");
    }

    продолжаем говнокодить компилятор для TypeScript (типа новый сабсет для native-ого кода)

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

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

    • результат работы и дамп

      C:\temp\MLIR_to_exe>out.exe                                                                                                                                                                                                                                                               1                                                                                                                                                                                                                                                                                         12                                                                                                                                                                                                                                                                                        H                                                                                                                                                                                                                                                                                         W                                                                                                                                                                                                                                                                                         done.
      Ответить
    • дамп забыл https://pastebin.com/gZjKCYJA
      Ответить
    • вот думаю написать readme и отправить его в светлое будущее.... кто нить подскажет что с ним можно сделать? (с проектом)
      Ответить
      • Добавить в резюме и гнуть пальцы, когда устраиваешься говнокодером: "мне делать было нечего, я компилятор написал..."
        Ответить
      • На гитхаб и статейку в бложик написать про рофлы в процессе разработки, чтоб гуглилось
        Ответить
      • Начинай пиариться. Напиши на швабру для начала.
        Ответить
      • Заставить фронтов на работе собирать тс твоим компилятором, обеспечить job security
        Ответить
        • не ты что... они без any жить не могут :)
          Ответить
          • А ты заимплементи!
            Ответить
            • смысл TypeScript-а и нативного кода теряется тогда
              Ответить
              • В крестах тоже есть std::any и даже reinterpret_cast, но это не делает типизацию бессмысленной в остальных местах.
                Ответить
                • >Implementations are encouraged to avoid dynamic allocations for small objects,
                  как же они его хранят? Выбирают "удачный размер" (допустим, 8 байт, чтоб указитель влез) и если влазит в него, то прямо и хранят, а так в куче?

                  А sizeof у него какой? Как у "удачного размера"?
                  Ответить
                  • gcc говорит что 16. Видимо 8 на тип и 8 на юнион.
                    Ответить
                    • А зачем такое может быть нужно? Чем это лучше шаблонов?
                      Звучит ведь как какой-то пхпизм прост
                      Ответить
                      • Х.з., я ни разу не юзала.

                        Обычно variant'а с конкретными типами хватает ну или интерфейса. Желания хранить в одной коллекции всё что угодно как-то не возникало...
                        Ответить
                        • можно подумать что ты там будешь хранить бесконечное кол-во типов. а в натуре только "value type" и "reference type" ... один передается копированием другой только ссылкой.
                          Ответить
                        • >интерфейса.
                          Так этож нужно по ссыкле тогда: не бесплатная абстракция!)
                          Ответить
                        • Какая-нибудь насквозь абстрактная очередь сообщений с value семантикой, куда любой модуль может насрать своим типом сообщений или попробовать обработать что-то своё.
                          Ответить
                          • Ну обычно в такое интом срут или указателем на void. Но тут есть какая-то проверка типа, да
                            Ответить
                            • > какая-то
                              Если не проверил тип и скастовал в неправильный — получи эксепшеном в щи.
                              Ответить
                              • Ну да, я понял

                                но мне всё равно немного неождианного видеть такую высокоуровневую херню в крестах
                                Ответить
                                • > высокоуровневую

                                  Лол. Ну в крестах по большей части всё типобезопасно. Динамик каст тоже исключениями кидается если ты его прижал к стенке и заставил кастовать ссылки, а не указатели.
                                  Ответить
                                  • Так дайнамик каст и RTTI вроде есть только у виртуальных питухов, а это вовсе не обязательно в крестах-то, чай не жава
                                    Ответить
                                    • RTTI есть у всего. В общем-то даже у инта ты можешь тайпинфо взять. Но для простых типов оно известно в компайлтайме. Поэтому линкер лишнее выкинет. Если ты не будешь этот тип в какое-нибудь std::any сувать.
                                      Ответить
                                      • >RTTI есть у всего.
                                        //
                                        struct Foo
                                        {
                                        	
                                        };
                                        Foo ci;
                                        void* a = &ci;


                                        а научи меня получить тип "*a" в рантаймме?
                                        RTTI же значит "рантайм тайп"
                                        Ответить
                                        • typeid(a). Но он будет экивавалентен typeid(void*), само собой.

                                          Т.е. RTTI есть у всего, но в рантайме оно резольвится только у классов с виртуальной таблицей.

                                          З.Ы. Именно поэтому any берёт typeid до каста в void* и хранит его отдельным полем.
                                          Ответить
                                          • >Т.е. RTTI есть у всего, но в рантайме оно резольвится только у классов с виртуальной таблицей.

                                            Иными словами информация о типе в рантайме есть только у виртукальных классов, верно?

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

                                              Просто для всех типов, где нет виртуальных таблиц, значение typeid очевидно для конпелятора и ему не надо лезть в таблицу. А то что ты там какой-то хуйни reinterpret cast'ом накастовал -- это твои личные проблемы.
                                              Ответить
                                              • Похоже, ты называешь словом "RTTI" возможность получить typeid. Мне казалось, что так называется именно структура в памяти, указывающая на тип (а она есть только у виртуальных классов)

                                                А например в питоне, джаве и сишарпе есть всегда
                                                Ответить
                                                • > Мне казалось, что так называется именно структура в памяти, указывающая на тип (а она есть только у виртуальных классов)

                                                  type_info существует для всех типов. Обычно ненужные type_info выкидываются линкером, но для полиморфных классов к которым когда-то применяли typeid их приходится хранить (потому что хрен знает, какой конкретно динамический тип там будет.)
                                                  Ответить
                                                  • Верно ли следующее утверждение: "Runtime type information is only exists in runtime if class is polymorphic"?
                                                    Это же какой-то пиздец)

                                                    Ладно, если я буду думать, что как-бы RTTI есть у всего, но потом линкер его просто выкинул, то это будет правильно?
                                                    Ответить
                                                    • > Runtime type information is only exists in runtime if class is polymorphic

                                                      Nope. Если ты взял typeid(int), то теперь в рантайме у тебя существует type_info, описывающее int.
                                                      Ответить
                                                      • А где это type_info хранится для инта? Или его на лету typeid создает?

                                                        Или для инта я могу только статически на самом деле ее получить, ведь инт не виртуален?
                                                        Ответить
                                                        • > хранится

                                                          Да глобалка обычная, вроде. Для простых типов typeid() просто раскрывается в ссылку на неё, для более сложных он лезет в таблицу виртуальных методов и достаёт ссылку оттуда (нулевой слот вроде). Вот и вся магия.
                                                          Ответить
                                                          • то есть где-то есть type_info для моей struct Foo {}, просто он не в виртуальной таблике (бо её там нет), теперь понятно
                                                            Ответить
                                                            • Попробуй скомпилить и посмотреть в отладчике:
                                                              std::cout << typeid(foo).name() << std::end;
                                                              У гцц там правда имя стрёмное будет, его придётся деманглить.
                                                              Ответить
                                                              • я думал, что он его в компайлтайме заинлайнит просто
                                                                Ответить
                                                                • Да может и заинлайнит, если только имя юзаешь... Структура же иммутабельная.
                                                                  Ответить
                                                                  • Но для неполиморфных типов всегда есть возможность type_info статически, в компайлтайме, так?

                                                                    Просто это может быть не обязательно.

                                                                    Ну типа

                                                                    if (someRandom()) {
                                                                    typeid(foo).name() // может, и нет смысла его инлайнить
                                                                    }
                                                                    Ответить
                                                                    • Ну решение про выкинуть/оставить обычно линкер принимает. А конпелятор инлайнить будет однозначно -- функция тривиальная же, в одну строчку.
                                                                      Ответить
                                                • > RTTI

                                                  RTTI -- это и есть механика, состоящая из typeid() и type_info. И структура type_info есть абсолютно у каждого типа (но ты не платишь за те типы, для которых ты её не берёшь).

                                                  За счёт этого ты и можешь проверить, что из std::any достаётся именно тот тип, который туда положили. Или можешь сделать какую-нибудь хешмапу из typeid в обработчик для нужного типа.
                                                  Ответить
                                                  • >но ты не платишь за те типы, для которых ты её не берёшь

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

                                                      Как-то так. Ты же её не получаешь документированными способами, а значит и потрогать не можешь.
                                                      Ответить
                                                    • Ты с компа отвечаешь?
                                                      Ответить
                                            • Стандарт разделяет статический и динамический тип выражения. Динамический можно получить только для типов удовлетворяющих определённым условиям.

                                              > RTTI
                                              В С++ это упоминается только в качестве кода для главы в которой описывается type_info и товарищи: support.rtti
                                              Ответить
                      • Можно представить какой-то "реестр", в который динамически загружаемые плагины могут складывать какие-то значения. При этом мы заранее не знаем, какие типы могут понадобиться плагинам.

                        std::map<std::string, std::any> globalSettings.
                        Ответить
                        • Я бы тогда хранил там указатель. Плагины пускай сами хранят свои данные в куче или в стат памяти

                          Хотя конечно если я хочу хранить там int, то переголова небольшая
                          Ответить
                          • Any всё-таки типобезопасное в отличие от void*. Там внутри тип хранится.

                            Ну и не надо самому городить касты.
                            Ответить
                            • Вот именно по этому я за скриптушню)
                              Ответить
                              • Если хочется скриптушни, у тебя всегда есть boost::lexical_cast<>.
                                Ответить
                                • Может, лучше луа прикрутить? Это типа пять строчек кода примерно
                                  Ответить
                                  • Ну не пять, всё-таки придётся немного бройлерплейта написать для публикации каких-то своих сервисов в луа.
                                    Ответить
                                    • переменные можно напихать через lua_setglobal вроде, а потом соьбрать значения со стека, но конечно если тебе не нужно из луа свой код вызывать
                                      Ответить
                                      • > если тебе не нужно из луа свой код вызывать

                                        Обычно всё-таки нужно какие-то свои объекты и функции скрипту дать. Иначе скучно ведь.
                                        Ответить
                                        • Я когда игрался с луа, я скармливал туда несколько переменных, скрипт их считал, потом я забирал результат.. мне хватало
                                          Ответить
                                  • Я смотрю ты адепт луа. Читаю книжку по луа, давай хвалить луа. Про основную структуру данных таблицы пока не вкурил, в чем понт, но портабельность и бридж в няшную пока что трушно сделаны, охуеть можно.
                                    Ответить
                                    • Таблицы легко вкурить, вот на метатаблицах можно немного застрять.

                                      А интеграция с няшной и песочница у луа самая простая из всей популярной скриптушни, наверное.
                                      Ответить
                                      • Я немного затупил на генераторах, помню: они там совсем ручные. А метатаблица это просто объект, которому делегируются какие-то вызовы.

                                        Можно например сделать такую таблицу, при обращении к окторой всегда возвращается число 32.

                                        И это позволяет юзать таблицы как универсальный такой интерфейс: функция ожидает нечто, в чем есть поле "foo", а поле может быть настоящим или програмным..
                                        Ответить
                                    • Торт фанат Луа.

                                      Основая структура проста тем, что она одна: нескалярный тип только таблица.
                                      Она может быть массивом, ассоц массивом, объектом или неймспейсом.

                                      Она имеет декларативный синтаксис, что позволяет описывать декларативно хош массив, хош ассоц массив.

                                      Собссно Lua это наследник языка Sol, как раз для описания конигфруаций и используемого.
                                      Ответить
                                    • Похвалил луа. У меня даже бумажное издание на полочке лежит 3 издания под lua 5.2
                                      Ответить
                                      • Про Луа вроде есть единственная книга, написанная самим Руберту
                                        Ответить
                                        • Не единственная. На каждую версию с 5.0 есть свое издание. Наверное штук 5 книг от самого Роберту. Ну есть и другие книги, только нахуя когда сам разработчик языка хорошо его описал и показывает в книге. Но есть конечно и такое на официальном сайте: https://www.lua.org/gems/
                                          Ответить
                                          • Да и язык не такой уж и сложный чтобы по нему сотни книг писать...
                                            Ответить
                                            • https://www.amazon.com/Advanced-Roblox-Coding-Book-Unofficial/dp/1721400079
                                              Ответить
                                          • Это одна книга, издания разные)

                                            Собссно, её и читал спиздив в Интернете
                                            Ответить
                                            • Пидор, а я вот поддержал разработчика и заказал с Амазона!
                                              Ответить
                                          • Есть от орейли книга по луа на примере непосредственно скриптинга для wow
                                            Ответить
                                • чего действительно не хватает, так это - boost::eval()
                                  Ответить
                          • Откуда ты знаешь юкрэйниан?
                            Ответить
                  • Кстати, если засунуть в std::any лямбду, то обратно её уже не вытащить
                    Ответить
                    • Маленьких лямбдочек лямбда-родители пугают жутким std::any, который утаскивает в себя няпослушных лямбд и някогда ня отдаёт нязад!
                      Ответить
                      • маленькой лямбдочке холодно зимой
                        из класса лямбдочку взяли мы домой

                        сколько на лямбдочке проперти цветных!
                        розовых уинтов, даблов золотых
                        Ответить
    • Если компилятор не написан на раст, можешь сразу забыть о его продвижении.
      Ответить
      • написан на LLVM - так пойдет :)?
        Ответить
      • С одной стороны да

        С другой -- там есть слово "javascript" (ну тайпскрипт, не важно), а значит он автоматически становится современным, актуальным, популярным, и ассоциируется с успешными стартапами в кремниевой долине
        Ответить
        • и сколько за последние пару лет в долине было актульных стартапов на жопаскрипе?
          Ответить
          • шслак?
            Ответить
            • > Запущен в тестовом режиме в августе 2013 года, публичный выпуск состоялся 12 февраля 2014 года

              - угу, прямо миф морозная свежесть
              Ответить

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