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

    +2

    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
    21. 21
    22. 22
    23. 23
    24. 24
    class S
    {
    	print()
    	{
    		print("Hello World");
    	}
    }
    
    interface IPrn
    {
    	print();
    }
    
    function run(iface:IPrn)
    {
    	iface.print();
    }
    
    function main() {
    	const s = new S();
    	let iface = <IPrn>s;
    	iface.print();	
    	run(s);
    }

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

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

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

    • дамп https://pastebin.com/JcdfGPJn
      Ответить
    • а еще SEO пост https://github.com/ASDAlexander77/TypeScriptCompiler
      Ответить
    • надо прекращать фичи клепать и дать миру как-то знать что такая херота существует
      Ответить
      • В идеале Майкам стоило бы захайрить и влить в эту срань бабло.
        Для начала неплохо чтобы подключилось больше заинтересованных в ts людей.

        А для этого нужно пиариться на жопулярных площадках вроде medium, reddit или ycombinator.

        Желательно накатать статью с графиками честных бенчей как эта хрень рвёт V8 и всякие rust.
        Ответить
        • > В идеале Майкам стоило бы захайрить и влить в эту срань бабло.

          А по-моему в таком виде оно никому нахуй не надо, ибо мало кто пишет на TS в этом "strict mode" без возможности вызывать из TS некий код на JS, взаимодействовать со всякими JS либами.

          А если это использовать как просто еще один ФП-язык, а не как костыль для JS, то тогда есть более нормальные ФП-языки которые компилируются в натив, а не всякий там жабаскриптовый кал.
          Ответить
          • Какой депрессняк (((
            Ответить
          • на любуйся https://github.com/AssemblyScript/assemblyscript . а у меня WASM делается как бесплатная добавка
            Ответить
            • И что? Зачем все эти "скрипты" для этого? Можешь haskell компилировать в WASM https://github.com/tweag/asterius
              Ответить
              • кому нужен "чудо неизвестный" язык.?
                Ответить
                • Для меня "тупескрипт" менее известный язык, чем "haskell"

                  Про "haskell" я хуй знает когда узнал, а про "тупескрипт" узнал не так давно из кукареканий каких-то вротэндеров, типа "ко-ко-ко как круто, теперь тут типизация будет в жабаскрипте пок-пок"
                  Ответить
                • И вообще, если тебе надо чтоб суперизвестный язык, почему ты не пишешь компилятор PHP в LLVM?
                  Ответить
                  • я не знаю о PHP и никогда не хочу знать
                    Ответить
                  • ну он всё таки на программистов ориентируется, а не на обоссанную помойку
                    Ответить
          • Вообще не согласен.

            Во-первых, появляется возможность написать модуль на TS, который вызывается и с браузера, и линкуется к нативному коду.
            И вынести туда например какую-то общую бизнес логику для серверного и клиентского кода.

            >мало кто пишет на TS в этом "strict mode"
            Во-вторых, многие начинают проекты с нуля на этой срани.

            В-третьих, язык не так уж плох как для скриптухи.

            > то тогда есть более нормальные ФП-языки которые компилируются в натив, а не всякий там жабаскриптовый кал.

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

              Почему бекенд не запустить на nodejs? зачем логику дергать из нативного кода? Хайлоад?

              Вообще необходимость писать логику четыре раза (для фронта, для бека, для ios и для android) это пиздец.

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

                Бизнес логика скриптуется на Lua.
                Ответить
        • > А для этого нужно пиариться на жопулярных площадках вроде medium, reddit или ycombinator.

          На reddit он это вбрасывал, я вот нагуглил https://www.reddit.com/user/Alex_D77/

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

        >Ron Buckton
        >https://github.com/rbuckton
        Ответить
    • Очень заинтересовал файл LowerToLLVM.cpp

      Что значит lowering и AffineOps? Явно какие-то шланговские термины.
      Ответить
      • Я примерно понял что оно «понижает» синтаксические элементы в выхлоп инструкций llvm.

        AffineOps это какие-то топологические преобразования кода в подобный, вроде схлопывания питушни или инлайна.
        Ответить
      • Lower - это процесс перевода верхнего языка программирования в более низкий уровень. Пример C -> ASM -> BIN. Affine (level) - это первичный перевод для более высоких объектов например for-each, while и тд. и уже потом идет переход с промежуточного уровня в LLVM который сам потом сгенерит для нас BIN/ASM/EXE. Так же Affine (level) используется для первичной оптимизации или удалении "мертвого" кода. В ЛЛМВ AffineOps - это более высокие конструкции для If/For рассчитанные на параллельное выполнение и работу с тензорами (это как умные поинтеры на память).
        Ответить
        • Напоминаю, что говнопереход из LLVM в ASM осуществляется на основе заговнохардкоженных коэффициентов "стоимости инструкций" прямо в исходнике
          https://govnokod.ru/27456#comment632355
          Ответить
          • Какое govno )))
            Ответить
          • Ну да. А в gcc конечно не так.
            gcc/config/i386/x86-tune-costs.h
             
            +struct processor_costs znver3_cost = {
            +  {
            +  /* Start of register allocator costs.  integer->integer move cost is 2. */
            +
            +  /* reg-reg moves are done by renaming and thus they are even cheaper than
            +     1 cycle.  Because reg-reg move cost is 2 and following tables correspond
            +     to doubles of latencies, we do not model this correctly.  It does not
            +     seem to make practical difference to bump prices up even more.  */
            +  2, 2, 3,				/* cost of moving XMM,YMM,ZMM
            +					   register.  */
            +  {6, 6, 6, 6, 12},			/* cost of loading SSE registers
            +					   in 32,64,128,256 and 512-bit.  */
            +  {8, 8, 8, 8, 16},			/* cost of storing SSE registers
            +					   in 32,64,128,256 and 512-bit.  */
            +  6, 6,					/* SSE->integer and integer->SSE
            +					   moves.  */
            +  8, 8,				/* mask->integer and integer->mask moves */
            +  {6, 6, 6},				/* cost of loading mask register
            +					   in QImode, HImode, SImode.  */
            +  {8, 8, 8},				/* cost if storing mask register
            +					   in QImode, HImode, SImode.  */
            +  2,					/* cost of moving mask register.  */
            +  /* End of register allocator costs.  */
            +  },
            +
            +  COSTS_N_INSNS (1),			/* cost of an add instruction.  */
            +  COSTS_N_INSNS (1),			/* cost of a lea instruction.  */
            +  COSTS_N_INSNS (1),			/* variable shift costs.  */
            +  COSTS_N_INSNS (1),			/* constant shift costs.  */
            +   /* Depending on parameters, idiv can get faster on ryzen.  This is upper
            +      bound.  */
            +  {COSTS_N_INSNS (16),			/* cost of a divide/mod for QI.  */
            +   COSTS_N_INSNS (22),			/* 			    HI.  */
            +   COSTS_N_INSNS (30),			/*			    SI.  */
            +   COSTS_N_INSNS (45),			/*			    DI.  */
            +   COSTS_N_INSNS (45)},			/*			    other.  */
            +  COSTS_N_INSNS (1),			/* cost of movsx.  */
            +  COSTS_N_INSNS (1),			/* cost of movzx.  */
            +  /* VGATHERDPD is 23 uops and throughput is 9, VGATHERDPD is 35 uops,
            +     throughput 12.  Approx 9 uops do not depend on vector size and every load
            +     is 7 uops.  */
            Ответить
      • на примере
        function main()
        {
            print("Hello");
        }


        саначало получаем MLIR левел

        module @"c:\\temp\\1.ts"  {
          ts.Func @main () -> ()  {
            "ts.Entry"() : () -> ()
            %0 = ts.UnresolvedSymbolRef {identifier = @print} : none
            %1 = ts.Constant {value = "Hello"} : !ts.string
            ts.Print(%1) !ts.string
            "ts.Exit"() : () -> ()
          }
        }
        Ответить
        • потом проводим переход в более низкий уровень и убираем мертвый код

          module @"c:\\temp\\1.ts"  {
            ts.Func @main () -> ()  {
              "ts.Entry"() : () -> ()
              %0 = ts.Constant {value = "Hello"} : !ts.string
              ts.Print(%0) !ts.string
              "ts.Exit"() : () -> ()
            }
          }
          Ответить
          • далее переходим на LLVM IR
            module @"c:\\temp\\1.ts"  {
              llvm.func @printf(!llvm.ptr<i8>, ...) -> i32
              llvm.mlir.global internal constant @s_7201466553693376363("Hello\00")
              llvm.mlir.global internal constant @frmt_11120820245497078329("%s\0A\00")
              llvm.func @main() {
                %0 = llvm.mlir.addressof @s_7201466553693376363 : !llvm.ptr<array<6 x i8>>
                %1 = llvm.mlir.constant(0 : i64) : i64
                %2 = llvm.getelementptr %0[%1, %1] : (!llvm.ptr<array<6 x i8>>, i64, i64) -> !llvm.ptr<i8>
                %3 = llvm.mlir.addressof @frmt_11120820245497078329 : !llvm.ptr<array<4 x i8>>
                %4 = llvm.mlir.constant(0 : i64) : i64
                %5 = llvm.getelementptr %3[%4, %4] : (!llvm.ptr<array<4 x i8>>, i64, i64) -> !llvm.ptr<i8>
                %6 = llvm.call @printf(%5, %2) : (!llvm.ptr<i8>, !llvm.ptr<i8>) -> i32
                llvm.br ^bb1
              ^bb1:  // pred: ^bb0
                llvm.return
              }
            }
            Ответить
            • такие операции как "ts.Print" это нвш код который мы генерим из AST и мы же говорим LLVM как генерировать код из них. Это то что вы видите в LowerToAffineLoops и LowerToLLVM
              Ответить
            • Спасибо. Очень интересно. На примере print более менее разобрался
              if (functionName.compare(StringRef("print")) == 0)
              {
                  mlir::succeeded(
                      builder.create<mlir_ts::PrintOp>(location, operands);
                  );
              }


              PrintOp => PrintOpLowering => сборка формата строки для printf => вызов printf (format, vararg)
              Ответить
      • тока не смотрите в MLIRGEN.Cpp. :)
        Ответить
    • неужели все пропустили фичу....?
      Ответить
      • Вот тут параметр типа интерфейс, а передаём объект произвольного класса:
        function run(iface:IPrn)


        Как называется магия в следующей строке?
        let iface = <IPrn>s;
        Ответить
        • Type assertions
          https://www.typescriptlang.org/docs/handbook/basic-types.html
          Ответить
        • верно фича называется создай интерфейс из любого входимого класса
          Ответить
        • Переведи на "PHP".
          Ответить

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