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

    −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
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    function* foo2() {
    	yield 2;
    	yield 3;
    }
    
    function* foo() {
       yield 1;
    
       yield* foo2();
    	
       yield 4;
    }
    
    function main() {
        for (const o of foo()) {
            print(o);
        }
    
        print("done.");
    }

    продолжаем "наговнокодить". Добавил "елдак" со "звездой". Где тут наши препроцессорописатели.. дайте аналог на C/C++.

    Запостил: ASD_77, 31 Августа 2021

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

    • Сракер
      Ответить
    • А где дампик и SEO-пост?
      Ответить
    • И что этот "едлак" со "звездочкой" делает? Не заебало еще высирать по говнокоду на какую-то маловажную и малоинтересную хуйню?
      Ответить
      • >что
        https://learn.javascript.ru/generators
        Ответить
        • https://wandbox.org/permlink/aqmURbit8xUDzpzU

          И нахуя это? У меня в контроллере такой хуйни нет, и я не очень-то понимаю, нахуя это надо. Но намакроебить можно, да
          Ответить
          • Корутины в современных языках используются для ленивости или для написания последовательного кода без использования потоков
            Ответить
            • > последовательного кода без использования потоков

              Задачки в духе "собери 1000 семплов с АЦП, зожми их и отправь по UDP" и без корутин норм смотрятся. А для чего-то более сложного и длинного можно и тред поднять, контроллеру не надо обрабатывать тыщи клиентов.

              З.Ы. Я сварщица не настоящая, возможно j123123 приведёт реальные примеры задач, где корутины ему бы помогли.
              Ответить
              • Не могу таких реальных примеров привести. Любая задача для контроллера, где можно было бы применять корутины, решается без корутин. Какого-то заметного профита в плане читаемости я не вижу.

                Это конечно может и т.н. "парадокс Блаба", но надо бы придумать и "парадокс антиБлаба", когда какую-то хуйню, типа вот какой-то малозначительный синтаксиальный сахарок привозносят как какую-то мегаохуенную фичу, из-за которого всем резко надо валить на этот принципиально новый ЯП.
                Ответить
                • > Любая задача для контроллера, где можно было бы применять корутины, решается без корутин.

                  Не, ну это логично. Просто сахарок для стейтмашины или файбера (смотря какая реализация).
                  Ответить
                • https://habr.com/ru/post/275801/
                  > Rust и парадокс Блаба

                  > Будучи руководителем проектов по языкам в Microsoft, я работаю над TypeScript – типизированной версией Javascript. В обязательном порядке, когда я выступаю перед аудиторией преимущественно JavaScript разработчиков и пытаюсь донести мысль о том, как здорово было бы попробовать добавить немного строгой типизации в Javascript, на меня смотрят хмурые лица. Всякий раз. Даже если она не обязательна. Даже после того как я опишу полдюжины преимуществ. Как и говорил Пол, это выглядит просто «странно». Для JavaScript-программистов TypeScript выглядит в основном тем же что и JavaScript, плюс куча стремной и непонятной фигни.
                  Ответить
                  • А если жаваскриптушкам показать лисп с гомоиконностью, они тоже скажут про кучу стремной и непонятной фигни?
                    Ответить
                    • в лиспе нужны только две функции: car и cadr. ну ещё map
                      Ответить
                • > малозначительный синтаксиальный сахарок привозносят как какую-то мегаохуенную фичу

                  При том что она очень чисто заворачивается реализуется Сишным свитчом и заворачивается в макрос.
                  Ответить
                • > Это конечно может и т.н. "парадокс Блаба"

                  Да не, не думаю...

                  Корутины -- это довольно нишевая хуй-ня: когда длинный алгоритм должен ждать каких-то ответов в куче точек, но при этом его нельзя взять и закинуть в тред (к примеру, потому что разрабы языка побоялсь давать обезьяне гранату или потому что вся прога будет состоять из этих закидываний в тред).
                  Ответить
                  • Первое что приходит на ум: всякие там бесконечные ленивые списки, их кобенации и кокотенации.

                    Реально это можно сделать несколькими способами: функционушнёй, тем же паттерном «Итератор», а можно нагородить елдак.
                    Ответить
                    • Это всё делается продолжениями без специального синтаксиса и макроёбства.
                      Ответить
                      • > Это всё делается продолжениями

                        Доказано node.js
                        Ответить
                        • Доказано Олегом.
                          Ответить
                          • Кстати, а в эрланге функции в безстековый CPS поди конпелируются, поэтому "процессы" такие дешёвые? Или у них всё-таки есть стеки?
                            Ответить
                            • Они компилируются в байткод регистровой VM. При загрузке байткода он либо превращается в шитый код, либо JITится*. Процессы дешёвые, потому что зелёные: на каждом физическом ведре работает планировщик (на самом деле джва), который исполняет процессы последовательно, с вытеснением на основе I/O и количества редукций. При вытеснении состояние регистров остаётся в сишной структурке до следующего запуска.
                              Нормальную вытесняющую многозадачность с помощью CPS сделать трудно, поэтому она сделана на уровне рантайма.

                              * JIT очень простой, и он переиспользует регистры VM, поэтому его можно особо не рассматривать.
                              Ответить
                    • Не... у этой хуйни стейт обычно слишком тривиальный.

                      Вот рекурсивный обход каких-то сложных и нерегулярных структур -- более менее реальный пример, когда мне реально хочется юзать генератор.
                      Ответить
                  • >нишевая

                    у нас в коко уже нет

                    Через корутины реализованы реактивные потоки (а-ля rxjs), аналоги акторов, и просто разные задачи, которые нужно делать параллельно, и при этом стопать их скопом или джойниться скором (g structural concurrency)

                    Треды нужны чтобы загрузить CPU. Делать 1000 тредов просто ради удобства обезъяны -- неудобно

                    Колбеками пусть мои враги пользуются и едят лапшу

                    Асинхронная питушня решает часть задач, но не все (ленивость и та же структурная конкранеси ей не подвласна)
                    Ответить
              • ну отправь мне в 10К сокетов по UDP что-то без корутин, а еще с делеем между каждой такой задачкой в 3 секунды

                чур не срать тыщу потоков и без ебли с еполоами и комплишен портами
                Ответить
                • > отправь

                  Эм, а что мне мешает захуйнуть 10к пакетов в сокеты и проспать оставшееся время?
                  Ответить
                  • Потому что тебе нужно послать пакет, поспать 3 сек, снова послать пакет в тот же сокет, итд

                    и сделать это с 10К сокетами
                    Ответить
                    • А какое условие в моём алгоритме нарушено? :)

                      Не, ну технически может получиться интервал чуть меньше 3с между отправками в один сокет. Это критично, надо прям гарантию что при лагах процесора можно больше 3с, но меньше -- никогда?
                      Ответить
                      • > чуть меньше
                        а можно не меньше 3с?

                        ну желательно не больше десяти

                        ах да, чуть не забыл: для одного из сокетов будет 8ск
                        Ответить
                        • Не, задача всё ещё тривиальна...

                          Я тупо возьму priority queue с сортировкой по времени и буду спать до head'а, а потом отправлять тех, чьё время пришло.

                          И хуй ты этот код побьёшь по пирфомансу своими корутинами.
                          Ответить
                          • Это усложнит код, а также если одна отправка воткнёт, то воткнут и все остальные, а это харам

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

                              В котлине корутины на тредпуле что ли крутятся, как в asio, зависание одной из них не лочит остальные?
                              Ответить
                              • Корутины крутятся на том пуле, на каком скажешь

                                Работа с сетью идет через пакет ktor, а он использует под капотом асинхронные сокеты

                                Если ты не трогаешь в корутинах блокирующие операции типа обычных сокетов или IO файлов, то остальные и не лочатся
                                Ответить
                                • > Если ты не трогаешь

                                  Ну т.е. компайлтайм гарантий никаких нету? Тогда нечестно писать "если одна отправка воткнёт", у тебя ситуация ничем не отличается.

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

                                    Но это задача для докторов компьютерных наук, а не для обычных жабоёбов

                                    >нечестно
                                    почему?

                                    У тебя буфер заполнится, и отправка встанет.
                                    А в случае асинхронности тебя верно вежливо попросят EAGAIN или как-то так

                                    >Вы просто не зовите блокирующие функции и ничего не заблокируется.


                                    Борманд, ну разумеется корутины нельзя блокировать

                                    Это же кооперативная многозадачность
                                    Ответить
                                    • > У тебя буфер заполнится

                                      Так мы уже плавно на TCP перешли?

                                      Что мне мешает тоже переключить сокет (один! нахуя мне их 10000 для UDP?) в неблокирующий режим.
                                      Ответить
                                      • У сокета есть буфер размером в SO_SNDBUF.
                                        Оно опорожняет его в сетевую карту

                                        Если он не успел это сделать, то

                                        * There are only two reasons for sendto() to block:

                                        Your outgoing UDP buffer is full, and it needs to wait until space frees up

                                        вторая не важна



                                        что не так?


                                        >один! нахуя мне их 10000 для UDP?

                                        например чтобы слать нескольким клиентам

                                        UDP сокет можно "коннектить". На самом деле это не коннект, но гарантия, что ты получишь ICMP о недоступности удаленного питуха
                                        Ответить
                                        • > что не так?

                                          Х.з., это к тебе вопрос... Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.

                                          > гарантия, что ты получишь ICMP

                                          Х.з., в UDP протоколах обычно хертбиты есть. Ну кто-то из нас получит таймаут если что-то со связью. Не вижу смысла коннектить сокет, усложнять логику и тратить ресурсы ядра на какую-то хуйню.

                                          Есть какая-то статья, где описаны реальные преимущества коннекта? Например, что так больше клиентов можно будет обработать или пирфоманс вырастет.
                                          Ответить
                                          • >Х.з., это к тебе вопрос...
                                            Ты триггернулся на буфер

                                            Я привел пример того, что в UDP тоже есть буфер)

                                            > Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.

                                            В няшной ты можешь сделать что угодно, вопрос в количестве кода и его "высокоуровневости"

                                            Неблокирующие сокеты из няшной скорее всего вернуть тебе EAGAIN или что-то такое при заполнении буфера, и попросят тебя попробовать снова

                                            Ты должен будешь сам это обработать.

                                            Либо ты сможешь взять select/poll/epoll, и слушать, когда сокет станет доступным для записи.

                                            В корутинах же ты пишешь так, словно бы ты в своем потоке, живешь, и спокойно блокируешься на вызове send (или как оно там называется)

                                            Под капотом там разумеется или неблокирующие сокеты или epoll, мне (как высокоуровневому питуху) это не важно.

                                            >Есть какая-то статья, где описаны реальные преимущества коннекта?

                                            https://it.wikireading.ru/7156

                                            >>>
                                            3. Асинхронные ошибки возвращаются процессу только при операциях с присоединенным сокетом UDP. В результате, как мы уже говорили, неприсоединенный сокет UDP не получает никаких асинхронных ошибок.
                                            >>>


                                            ---------
                                            на самом деле мой пример можно перевести и на TCP, если тебе удобнее.

                                            И даже на обычные генераторы, которые должны подождать N секунд, и что-то сделать

                                            В няшной пришлось бы делать ALARM или вон ебаться с очередями или плодить треды

                                            В корутинах достаточно сахара, чтобы писать последовательно

                                            Неблокирующая функция `delay` передает управление другой корутине, но для программиста выглядит как slepp
                                            Ответить
                                            • > Ты должен будешь сам это обработать.

                                              Сделать вид, что всё ушло и забить? Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета, а не просто выбрасывает его и возвращает корутине ошибку.

                                              Что касается connect'а -- это же чисто клиентская фишка. Я же не буду зашкваривать серверный сокет под конкретного клиента. И заводить новый под каждого тоже будет как-то странно.
                                              Ответить
                                              • >Сделать вид, что всё ушло и забить?
                                                нет, попробовать снова

                                                >Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета,

                                                хм, а в чем проблема так делать?

                                                Если она умеет делать это для TCP, то почему не делать для UDP?

                                                >Что касается connect'а -- это же чисто клиентская фишка.
                                                > Я же не буду зашкваривать серверный сокет под
                                                > конкретного клиента.

                                                connect будет создавать новый сокет, конечно

                                                но не понятно, почему нашему гипотетическому серверу это не сделать

                                                архитектуры бывают разные)

                                                > И заводить новый под каждого тоже будет как-то >странно.

                                                Если ты хочешь получать ICMP о недоступности клиента то вполне можно так делать

                                                Но вообще мы ушли куда-то не туда кмк)

                                                Корутины позволяют тебе писать последовательный код, используя вместо настоящих блокирующих функций -- специальные не блокирующие

                                                Код выглядит последовательно, как если бы ты каждую корутину запускал в отдельном процессе

                                                Причем в котлине они образуют "дерево", где родитель неявно ждет всех своих детей, и можно стопнуть родителя с детями одновременно

                                                Открыл Activity в Андроиде -- запустилось 10050 корутин (на одном потоке), каждая инкапусилует какую-то задачу

                                                Закрыл активити -- все стопнулись
                                                Ответить
                                                • > почему не делать для UDP

                                                  Немножко испортит работу протоколов, в которых тайминги важнее тухлятины...

                                                  > connect будет создавать новый сокет, конечно

                                                  Шта?!
                                                  Ответить
                                                  • >Немножко испортит работу протоколов, в которых тайминги важнее тухлятины...


                                                    Ты же не знаешь что у нас за гипотетический протокол)

                                                    >Шта?!
                                                    ты не можешь присоединить сокет к двум адресам, так?

                                                    стало быть нужно создать по сокету на клиента и каждому сделать connect, не?

                                                    зы: я наверное написал так, что прочиталось будто `connect` создает сокет)))

                                                    Это не так, конечно. Сокет создает `socket`, и вероятно кишки `accept`
                                                    Ответить
                                                    • > Ты же не знаешь что у нас за гипотетический протокол)

                                                      Практика показывает, что на UDP все протоколы такие... Нет никакого смысла ретраить тухлятину и задерживать из-за неё все последующие пакеты. Не влезла в полосу -- значит не влезла.

                                                      > я наверное написал так, что прочиталось будто `connect` создает сокет)))

                                                      Ага.
                                                      Ответить
                                                      • А если я хочу реализовать последовательную гарантированную доставку, но TCP мне не нравится, и я пилю свое говно, как гугл?

                                                        Да и почему сразу тухлятину?
                                                        Если буфер заполнен, то почему я не могу подождать и послать еще?
                                                        Это же UDP, это же не у принимающей стороны буфер заполнен (мне похуй на нее, я может вообще мультикаст) это у меня буфер заполнен
                                                        Ответить
                                                        • > А если я хочу реализовать последовательную гарантированную доставку

                                                          Дык она у тебя уровнем выше будет. А кишки реактора не должны принимать это решение за тебя (если ты явно не попросил).
                                                          Ответить
                                                          • Ktor должен вести себя максимлано близко к блокирующим сокетам

                                                            Что будет если я пишу в сокет, а буфер забит?
                                                            Будет блокировка треда, верно?

                                                            Вот было бы логично ждать что и ktor сэмулирует такое поведение
                                                            Ответить
                                                            • > максимлано близко к блокирующим сокетам

                                                              Ну ок. А неблокирующие можно попросить?

                                                              > почему я не могу подождать и послать еще

                                                              Потому что у тебя на выходе уже огромная очередь, которая не успевает высираться в провод. И вместо того чтобы отдать приоритет свежим, актуальным пакетам, ты продолжаешь пытаться спасти старые, менее актуальные.
                                                              Ответить
                                                              • >Ну ок. А неблокирующие можно попросить?

                                                                Могу, но зачем мне тогда корутины?
                                                                Я тогда могу на одном треде срать в 1000 сокетов обычным циклом. Если запись вернет EGAIN, то я просто дальше пойду, и всё.
                                                                Корутины будут не нужны

                                                                >свежим, актуальным пакетам

                                                                Типа раз я взял UDP, то обязательно семантика такова, что проебать старый пакет не так страшно, как тормознуть новый?
                                                                Ответить
                                                                • > раз я взял UDP, то обязательно семантика такова, что проебать старый пакет не так страшно, как тормознуть новый

                                                                  Х.з., возможно у меня синдром утёнка. Можно Снаута спросить.
                                                                  Ответить
                                                                  • Что спросить? Ну да, UDP используется обычно либо как борманд предполагает, либо кем-то очень высоколобым, как база для запиливания своего царского транспортного протокола a la QUIC. На этом уровне использовать елды или нет — уже проблема десятая.
                                                                    Ответить
      • mootools
        Ответить

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