ЙажаСценарий / Говнокод #27476 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
function main() {

    let a = 10;

    function f() {
        print(a);
    }

    f();

    print("done.");
}

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

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

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

    • для особо ленивых выложу три важных строчки

      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.");
    }

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

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

                  ну такое
                  Ответить
                    • Есть языки, где можно вернуть массив, а в си всякое такое говно надо учитывать:)

                      В ЯПах с ГЦ всё равно нужно думать про память, иначе ты случайно зацепишь объект за какую-то мелкую хуйню с долгим временем жизни, и на этом объекте, как на сопле, повиснет огромный граф, и ты будешь потом разбирать мемори дампы с 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" вполне возможно вывести типы. Само собой, в этом подмножестве не будет eval() и всяких $$name.
      Ответить
    • нахрена если есть javascript? мне нужен качественный говнокод а не говнокод говнокодов...
      Ответить
          • TS - не более чем говнонадстройка над JS. Фундамент-то всё равно гнилой.

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

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

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

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

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

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

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

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

                Ну, кто-то же запилил \sout{``BuckleScript''} ``ReScript''.
                Ответить
          • P.S. Да, у меня бомбит от перегруженного оператора при динамической слабой неявной типизации. Это флеш-рояль хуёвости.
            Ответить
                • Нет, но система типов не даст тебе их смешать и не пропустит 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;                                   // увеличиваем угол пропорционально скорости
                }
    Ответить
    • Погоди, то есть, чем быстрее машинка двигается, тем быстрее она поворачивает? И при достаточной скорости можно сделать разворот на 360° на пятаке?
      Какая физика.
      Ответить
      • в данной модели не учтены специфики Пространства-Времени. машина не верно движется при скорости 500 000 км в час.
        Ответить
    • Как ты попал в этот тред? Ты что-то сегодня часто мимо оффтопов промазываешь.
      Ответить
      • Походу пишет в тред, который оказался на вершине стека.
        Ответить
        • Стек машина. С многопоточностью, но без потокобезопасности.
          1) Убеждаемся, что на вершине стека тред, в который хотим написать
          .
          .
          .
          2) Пишем в тред на вершине стека.
          Ответить
          • то есть вы хотите, чтобы я блокировал всех вас между пунтками 1 и 2? Или чтобы я отрастил себе такую реакцию, чтобы это было атомарной процедурой?
            Ответить
      • Он саботирует перекаты. Скоро в игнор пойдёт.
        Ответить

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

Где здесь C++, guest?!

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


    8