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

    +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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    function main() {
        print("Hello", 1, false, true, parseInt("01"), parseFloat("00.1"));
    }
    
    // ASM
    ; ModuleID = 'LLVMDialectModule'
    source_filename = "LLVMDialectModule"
    target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
    target triple = "x86_64-pc-windows-msvc"
    
    @__true__ = internal constant [5 x i8] c"true\00"
    @__false__ = internal constant [6 x i8] c"false\00"
    @frmt_9481649210695450612 = internal constant [19 x i8] c"%s %d %s %s %d %f\0A\00"
    @s_3144841719139014728 = internal constant [5 x i8] c"00.1\00"
    @s_12300967985959445949 = internal constant [3 x i8] c"01\00"
    @s_1772061916968062023 = internal constant [6 x i8] c"Hello\00"
    
    declare i8* @malloc(i64)
    
    declare void @free(i8*)
    
    declare i32 @printf(i8*, ...)
    
    declare float @atof(i8*)
    
    declare i32 @atoi(i8*)
    
    define void @main() !dbg !3 {
      %1 = call i32 @atoi(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @s_12300967985959445949, i64 0, i64 0)), !dbg !7
      %2 = call float @atof(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @s_3144841719139014728, i64 0, i64 0)), !dbg !9
      %3 = fpext float %2 to double, !dbg !10
      %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @frmt_9481649210695450612, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @s_1772061916968062023, i64 0, i64 0), i32 1, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @__false__, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @__true__, i64 0, i64 0), i32 %1, double %3), !dbg !10
      br label %5, !dbg !11
    
    5:                                                ; preds = %0
      ret void, !dbg !11
    }
    
    !llvm.dbg.cu = !{!0}
    !llvm.module.flags = !{!2}

    Продолжение писания уе..(зачеркнуто) супер компилятора с TypeScript (JavaScript) в нативный код.

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

    set LIBPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\SDK\ScopeCppSDK\vc 15\VC\lib
    set SDKPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\SDK\ScopeCppSDK\vc 15\SDK\lib
    tsc.exe --emit=llvm C:\temp\1.ts 2>1.ll
    llc.exe --filetype=obj -o=out.o 1.ll
    lld.exe -flavor link out.o "%LIBPATH%\libcmt.lib" "%LIBPATH%\libvcruntime.lib" "%SDKPATH%\kernel32.lib" "%SDKPATH%\libucrt.lib" "%SDKPATH%\uuid.lib"

    получаетм Ехе и грузим его. и результат

    =====================================
    и выполнение

    C:\>out.exe
    Hello 1 false true 1 0.100000

    Запостил: ASD_77, 09 Марта 2021

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

    • обратите внимание на то что true и false выводятся как нормальные строки а не 0 и 1 в ужос "с" компиляторе
      Ответить
      • А как работает if (some_boolean)? Через сравнение адресов?
        Ответить
        • в if можно отдавать только логические значения true (i1) или false. а как ты получить true или false - это тебе решать. Будет конечно приведение типов типа i32 > 0 это true. а nullptr это типа false.
          Ответить
      • А с чего им выводиться по-другому?
        Ответить
        • с того что в "с" нет true и false а есть только 0 и >0
          Ответить
          • слыхал про стдбул.х?

            хотя разумеетца под капотом там те же нолики
            Ответить
          • Так ты скомпилировал встроенные константы TS, если я правильно понимаю, при чём тут C?
            Ответить
            • при том что все равно надо иметь какую-то базу для выполнения а это естественно либы для "c" которым ваще похрен true там или false в typescript-e
              Ответить
              • Вореции какие-то

                Если в чистом TS там выведется "true", почему что-то другое должно вывестись при твоём транспайлинге?
                Ответить
                • это не транспайлинг а компайлинг. как я сказал "printf"-у похрен что ты там себе напридумывал. у него только числа и строки :)
                  Ответить
                • опять же . true и false - это только keywords в тексте в реальности они теже значения 1 и 0
                  Ответить
    • Кстати, а в чём прикол, что после строковых констант "\00"?
      Ответить
      • Нуль-терминатор.
        Ответить
        • я понимаю. вопрос в том, почему два нуля, а не один?
          Ответить
          • Это двоебайтный нуль-терминатор.
            Ответить
          • Программист забыл, чем оканчиваются строки - символом с кодом ноль или обычным нулем. Правда, непонятно, что будет, если в строке уже есть нули, но тогда терминатором можно просто считать последний.
            Ответить
            • плюнул, и ушел на борланд паскаль, к его строкам)

              Кстати, разве в строке могут быть нули?
              Ответить
              • Вай нот? В winapi иногда даже приходилось передавать такие строки с нулями в середине. В конце у них джва нуля, да.
                Ответить
                • Это wcharные строки?

                  а как это работает для ansi версии, типа w98?
                  Ответить
                  • Нее... В диалоге открытия файлов маски разделены нулями. Чтобы целую мапу в одной строке передать.
                    Ответить
                    • ты про A static buffer that contains a pair of null-terminated filter strings for preserving the filter pattern chosen by the user.?

                      Ну знаешь, это не совсем строка (хотя там поинтер на строку, конечно) это скорее массив такой вот ебанутый.
                      Абъюз строки так-то, не?
                      Ответить
              • В строке может быть собачья залупа.
                Ответить
          • два нуля это сортир
            http://forum.lingvolive.com/thread/l43457/
            Ответить
            • В первый раз слышу
              Ответить
              • Судя по тому, что топикстартерка упоминает Питер, это наше, местное. У нас это тоже велл ноун факт, и хуй знает, как я его узнал
                Ответить
          • Ну это не сишка, тут какие-то другие правила экранировки.

            Если посмотреть на \0A\00 выше, видимо, всегда ожидаются 2 символа в хексе. Как сишный \x00, но без x.
            Ответить
            • JloJle4Ka прав, вероятно: в этой странной субстанции символьные типы двубайтовые, и терминировать их нужно спец. литералом
              Ответить
              • Да не, \0A - явно перевод строки. Значит \00 - просто один нолик.
                Ответить
                • да, это LF.

                  ну значит товарщу просто проще так писать, чтобы байт всегда занимал две хексы от 00 до FF
                  Ответить
                  • это не мне проще - это LLVM так хочет
                    Ответить
                    • А почему?

                      Кстати, ещё ллвм хочет, чтобы я компилятор держал в папке, путь к которой захардкожен в сам ллвм.
                      Ответить
                      • Это только если ты его либы хочешь юзать. поэтому он пути записывает в файлик для того что бы проще настроит депенденцис
                        Ответить
      • вообщето это 0 в ascii из двух чисел \(знак энкода) 0(значение 1) 0(значение 2). т.е. чисто с двойной разрядкой
        Ответить

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