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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
function toHex(this: TypeOf<1>) {
	return "hex";
}

function main() {
    print((5).toHex());
    print("done.");
}

решил добавить прикольного кода из C# в TypeScript Compiler ... красиво получилось? (тем кто еще не знает где искать компилятор https://github.com/ASDAlexander77/TypeScriptCompiler)

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

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

  • А в С я могу сделать 5[array]. И это работает из коробки, и ничего добавлять не надо.
    Ответить
    • Моя давняя мечта - поехать в Одессу, потому что там живут веселые евреи
      Ответить
    • uint32_t array[4] = {1, 2, 3 ,4};
      uint16_t* ptr = array;
      2[ptr]

      2[ptr] будет uint16_t или int?
      Ответить
      • Не понимаю как ты на второй строчке превращаешь массив 4хбайтовых целых в указатель на двубайтовое целое. Это разве можно так?

        Далее, ты прибавляешь к указателю два. int там точно не будет: будет uint16_t, потому что ptr это укзаатель на uint16_t
        Ответить
            • return 2[ptr];
              ну и это без оптимизаций что-то gcc чудит и из регистра в регистр перекидывает всё
              Ответить
                  • Ну зафлашил переменную на стек, это как раз разумно для отладочной сборки.

                    А два раза слово растягивать -- хрень какая-то.
                    Ответить
                    • main:
                              push    rbp
                              mov     rbp, rsp
                              mov     DWORD PTR [rbp-32], 1
                              mov     DWORD PTR [rbp-28], 2
                              mov     DWORD PTR [rbp-24], 3
                              mov     DWORD PTR [rbp-20], 4
                              lea     rax, [rbp-32]
                              mov     QWORD PTR [rbp-8], rax
                              mov     rax, QWORD PTR [rbp-8]
                              add     rax, 4
                              movzx   eax, WORD PTR [rax]
                              movzx   eax, ax
                              pop     rbp
                              ret


                      прям флюш на стек?
                      Ответить
                      • Ну да, [rbp - 8] это ptr. Ты сначала положил в него адрес массива. А потом прочитал в следующей строке.
                        Ответить
              • > без оптимизаций

                А нафига? С оптимизациями ведь легче читается, меньше воды.

                Или он с оптимизациями всё это выбросил и оптимизнул до ret? )))
                Ответить
                • > А нафига? С оптимизациями ведь легче читается, меньше воды.
                  Хуй знает как это у тебя так получается.

                  Без оптимиизации обычно ты видишь какая строчка сишки во что компилца.
                  Вот переменная ложится на стек по смещению от bp, вот прибавляют константу к значению, поклав его в AX, вот ret.

                  В оптимизированном варианте ничего этого может и не быть вообще
                  Ответить
                  • Х.з., у меня от вербозности неоптимизнутого кода башка болеть начинает...
                    Ответить
                    • Ты наверное много выхлопов оптимизированного компилятора читал, и к компилятору своему привык
                      Ответить
                      • А зачем вообще читать отладочный асм?

                        Он очень стабильный, в нём нету багов конпелятора, он не раскрывает потенциал большинства UB'ов. Да и мапается 1:1 на исходник, что позволяет не лазить в асм.

                        На практике разбор асма всегда идёт на релизной сборке.
                        Ответить
                        • Я читал чтобы изучать как те или иные конструкции сишки ложаца на ISA x86.

                          А ты вот прямо ищещь UB посредством чтения асма с -O2?
                          Ответить
                          • > как конструкции сишки ложатся

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

                            Судить о конпеляторе по О0 -- это как судить о тян по резиновой копии.
                            Ответить
                            • Скорее как судить о тян по её поведению на первом свидании:)
                              Ответить
                          • > ищещь UB посредством чтения асма с -O2

                            Если случилась какая-то неведомая ёбаная хуйня и я на уровне исходников не понимаю что происходит (или их вообще нету) -- это в 99.99% случаев релизная сборка с оптимизациями.

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

                              Я просто последний раз в живой асм лазил чтобы выдрать из RAX возвращаемое значение какой-то хуйни, которую через сурс дебагер было не высосать. Но я высокоуровневый питушок, ближе к жаваговну и скриптоговну, так что это не удивительно
                              Ответить
                              • Блин. Или я не умею выражать свои мысли или ты читать...

                                Да, умение читать релизный асм тоже требуется не часто.

                                Но умение читать дебажный асм требуется чуть реже, чем никогда. Ибо если проблема не решается на уровне исходников, то она в большинстве случаев* возникла в релизной сборке с оптимизациями и читать придётся именно оптимизированный асм.

                                * Была пара кейсов когда надо было изучить именно отладочную сборку, но на них никогда не налетишь если не будешь пилить свой рантайм.
                                Ответить
                                • Ок, я понял) Я просто не думал, что у тебя есть реальные асмовставки. Если бы у тебя был чисто сишный код, то при наличии сырцов обычно же можно понять, что работает не так, даже в релизной сборке с символами
                                  Ответить
                                • >Но умение читать дебажный асм требуется чуть реже, чем никогда

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

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

                                    Просто надо смотреть его на небольших примерах, а не на реальном коде.

                                    > изучаешь как стек работает

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

                                      Хотя всегда можно заказать нейтральный march

                                      >AVR

                                      Я никогда не писал под AVR, я вообще в нативном (не JVM) коде за пределы x86 вылазил только в ифончики, и писал под них на обжс и сишке (ну там пара API у ябла была на чистой сишке) так что и асма его не знаю.
                                      Ответить
                                      • > Оптимиизрованный код может быть сложный

                                        Ну вот сравни какой-нибудь xor под amd64 в релизе и в дебаге. Какой из них проще понять новичку?

                                        В релизе будут mov, xor и ret. Легко объяснить, зачем нужна каждая из них. А теперь объясни новичку назначение всей той хуйни, которая нагенерилась в дебаге...

                                        Да, конпелятор может поюзать какую-нибудь lea для сложения или умножения на константу, да он может превратить x ? 42 : 100500 в весьма загадочную конструкцию. Но что-то совсем заумное генерить он не будет. Чего не скажешь о дебаге, в котором можно встретить и канарейку для защиты стека и какой-нибудь nop на ровном месте, о назначении которых тебе не каждый гуру расскажет.
                                        Ответить
                                  • > учебных целей

                                    Почему оптимизнутый код лучше для изучения?

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

                                    А потом уже можно сделать более сложный пример и посмотреть как конпелятор начинает пользоваться стеком. При этом ты уже знаешь как базовые инструкции работают и тебе легче понять новые фишки.

                                    В дебажном коде придётся сразу объяснять весь этот обвес.
                                    Ответить
                                    • > не будет всех этих фреймпоинтеров, прологов-эпилогов и прочего хлама.
                                      К примеру, рекомендую посмотреть, во что компилируется
                                      int same(int i)
                                      {
                                          return i;
                                      }

                                      с О3 и О0.
                                      Ответить
                                      • > К примеру, рекомендую посмотреть

                                        Причём на amd64 дебажный код особенно гротескный: принимает аргумент в регистре, а потом помещает его в локалку.
                                        Ответить
                                        • Дык это кол конвеншн такой там, нет?

                                          Кстати, в асме под BIOS и DOS то все переменные передавались через регистры, это паскале и сишке их начали через стек передавать (ну и в 32 тоже в некоторых конвеншенах вроде) а потом всё вернулось на круги своя
                                          Ответить
                                          • Да хрен с ним с калл конвекшенем.
                                            У тебя есть: входной параметр в edi.
                                            Тебе надо: поместить его в eax
                                            Решать эту непосильную задачу в шесть строчек, это слегка перебор.
                                            Ответить
                                            • А нельзя его мувом покласть? Или там какие-то ограичения что куда можно класть мимо памяти? Или надо в прелюдии созхранить старый eax?
                                              Ответить
                                              • Можно. -О3 так и делает:
                                                same(int):                               # @same(int)
                                                        mov     eax, edi
                                                        ret

                                                А без оптимизаций получается:
                                                same(int):                               # @same(int)
                                                        push    rbp
                                                        mov     rbp, rsp
                                                        mov     dword ptr [rbp - 4], edi
                                                        mov     eax, dword ptr [rbp - 4]
                                                        pop     rbp
                                                        ret
                                                Ответить
                                              • > А нельзя его мувом покласть?

                                                Нет конечно. Ты ведь запретил конпелятору это делать. Ты сказал ему генерить дословную хуйню, которая будет мапаться 1:1 на сишку чтобы отладчику удобнее было бряки ставить и значения переменных смотреть.

                                                Да, O0 заточено именно под отладчик, а не под чтение человеком.
                                                Ответить
                                                • Кстати, а как работает сурс бряк в сильно оптимизированной сборке? МОжет быть такое, что дебагеру тупо некуда будет воткнуть бряк?
                                                  Ответить
                                              • В чём вообще суть дебажной сборки?

                                                1) Стандартизированные фреймы на регистре rbp. Самому коду они нахуй не нужны, но они очень важны для отладчика. Иначе парсинг стека вызовов встанет раком на любом незнакомом модуле без символов.
                                                2) Сохранение всех аргументов на стек. Очень важная вещь, без которой значения аргументов для какой-нибудь функции в середине стека не найти.
                                                3) Дословная трансляция кода. Чтобы бряки и пошаговое исполнение работали интуитивно. Одна строчка -- один фрагмент кода.
                                                4) Всякие дополнительные проверки чтобы как можно раньше ловить ошибки.

                                                Т.е. это не просто "код без оптимизаций", это код максимально заточенный под символьную отладку. И раздутый за счёт этого.

                                                З.Ы. gcc даже позволяет себе немножко оптимизировать на O0, если это не аффектит описанное выше.
                                                Ответить
                                          • Даже в 64-битном коде есть msabi и systemvabi.

                                            В Win32 использовалось соглашение stdcall — всё через стек, в Win16 — pascal, всё тоже через стек. Хотя msvcrt.dll использовала соглашение cdecl (тоже через стек, но аргументы в другом порядке).

                                            А в статических библиотеках соглашений было выше крыши.

                                            В Watcom C было два набора стандартных библиотек: для передачи параметров через стек и для передачи через регистры.

                                            Регистры vs стек — это два стула. Если ты вызываешь функцию из функции, тебе всё равно придётся сохранять контекст функции в стеке. Говорят, старые фортраны так не умели (передавали аргументы через глобалки?), поэтому в них рекурсия была запрещена, но это вроде давно исправили.
                                            Ответить
                                            • В x64 просто регистров как говна за баней, а в 16 они были на вес золота, вот и юзали стек.
                                              Ответить
                                            • > придется сохранять

                                              Да, но сохраняется намного меньше данных, чем в старых соглашениях.

                                              Многие аргументы тупо не доживают до вызова. Зачем их сохранять на стек?

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

                                                  Это да. И надо понимать когда юзать caller saved регистр (он не переживёт вызовы), когда callee saved (оригинальное значение придётся сохранить на стек, зато он переживёт вызовы), а когда ячейку на стеке.

                                                  Т.е. частоту использования ещё надо понимать.
                                                  Ответить
                                                  • Трудно наверное писать такое руками.

                                                    Забавно, что 16 битный ISA делали для рукописного асма, а 64 уже скорее для компиляторов
                                                    Ответить
                                                    • > писать руками

                                                      Да вот кстати нет...

                                                      Простые функции писать даже легче т.к. всё в регистрах и не надо думать о стеке.

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

                                                  Это да. И надо понимать когда юзать caller saved регистр (он не переживёт вызовы), когда callee saved (оригинальное значение придётся сохранить на стек, зато он переживёт вызовы), а когда ячейку на стеке.

                                                  Т.е. частоту использования ещё надо понимать.
                                                  Ответить
                                              • Я теперь понял, почему JVM стековая. Она хорошо сочетается с неоптимизирующим компилятором «йажац».
                                                Ответить
                                              • Я теперь понял, почему JVM стековая. Она хорошо сочетается с неоптимизирующим компилятором «йажац».
                                                Ответить
                              • Ну вот например кейс, который недавно разбирали на ГК -- асмовая вставка для переключения стека.

                                В дебажной сборке всё работало т.к. конпелятор юзает только 3-4 регистра и флашит всё на стек.

                                В релизной сборке всё поломалось т.к. оптимизатор посчитал, что значение некоторых регистров не испортится во время исполнения вставки. А она зовёт сишную функцию, которая их портит.

                                Т.е. изучать дизасм и отлаживать пришлось именно на релизной сборке. Почему? Потому что конпелятор раскрывает свой потенциал только в релизной сборке.
                                Ответить
                  • > В оптимизированном варианте ничего этого может и не быть вообще

                    И это круто!

                    В отладочной сборке весь смысл функции тонет на фоне этой ебучей игры в напёрстки.

                    А в релизе поток данных намного лучше видно, имхо. Конпелятор старается держать значение в одном регистре от начала до конца.
                    Ответить
                    • Скажи, а джаваскрипт ты тоже компилированный предпочитаешь?
                      Ответить
                      • Между обфусцированным и обфусцированно-минифицированным я, наверное, выберу второй т.к. он короче...

                        Из джвух зол выбирают меньше, в общем. А если задача решается на уровне исходников -- я в асм не полезу, само собой. И в дебажной сборке она, как правило, и решается на уровне исходников т.к. кодогенерация там совсем тупая с минимумом багов и UB'ов.
                        Ответить
      • Будет UB. Конпелятор вправе предположить, что указатели на uint32_t и uint16_t никогда не алиасятся, не указывают на одни и те же данные. Обычно это плохо заканчивается.
        Ответить
    • Это очень полезно, можно вместо *(...) и (...)[index] писать index[...] — сразу видно, в каком выражении вычисляется указатель.

      Именно поэтому я за "Си"
      Ответить
  • https://habr.com/ru/post/651935/

    Невероятное проишествие! Человек нашел в ПРОДАКШЕН коде БАГ.
    Такого раньше НЕ МОГЛО БЫТЬ В ПРИНЦИПЕ утверждает автор с 12-ю годами опыта на пе ха пе.
    НАЧАЛАСЬ НОВАЯ ЭПОХА
    Ответить
    • Я вам расскажу про... Ладно, сначала я вам расскажу, а вы сами решите, про что я вам рассказал
      Ответить
      • Я вам хочу рассказать одно происшествие, случившееся с рыбой, или даже вернее не с рыбой, а с человеком Патрулевым, или даже вернее с дочерью Патрулева.

        Начну с самого рождения. Кстати о рождении: у нас родились на полу... Или хотя это мы потом расскажем.

        Говорю прямо:

        Дочь Патрулева родилась в субботу. Обозначим эту дочь латинской буквой М.
        Ответить
        • Две дамы спят, а впрочем нет,
          не спят они, а впрочем нет,
          конечно спят и видят сон,
          как будто в дверь вошел Иван,
          а за Иваном управдом,
          держа в руках Толстого том
          "Война и мир", вторая часть...
          А впрочем нет, совсем не то,
          вошел Толстой и снял пальто,
          калоши снял и сапоги
          и крикнул: Ванька, помоги!
          Тогда Иван схватил топор
          и трах Толстого по башке.
          Толстой упал. Какой позор!
          И вся литература русская в ночном горшке.
          Ответить
    • я не осилил статью, первую страницу прочитал и поставил минус, абсолютный долбоебизм
      Ответить
      • Чацкий вышел через задний проход и подпёрнул дверь палкой
        Ответить
  • Коллега прошла испытательный. Говорим: "как тебе команда?" Она грит: "лучше, чем предыдущая. Те меня спрашивали, какое аниме я смотрю"
    Ответить
      • У нее муж и двое детей, зачем ей аниме?
        Ответить
        • Ну как, приучать мужа и детей к доброму и светлому... Тем более что совсем уж кровь-кишки у нас РКН забанил.
          Ответить
          • Я не вижу «Берсерка» в списке забаненых.
            Можно ещё «Goblin Slayer» ему посоветовать.
            Ответить
            • Оказалось, что самому себе комплимент сделать можно, но потом это становится навязчивой идеей
              Ответить
      • нету у нее хуя
        она от природы тян

        именно потому она и не разбиратеся в аниме
        Ответить
        • Некоторые тян разбираются в аниме... Но обычно такие замуж выходят поздно. То ли они боятся парней, то ли парни их боятся.
          Ответить
    • > лучше, чем предыдущая. Те меня спрашивали, какое аниме я смотрю
      А в этой спрашивают о наличии хуя и дате окончания ВУЗа?
      Ответить
      • нету у нее хуя
        она от природы тян

        именно потому она и не разбиратеся в аниме
        Ответить
    • Тян у парня спрашивает:
      - как тебе я?
      - лучше, чем предыдущая
      Ответить
      • Герасим пожалел Муму, поэтому он решил ее накормить, а потом топить
        Ответить
        • Жалость - сопливое, низменное чувство, особенно к курам.
          В настоящее время в моих ресторанах едят подобных тебе. И тебе не миновать этой участи.
          Ответить
      • >- лучше, чем предыдущая


        Еще можно так ответить:

        "Ну знаешь, мне выбирать не приходится"
        Или
        "С пивом потянет"
        Ответить
  • Подросток из подмосковного Реутова изобрел супер-двигатель и предложил его американскому инженеру и миллиардеру Илону Маску. Об этом сообщает Telegram-канал «Подмосковье сегодня».

    Сообщается, что одним из главных преимуществ нового двигателя юноша считает его работу на топливе любого вида. «Представляете у вас в машине будет кнопочка и вы такие — хочу 92-й бензин, но остался день до зарплаты, поэтому заправлюсь 80-м», — пояснил молодой человек.
    Ответить

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

Из-за тебя ушел bormand, guest!

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


    8