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

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
  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 ASD_77, (Updated )

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

  • надо прекращать фичи клепать и дать миру как-то знать что такая херота существует
    Ответить
    • В идеале Майкам стоило бы захайрить и влить в эту срань бабло.
      Для начала неплохо чтобы подключилось больше заинтересованных в ts людей.

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

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

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

        А если это использовать как просто еще один ФП-язык, а не как костыль для JS, то тогда есть более нормальные ФП-языки которые компилируются в натив, а не всякий там жабаскриптовый кал.
        Ответить
              • Для меня "тупескрипт" менее известный язык, чем "haskell"

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

          Во-первых, появляется возможность написать модуль на 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
        Ответить
        • Ну да. А в 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)
            Ответить

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

Переведи на "PHP", guest!

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


    8