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

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    function main() {
    
        let a = 10;
    
        function f() {
            print(a);
        }
    
        f();
    
        print("done.");
    }

    С виду этот простой кодик - это то что не может С и я так долго трахался что бы смочь его проимлементировать.... но я бля сделал

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

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

    • вот тут выложил дампик... https://pastebin.com/6zryirGb а еще пришлось внедрять "выполнить код" в "стеке" ... вот это поворот :)
      Ответить
      • для особо ленивых выложу три важных строчки

        call void @llvm.init.trampoline(i8* %5, i8* bitcast (void ({ i32* }*)* @f to i8*), i8* %6)
          %7 = call i8* @llvm.adjust.trampoline(i8* %5)
          call void @__enable_execute_stack(i8* %7)
        Ответить
        • > trampoline
          > execute stack

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

          А зачем? Почему бы не классическое context + function, как во всей скриптушне и даже в крестах? Тебе же не нужно передавать твои функции в настоящие сишные функции, которые 50 лет назад написаны?
          Ответить
          • мне нужно получить указатель на функцию с контекстом что бы можно было работать с указателями на функцию в унифицированной форме. а не таскать метод и данные в структуре
            Ответить
            • Дык унифицируй функцию как указатель на функцию + указатель на контекст. Ну или как указатель на контекст, в котором лежит указатель на функцию. Это же твой язык, ты не обязан под сишку подстраиваться.
              Ответить
              • ну да я думал об этом.
                Ответить
                • В общем-то даже в сишке зачастую тащут функцию + контекст:

                  void foo(void (*callback)(void *ctx), void *ctx);

                  Либы, которые не дают прокинуть контекст, это обычно что-то из 60х.
                  Ответить
                  • о, мы как раз с тобой недавно пиздели про реализацию лямблий в крестах
                    Ответить
          • да к сведению в шаге оптимизации если нам не надо чистый указатель на функцию с контекстом, то оптимизатор сделает такой же код как у "С++ лямбды" и не будет бaгора с "трамполином" :) Но это я пока сейчас пишу такую фичу
            Ответить
    • изобретаешь замыкания для сишки?
      Ответить
      • не то что бы придумую - это как бы до меня все придумали я просто юзаю :)
        Ответить
    • Приведи пример того, что твой компилятор пока не умеет.
      Ответить
      • много чего. классы и интерфейсы. пока у меня только то что может С делать
        Ответить
      • try/catch пока не работает т.к. LLVM (багор) не проимплементили это еще. а самому хак писать пока обломно, но будет
        Ответить
    • «Nim» такое тоже умеет, к слову.

      А какой тут лимит вложенности функции? Перформансная ли у тебя имплементация?
      Что выведет вот такой код:
      let a = 100;
      function main() {
      
          let a = 10;
      
          function f() {
              print(a);
          }
      
          f();
      
          print("done.");
      }

      ?
      Ответить
      • тот же результат что и в первый раз. а локальная то находится "ближе" :)
        Ответить
      • перформанс такой как и у C++ "[&] () {}" + чуть чуть времени на __enable_execute_stack
        Ответить
        • > enable execute stack

          Половина работы сделана, злоумышленнику остаётся буфер где-нибудь переполнить и хуйнуть свой код поверх трамплина.
          Ответить
        • В системах с W^X не запустится небось
          Ответить
    • все... нет больше трамполина :) оптимизатор убирает его за ненадобностью :)
      Ответить
    • > С виду этот простой кодик - это то что не может С

      GNU C это как раз может. https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

      И там тоже код в стеке выполняется.
      Ответить
      • это гнус. все остальные игнорят такую фичу
        Ответить
        • Это не особо-то и нужная на практике фича. Тем более что она требует исполняемого стека, а это небезопасно и анскильно.
          Ответить
          • правильно, можно перейти на С++, и там захватывать что угодно объектами или лямбдами
            Ответить
            • Советую перейти на "PHP". Там всё проще.
              Ответить
              • В С++ лямбды появились раньше, чем в PHP.
                Потому что C++ более простой, удобный, и надёжный язык
                Ответить
                • > Потому что C++ более простой, удобный, и надёжный язык

                  Про говноограничения захватываний хуйни в лямбду/объект из-за отсутствия GC я уже где-то обсуждал с PolinaAksenova
                  Ответить
                  • Это про "а вдруг лямбда проживет дольше, чем объект, на которого она ссылку захватила"?

                    ну такое
                    Ответить
                    • Есть языки, где ты о такой хуйне не думаешь. А в крестах надо всякое такое говно учитывать

                      https://govnokod.ru/27340#comment621510
                      Ответить
                      • Есть языки, где можно вернуть массив, а в си всякое такое говно надо учитывать:)

                        В ЯПах с ГЦ всё равно нужно думать про память, иначе ты случайно зацепишь объект за какую-то мелкую хуйню с долгим временем жизни, и на этом объекте, как на сопле, повиснет огромный граф, и ты будешь потом разбирать мемори дампы с OOMами

                        Я бы хотел, что бы в джавке можно было явно указывать, что ты захватываешь
                        Ответить
                  • В крестах лямбда реализована тупо анонимным классом с единственным методом. cppinsights это показывает.
                    Ответить
                    • есть ООП-языки, где лямбда реализована по-другому?
                      Ответить
                      • думаю в пиздоне не так, но это не точно
                        Ответить
                      • Если у тебя в языке first-class functions, оборачивать в класс не нужно, достаточно анонимной функции.
                        Ответить
                        • контекст прикрутить еще, ну или карнуть как нить
                          Ответить
                          • А если у тебя функции — это объекты, можно контекст прямо в них пихать (к комменту про питон)
                            Ответить
                        • и чем это будет под капотом отличаться от класса?
                          Ответить
                          • Если потыкать палочкой, то она не будет являться инстансом никакого класса, будет активно утверждать, что она функция... В зависимости от языка может ещё какие отличия будут. В питоне, например в классе ещё передасться нахер не нужная ссылка на объект.

                            Это как спрашивать, чем класс отличается от кучки данных и свободных функций под капотом.
                            Ответить
                            • > она не будет являться инстансом никакого класса

                              - а в крестах будет утверждать, что она типа анонимный класс?
                              Ответить
                              • Да, у самой лямбды typeid — класс с каким-то implementation-specific названием. У этого класса перегружен оператор(). Если посмотреть асм в месте вызова, то по name_manglingу будет видно, что это метод, и даже к какому классу он относился.
                                Ответить
                              • Да, причём каждая лямбда имеет уникальный тип.
                                #include <type_traits>
                                #include <iostream>
                                
                                int main()
                                {
                                    auto f1 = []{};
                                    static_assert(std::is_class_v<decltype(f1)>);  // Тут
                                    
                                    auto f2 = []{};
                                    
                                    std::cout << typeid(f1).name() << std::endl
                                        << typeid(f2).name() << std::endl;
                                        
                                    /*
                                    Образец вывода:
                                    
                                    Z4mainE3$_
                                    Z4mainE3$_1
                                    
                                    */
                                }
                                Ответить
                      • У меня в ``ФП'' никаких ``классов'' нет.
                        Ответить
                        • хотел бы посмотреть, как Снаут сдавал на права

                          – Что означает этот сигнал светофора?
                          – У меня в ФП никаких светофоров нет!
                          Ответить
                          • семафоры же есть
                            примитив синхронизации
                            Ответить
                            • Всё ещё путаешь светофор и семафор?
                              Ответить
                              • кстати, а чем они отличаются?
                                В старом winobj семафоры как светофоры вроде бы рисовались
                                Ответить
                                • Погугли
                                  Ответить
                                • Назначением. Ну и семафоры когда-то были без лампочек.
                                  Ответить
                                  • В фильмах с Чаплиным я видел как вместо светофоров в городе были такие палочки "walk" и "don't walk", и они были механические тоже. Почти как семафоры
                                    Ответить
                                  • На ЖД назначение у них абсолютно одинаковое, разница в имплементации
                                    Ответить
                                  • А, ты тоже путаешь, сорян))
                                    Ответить
                                  • Согласно ИСИ (инструкции по сгнилизации) светофоры с лампочками, семафоры — механическая фигня. Назначение одинаковое.

                                    Вроде раньше у семафоров были дополнительные сигналы для маневровых работ, которые в светофорах реализовывать не стали.

                                    В СНГ на маневровых светофорах оставили всего три сигнала: красный — закрыто, белый — разрешены маневровые работы, синий — маневровые работы запрещены, потому что блок-участок зарезервирован под маршрут.
                                    Ответить
                        • Ой да ладно, тайпклассы и LSP правила их подстановки есть ведь. Вместе со всей ковариантностью и контравариантностью, которую джава из ФП позаимствовала.
                          Ответить
            • В "Cи" я могу и в структуры всякую хуйню захватывать, если сильно надо.
              Ответить
              • угу, и даже покласть в них указатели на функцию. Не забывай только передавать туда указатель на структуру, и будут почти объекты:)
                Ответить
              • а я на ассемблере что хочешь делать могу даже в реестры записывать а не лямбы... но только вопрос какая скорость программирования такого говнокода?
                Ответить
          • > не особо-то и нужная на практике фича

            Она ещё и кривая, т.к. thunk'и на стеке и вернуть такую "лямбду" нельзя. Можно только на время в какой-то алгоритм передать.
            Ответить
    • В порядке бреда. Может напишешь компилятор для "PHP"?
      Ответить
      • Я обосрался, там же не стат типизация :(((
        Ответить
      • > В порядке бреда.

        Почему бреда? Пашкины олимпиадники ведь написали. Для какого-то подмножества "PHP" вполне возможно вывести типы. Само собой, в этом подмножестве не будет eval() и всяких $$name.
        Ответить
      • нахрена если есть javascript? мне нужен качественный говнокод а не говнокод говнокодов...
        Ответить
        • JS и PHP примерно одинаковы по хуевости, имхо.
          Ответить
          • JS да, а TS нет

            Ну и коммунити всё таки чуть лучше
            Ответить
            • TS - не более чем говнонадстройка над JS. Фундамент-то всё равно гнилой.

              Можно сделать похожую говнонадстройку над PHP и назвать его допустим TypeHP, но хуевого фундамента это не исправит.

              Для всякой типопитушни есть более нормальные языки, Standard ML или там OCaml например, где не встраиваются во всякое говно
              Ответить
              • так тебе не нравится не система типов, а библиотека? или что именно?
                Ответить
                • Мне не нравится что делают всякие компилируемые-в-JS поебени, которые с этим JS сохраняют какую-то там говносовместимость.

                  Нет чтобы нормальный язык сделать без хуйни, чтоб через WASM там работало
                  Ответить
                  • Иначе его никто не будет использовать, увы
                    Ответить
                    • Предлагаю тогда PHP компилировать в JS, чтобы ротоёбы могли писать фуллстек питушню.

                      Или вообще встроить во все браузеры PHP-виртуальную машину
                      Ответить
                      • ты не повериш:
                        https://phpjs.hertzen.com/

                        К сожалению почти всё, чем мы сейчас пользуемся в вебе, создавалось как наколенное говно, которое потом внезапно выстрелило, и пришлось этим жить: IBM PC, скриптовые языки, HTML...
                        Ответить
                  • мой компилятор может в WASM :)
                    Ответить
              • Ты представляешь себе фронтендера, который пишет на ML?

                TS хоть и с типушнёй, но он привычен JS'нику. Нужно всего лишь научиться расставлять типы.
                Ответить
                • Мне непонятно, нахуй это еще и компилировать в натив, если есть уже нормальные компилируемые языки с типами?

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

                    Ну чтобы по аналогии с нодой хуячить весь фуллстек на одном языке.
                    Ответить
                  • потому что я люблю Си и С++ но ненажижу * и & ... поэтому я решил исправить этот недочет в мире
                    Ответить
                    • #define ☆ *
                      #define ᚨ &

                      И тебе не придётся смотреть на * и & в исходниках.
                      Ответить
                      • #define VAL(x) ({*(x);})
                        #define ADDR(x) ({&(x);})
                        #define PTR_T(x) typeof(typeof(x) *)
                        #define DEREF_T(x) typeof( ({typeof(x) DEREF_T; *DEREF_T;}) )


                        https://wandbox.org/permlink/eOv9VurkOGg5FPiD
                        Ответить
                • > Ты представляешь себе фронтендера, который пишет на ML?

                  Ну, кто-то же запилил \sout{``BuckleScript''} ``ReScript''.
                  Ответить
          • JS оказался хуёвее из-за перегруженного плюса .
            Ответить
            • P.S. Да, у меня бомбит от перегруженного оператора при динамической слабой неявной типизации. Это флеш-рояль хуёвости.
              Ответить
              • Именно потому я за TS
                Ответить
                • Как в TS кокококонкатенация отличается от сложения?
                  Ответить
                  • Нет, но система типов не даст тебе их смешать и не пропустит 2 + "3" (я надеюсь).
                    Ответить
                    • На самом деле даст, лол)

                      Но ты явно получишь строку.

                      На JS ты можешь серануть так:
                      "use strict";
                      const a = "2"; //ой-ой, тут случайно строка, а не число пришло
                      const b = 2;
                      if (a + b === 4) {
                              console.log("yes");
                      }

                      и охуеть

                      А в TS ты получш
                      1.ts:3:5 - error TS2367: This condition will always return 'false' since the types 'string' and 'number' have no overlap.
                      
                      3 if (a + b === 4) {
                            ~~~~~~~~~~~
                      
                      
                      Found 1 error.
                      Ответить
                  • Никак не отличается, но см коммент борманда
                    Ответить
    • 2021-й год, лето
      Людей учат джаваскрипту
      https://habr.com/en/post/563914/
      var current_rotation = 100.0;                                           // Текущий угол поворота машинки
              var speed = 0.0;                                                        // Текущая скорость машинки
              var x = 135;                                                            // Положение машинки на карте
              var y = 300;
              document.onkeydown = checkKey;                                          // Устанавливаем обработчик
                                                                                      // клавиатурных событий
              function checkKey(e) {
                  var car = document.getElementById("car");                           // Получаем div с машинкой
                  e = e || window.event;
                  if (e.keyCode == '38') {				                            // Кнопка вверх
                      speed += 1;                                                     // увеличиваем скорость
                  }
                  else if (e.keyCode == '40') {                                       // Кнопка вниз
                      speed -= 1;                                                     // уменьшаем скорость
                  }
                  else if (e.keyCode == '37') {                                       // Кнопка влево
                     current_rotation -= 2 * speed;                                   // уменьшаем угол пропорционально скорости
                  }
                  else if (e.keyCode == '39') {                                       // Кнопка вправо
                     current_rotation += 2 * speed;                                   // увеличиваем угол пропорционально скорости
                  }
      Ответить
      • > '40'
        какой сканк-код
        Ответить
      • Погоди, то есть, чем быстрее машинка двигается, тем быстрее она поворачивает? И при достаточной скорости можно сделать разворот на 360° на пятаке?
        Какая физика.
        Ответить
        • это наверное угловой моментум
          Ответить
        • в данной модели не учтены специфики Пространства-Времени. машина не верно движется при скорости 500 000 км в час.
          Ответить
      • Как ты попал в этот тред? Ты что-то сегодня часто мимо оффтопов промазываешь.
        Ответить
        • Походу пишет в тред, который оказался на вершине стека.
          Ответить
          • Стек машина. С многопоточностью, но без потокобезопасности.
            1) Убеждаемся, что на вершине стека тред, в который хотим написать
            .
            .
            .
            2) Пишем в тред на вершине стека.
            Ответить
            • то есть вы хотите, чтобы я блокировал всех вас между пунтками 1 и 2? Или чтобы я отрастил себе такую реакцию, чтобы это было атомарной процедурой?
              Ответить
        • Он саботирует перекаты. Скоро в игнор пойдёт.
          Ответить

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