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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    async function f()
    {
    	print("Hello World");	
    }
    
    function main()
    {
    	await f();
    }

    Ну что заскучились... есть новость... первый async/await ... так что с почином - асинков. но это только начало ... Для любознательных дампик... https://pastebin.com/rwnsrdLx (для SEO https://github.com/ASDAlexander77/TypeScriptCompiler) и результат работы

    C:\temp>C:\dev\TypeScriptCompiler\__build\tsc\bin\tsc.exe --emit=jit --shared-libs=C:\dev\TypeScriptCompiler\__build\tsc\bin\TypeScriptGCWrapper.dll --shared-libs=C:\dev\TypeScriptCompiler\3rdParty\llvm\debug\bin\mlir_async_runtime.dll C:\temp\1.ts  
    Hello World

    Запостил: ASD_77, 04 Сентября 2021

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

    • без коментов
      Ответить
    • че за нах? коменты работают?
      Ответить
    • >первый async/await ... так что с почином - асинков

      В Си никаких await/async нет.

      Именно поэтому я за «Си».

      Зато есть (e)poll или kqueue
      Ответить
    • Какой классный, восхитительный пост. Такой хуйни даже в «Nim» нет, наверное!
      Ответить
      • https://en.wikipedia.org/wiki/Async/await

        > The feature is found in C# 5.0, C++, Python 3.5, F#, Hack, Julia, Dart, Kotlin 1.1, Rust 1.39,[1] Nim 0.9.4[2] and JavaScript ES2017, with some experimental work in extensions, beta versions, and particular implementations of Scala.[3] It is also planned for Swift.

        https://govnokod.ru/25005#comment436351
        Ответить
        • Ого, какой «Nim», всё-таки, крутой и многогранный, мой любимый ЯП!

          > https://govnokod.ru/25005#comment436351

          Thread support for Nim.

          Note: This is part of the system module. Do not import it directly. To activate thread support you need to compile with the --threads:on command line switch.

          Nim's memory model for threads is quite different from other common programming languages (C, Pascal): Each thread has its own (garbage collected) heap and sharing of memory is restricted. This helps to prevent race conditions and improves efficiency. See the manual for details of this memory model.

          import locks
          
          var
            thr: array[0..4, Thread[tuple[a,b: int]]]
            L: Lock
          
          proc threadFunc(interval: tuple[a,b: int]) {.thread.} =
            for i in interval.a..interval.b:
              acquire(L) # lock stdout
              echo i
              release(L)
          
          initLock(L)
          
          for i in 0..high(thr):
            createThread(thr[i], threadFunc, (i*10, i*10+5))
          joinThreads(thr)
          
          deinitLock(L)
          Ответить
          • Что, и никто не обосрёт «Nim» за запуск GC на каждый из тредов и за нерасшариваемую память между тредами?

            И правильно, ведь я обязательно нагуглю какую-нибудь пижню и все аргументы луддитов-лалок разлетятся в щепки, доказывая, что за «Nim» будущее.
            Ответить
            • Обсиранию неинтересного мне языка я предпочту очередное напоминание о существовании гениального в своей простоте и монструозного в своих возможностях PHP. Там нет ни тредов, ни памяти, ни асинков, ни аваитов - только предельно понятный и безгранично продуктивный код.

              PHP - выбор белого человека.
              Ответить
            • а чем это лучше отдельных процессов тогда?
              Ответить
              • Ну видимо шарить всё-таки можно, но аккуратно и явно.
                Ответить
                • Корова-то работает?

                  Вообще лучше конечно не шарить, а акторить: принимать по каналу сообщения, и обрабатывать

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

                    Ну это так, гипотеза. Я вообще понятия не имею что за язык.
                    Ответить
                  • Каналы там, кажется, есть!
                    Ответить
                • Да, ты прав. Ещё там есть ГЦ, который позволяет шарить кучу.
                  Ответить
            • как вы все до сих пор не понимаете простую истину... сделать можно все во всех языках. вопрос только в том как быстро ты это можешь там сделать....
              Ответить
              • А еще в том, как быстро это будет работать, будучи скомпилированным или проинтерпретированным компилятором или интерпретатором соотв. языка

                А еще некоторые вещи ты ни на чем кроме асма не сделаешь
                Ответить
                • ну давай сравним код в c++ и с#

                  class s {}; for (int i = 0; i < 1000000; i++) auto s1 = new s();

                  догадываешься кто выиграет ?
                  Ответить
                  • >> сравним код в c++ и с#
                    >>j123123

                    > догадываешься кто выиграет ?

                    «PHP»?
                    Ответить
                    • не знаю. но думаю что только не С++ :)
                      Ответить
                      • > только не С++ :
                        class s {}; 
                        void kakoi_bagor(){
                            for (int i = 0; i < 1000000; i++) auto s1 = new s();
                        }
                        
                        kakoi_bagor():                       # @kakoi_bagor()
                                ret
                        Ответить
                        • Оптимизатор догадался, что значение теряется, поэтому создавать ничего не стал? Типа ленивые вычисления?
                          Ответить
                          • Оптимизатор догадался, что код бессмысленное, анскильное говно и просто проигнорил его.

                            Ничего другого я не ожидал.
                            Ответить
                            • Хм, странно, раньше gcc вроде не удалял функции с сайд-эффектами...

                              Видимо таки разрешили забивать хуй на сайд-эффекты от new и delete.
                              Ответить
                            • З.Ы. А как теперь писать тест на OOM? Связывать выделенные блоки в список, чтобы не оптимизнуло?
                              Ответить
                              • На ассемблере.
                                Ответить
                                • Походу да... Список тоже не помогает если его потом не юзать.
                                  Ответить
                                • На «Nim» можно просто отключить «GC». Потому что компилятор «Nim» не считает себя умнее программиста, как и должно быть.
                                  Ответить
                              • Нет. auto volatile s1 проверь.

                                Магическое слово «volatile» запрещает делать предположения о потоке данных, следовательно, отключает оптимизацию.
                                Ответить
                                • А как ещё можно?

                                  Можно выделить парочку векторов на стеке, а потом в них пихать питухов, созданных в куче?
                                  Ответить
                                • > запрещает

                                  Скорее просто считается сайд-эффектом. А сайд-эффекты пока удалять и переставлять местами нельзя.

                                  З.Ы. Вон new и delete уже перестали считать сайд-эффектом.

                                  Робот не может причинить вред человеку.
                                  Ответить
                                • Кстати забавно, что он даже перегруженные new удаляет если в них нет чего-то своего помимо malloc.

                                  Т.е. они именно эффекты от malloc заигнорили, походу.
                                  Ответить
                                  • Хотя по с++14 вроде как и перегруженные имеет право выкинуть если получается сделать всё на стеке или в регистрах. Но тогда уже пару new + delete надо.
                                    Ответить
                                    • Пару из new + delete он тоже имеет право выкинуть:
                                      #include <iostream>
                                      #include <cstdlib>
                                      
                                      struct Foo {
                                          Foo(int x): x(x) { }
                                          
                                          void bar()
                                          {
                                              std::printf("%d\n", x);
                                          }
                                          
                                          int x;
                                      };
                                      
                                      int main()
                                      {
                                          auto foo = new Foo(42);
                                          foo->bar();
                                          delete foo;
                                          return EXIT_SUCCESS;
                                      }

                                      https://gcc.godbolt.org/z/Kz87xcr8W
                                      .LC0:
                                              .string "%d\n"
                                      main:
                                              sub     rsp, 8
                                              mov     esi, 42
                                              mov     edi, OFFSET FLAT:.LC0
                                              xor     eax, eax
                                              call    printf
                                              xor     eax, eax
                                              add     rsp, 8
                                              ret
                                      Ответить
                                  • Вроде как выделение памяти и всю питушню связанную с управлением памятью заявили ненаблюдаемым эффектом.
                                    Пока что компилятор не умеет определять, что из пользовательского кода относится к управлению памятью, а что к другим операциям. Иначе он бы и пользовательскую хуйню вроде арен и прочих специализированных аллокаторов бы выкидывал по возможности.
                                    Ответить
                          • Он вообще очень умный.
                            https://govnokod.ru/27581#comment658921

                            Хотя в данном случае for(;;) auto s1 = new s(); превратился в
                            kakoi_bagor: jmp kakoi_bagor
                            Ответить
                        • а такой код прооптимизируешь?
                          #include <iostream>
                          #include <cstdlib>
                          
                          class S {
                          	public: int j;
                          };
                          
                          void push(S *s)
                          {
                          	static S *ss;
                          	ss = s;	
                          }
                          
                          int main()
                          {
                          	for (int i = 0; i < 1000000; i++) { auto s = new S(); push(s); }
                          }
                          Ответить
                          • Лол, от этой херни gcc тоже ничего не оставил.
                            Ответить
                            • я его кинул

                              я обманул это ггс-говно

                              #include <iostream>
                              #include <cstdlib>
                              
                              class S {
                              	public: int j;
                              };
                              
                              typedef void (*PushTy)(S*);
                              
                              void push(S *s)
                              {
                                  // nothing
                              }
                              
                              void r(PushTy p)
                              {
                              	for (int i = 0; i < 1000000; i++) { auto s = new S(); p(s); }
                              }
                              
                              int main()
                              {
                                  PushTy p = &push;
                                  r(p);
                              }
                              Ответить
                              • Великая победа Человека над Железным Болваном.
                                Ответить
                              • На самом деле нет.
                                https://godbolt.org/z/hdK7Mrra6

                                О5 анскилл.
                                main:
                                        xor     eax, eax
                                        ret
                                _GLOBAL__sub_I_main:
                                        sub     rsp, 8
                                        mov     edi, OFFSET FLAT:_ZStL8__ioinit
                                        call    std::ios_base::Init::Init() [complete object constructor]
                                        mov     edx, OFFSET FLAT:__dso_handle
                                        mov     esi, OFFSET FLAT:_ZStL8__ioinit
                                        mov     edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
                                        add     rsp, 8
                                        jmp     __cxa_atexit
                                Ответить
                                • ты меня обманул на -O5 ничего не исчезло

                                  push(S*):
                                          ret
                                  r(void (*)(S*)):
                                          push    rbp
                                          mov     rbp, rdi
                                          push    rbx
                                          mov     ebx, 1000000
                                          sub     rsp, 8
                                  .L4:
                                          mov     edi, 4
                                          call    operator new(unsigned long)
                                          mov     DWORD PTR [rax], 0
                                          mov     rdi, rax
                                          call    rbp
                                          sub     ebx, 1
                                          jne     .L4
                                          add     rsp, 8
                                          pop     rbx
                                          pop     rbp
                                          ret
                                  main:
                                          sub     rsp, 8
                                          mov     edi, OFFSET FLAT:push(S*)
                                          call    r(void (*)(S*))
                                          xor     eax, eax
                                          add     rsp, 8
                                          ret
                                  _GLOBAL__sub_I_push(S*):
                                          sub     rsp, 8
                                          mov     edi, OFFSET FLAT:_ZStL8__ioinit
                                          call    std::ios_base::Init::Init() [complete object constructor]
                                          mov     edx, OFFSET FLAT:__dso_handle
                                          mov     esi, OFFSET FLAT:_ZStL8__ioinit
                                          mov     edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
                                          add     rsp, 8
                                          jmp     __cxa_atexit
                                  Ответить
                                  • Попробуй флаги
                                    -O5 -unskill
                                    https://godbolt.org/z/KhrdM8E43
                                    У меня всё работает.
                                    Ответить
                                    • Макроса «nskill» случайно нет в какой-нибудь библиотеке?

                                      P.S. А нет, «U» заглавной должна быть, чтобы съесть макрос.
                                      Ответить
                          • Ви таки удивитесь, но…
                            https://gcc.godbolt.org/z/q89sdaenW
                            push(S*):
                                    ret
                            main:
                                    xor     eax, eax
                                    ret
                            Ответить
                          • Что за анскильные пуши, которые не пуши, а реплейсы бесполезной питушни, которая никому не нужна?

                            Необходимо*
                            1. Взять нетривиальную математическую проблему, для оптимизации которой надо либо решить проблему столетия, либо осуществить полный перебор.
                            2. Вывести результат. Без вывода и другой работы с внешним миром можно код любой программы выкинуть.

                            Как минимум, попробовать посчитать и вывести какой-нибудь хэш от строки, содержащей последние 4 байта указателя на каждый объект.

                            __________________
                            * О том, что достаточно, я не берусь рассуждать. Не уверен, что вообще можно уговорить компилятор генерировать честные объекты в куче. Никто не заметит, если заменить кучу new на аллокацию/резервирования в статической памяти одного большого стека и return heap++; в "new". Ссылочная сука прозрачность, которой обрезает крылья только стандарт, объявляя какие-нибудь случаи, когда компилятор что-то должен сделать (ключевое слово volatile и явный список побочных эффектов, при виде которых компилятор не должен лениться).
                            Ответить
                            • > решить проблему столетия
                              > Вывести результат.

                              Практика показывает, что и это не всегда помогает... Где-то здесь был пример, когда gcc в компайлтайме опроверг теорему Ферма.
                              Ответить
                              • Этот пример был, когда автор допустил UB. Если нет UB, компилятор не позволит себе делать такие вольности, иначе j123123 напишет тикет про новый баг в компиляторе.

                                Да, есть ещё необходимое условие номер ноль: не допускать UB.

                                https://habr.com/ru/post/229963/
                                Ответить
                                • В новой версии стандарта написано:

                                  3.14.15.92. The compiler shall not produce any output that results in j123123's reporting a bug.
                                  Ответить
                                  • > 3.14.15.92. The compiler shall not produce any output that results in j123123's reporting a bug.

                                    The compiler produced code that travelled into the past and killed j123123.
                                    Ответить
                              • Это называется «UB-driven theorem proving».
                                #include <cstdlib>
                                #include <cstdio>
                                
                                int main() {
                                    for (int i = 3; i++;) {
                                        for (int j = 3; j++;) {
                                            for (int k = 3; k++;) {
                                                if (i*i*i + j*j*j == k*k*k) {
                                                    std::puts("Found!! Ferma sosnool");
                                                    return EXIT_SUCCESS;
                                                }
                                            }
                                        }
                                    }
                                    return EXIT_FAILURE;
                                }

                                https://wandbox.org/permlink/pKwLpM0NZ4cA6P1J

                                UPD: Поправил степень в уравнении.
                                Ответить
                                • А с unsigned тоже найдёт, не компилить же вечный цикл?
                                  Ответить
                                  • С unsigned оно вечным не будет — произойдёт wrap around в 0. Но на полное удаление циклов ума не хватило — какое-то говно там всё таки крутится: https://gcc.godbolt.org/z/zoPaM1e85
                                    Ответить
                                    • > произойдёт wrap around в 0

                                      Да, но тут только 2 исхода -- либо он найдёт тройку чисел и выведет сообщение, либо он будет крутиться вечно т.к. других выходов из цикла нет. Вечный цикл это вроде как UB, так что почему бы не вывести сообщение и выйти?
                                      Ответить
                                      • Да, всё так. Компилятор просто ниасилил, видимо.
                                        Ответить
                                        • > Компилятор просто ниасилил

                                          В смысле ниасилил? А вы проверяли результат?

                                          > Found!! Ferma sosnool 4 5 1360988357

                                          > Но на полное удаление циклов ума не хватило — какое-то говно там всё таки крутится

                                          Вы ему дали какую задачу? Доказать теорему в поле unsigned int

                                          Где операции это
                                          * сложение по модулю 2^n
                                          * умножние по модулю 2^n.
                                          Ответить
                                          • > в поле unsigned int
                                            А и правда. По воскресеньям наш ма-те-ма-ти-чес-кий отдел закрыт.

                                            Но компилятор и правда ниасилил, потому что имел полное право выкинуть все циклы и оставить один единственный puts.
                                            Ответить
                                            • Он нашёл решение, причём за пару секунд.
                                              4³ + 5³ =  1360988357³
                                              
                                              64 + 125 = 189
                                              Это же Сишка (по сути), а не анскильные псевдоматематичные GHC и rustы.
                                              Ответить
                                              • Это в первую очередь оптимизирующий компилятор. А он вместо оптимизации выдал тупой анскильный цикл.
                                                Ответить
                                          • А, точно.
                                            Ответить
                                • Это в кольце по модулю. Так что извинись перед Фермой.
                                  Ответить
                                  • С int — нет, это именно что UB-driven theorem proving.
                                    С unsigned уже есть варианты, конечно.
                                    Ответить
                                    • > С int — нет, это именно что UB-driven theorem proving.

                                      Опровергаю.

                                      Компилятор делает всё в высшей степени корректно.

                                      С int компилятор вообще показывает дикий математический скилл
                                      В первом случае его просто просят вывести существует ли контрпример.
                                      for (int i = 3; i++;) {
                                              for (int j = 3; j++;) {
                                                  for (int k = 3; k++;) {
                                                      if (i*i*i + j*j*j == k*k*k) {
                                                          printf("Found!");

                                      Компилятор это блестяще делает в доли микросекунды.
                                      Используя своё математическое понимание, недоступное запартным лалкам (принцимп Дирихле) он понимает что на замкнутом кольце неизбежно будут коллизии и мгновенно пишет что контрпример существует.

                                      Однако! Если попросить его найти реальный пример, то компилятор сгенерит другой код, который задумается.
                                      for (int i = 3; i++;) {
                                              for (int j = 3; j++;) {
                                                  for (int k = 3; k++;) {
                                                      if (i*i*i + j*j*j == k*k*k) {
                                                          printf("Found! %d %d %d\n",i,j,k);


                                      Но опять же рано или поздно он через переполнение доворецирует до тривиального случая вроде
                                      i³ + 0³ = k³

                                      Так что придется тебе сесть на бутылку Клейна и извиняться перед Пьером Ахматовичем.
                                      Ответить
                                      • > на замкнутом кольце
                                        Проблема в том, что int в крестах — это вовсе не замкнутое кольцо, потому что переполнение signed int — это UB.
                                        Поэтому здесь компилятор попросту видит, что произойдёт одно из джвух: либо найдётся какой-нибудь контр-пример, либо произойдёт знаковое переполнение. Но знаковое переполнение — UB, которого в well-formed программе быть не может. А поскольку компилятор программиста уважает и долбоёбом не считает — «GCC» уверен, что и допускать UB в программе программист не станет. Следовательно, контр-пример существует, а поскольку искать конкретные числа программист не просил — все циклы можно смело выкидывать и печатать сообщение о найденном контр-примере.
                                        Ответить
                    • На «PHP» по-любому код будет исполняться не более 30 секунд, если не вызвать set_time_limit(0);
                      Ответить
                      • > вызвать set_time_limit(0);

                        Браво!

                        Восхитительный, царский ротоебизм.
                        Ответить
                  • С++ выиграет, пототому что в C# этот код не скомпилируется
                    Ответить
    • Уважаемый клиент!


      Неважно, где размещен ваш сайт — антивирус RU‑CENTER поможет уберечь его от заражения вредоносным кодом, потери информации, попадания в черные списки и снижения позиций в поисковой выдаче.


      Вы сможете получать отчеты об обнаруженных угрозах, лечить зараженные файлы в панели управления или в автоматическом режиме. Выберите подходящий тариф и оформите заказ со скидкой 20% по персональному промокоду 598Z49UT9W. Предложение действительно в течение 14 дней.


      Вернем 20% от стоимости заказа на бонусный счет. Кешбэк можно использовать для оплаты нового заказа.
      Ответить
      • А он может мне ускорить компиляцию ядра при установке «Gentoo»? А то я уже 15 минут жду: очень устал ждать, хочется побыстрее поставить какой-нибудь пакет.
        Ответить
        • Медленно компилируется ядро?
          Причиной могут быть вирусы!

          Купите антивирус Kaspersky Ultimate Pro Pack со скидкой 5%, и получите кепку в подарок!
          Ответить
          • показать все, что скрыто> Медленно компилируется ядро?

            Кстати, 2.5 минуты это долго?
            Ответить
            • если бы мы были на каком-нибудь вбюллетене, ты бы мог себе поставить плашку в подпись

              оверклокер
              Ответить
              • #вореции
                #оверклокинг

                Но мы на говнокоде, поэтому надо делать так.
                Ответить
            • у тебя ядро собирается 2 минуты?

              у тебя рязань с nvme, или ты заморочился выкинуть оттуда всё ненужное?
              Ответить
              • Я напиздела... Это какое-то битое ядро оказалось, просто ошибка куда-то за экран убежала. Минусуйте.
                Ответить
              • Собрала ядро и забыла time. Пришлось ещё раз...

                15 минут штатное дебиановское собирается, в общем.

                > nvme

                tmpfs
                Ответить
      • > антивирус

        Обычно это называется резервной копией?
        Ответить
        • Скорее всего он реально ищет вирусы на сайте. Вирус это когда твой вордпресс поломали, загрузили джаваскрипт, и майнят крипту на машинах пользователей, или ддосят кого-нить
          Ответить
          • А когда меняют буквы «о» на «o», «а» на «a» и «с» на «c» в выдаваемой страничке, это вирус?
            Ответить

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