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

    0

    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
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    function f1() 
    {               
      print("Hello World!");    
    }
    
    function run(f: () => void)
    {
      f();
    }
    
    function main() {    
     const x = f1;
     x();                                
     run(x);
    }
    
    // LLVM IL 
    
    ; 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"
    
    @frmt_11120820245497078329 = internal constant [4 x i8] c"%s\0A\00"
    @s_11208736881023205110 = internal constant [14 x i8] c"Hello World!\00\00"
    
    declare i8* @malloc(i64)
    
    declare void @free(i8*)
    
    declare i32 @printf(i8*, ...)
    
    define void @f1() !dbg !3 {
      %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @frmt_11120820245497078329, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @s_11208736881023205110, i64 0, i64 0)), !dbg !7
      br label %2, !dbg !9
    
    2:                                                ; preds = %0
      ret void, !dbg !9
    }
    
    define void @run(void ()* %0) !dbg !10 {
      %2 = alloca void ()*, align 8, !dbg !11
      store void ()* %0, void ()** %2, align 8, !dbg !11
      %3 = load void ()*, void ()** %2, align 8, !dbg !11
      call void %3(), !dbg !13
      br label %4, !dbg !14
    
    4:                                                ; preds = %1
      ret void, !dbg !14
    }
    
    define void @main() !dbg !15 {
      %1 = alloca void ()*, align 8, !dbg !16
      %2 = alloca void ()*, align 8, !dbg !19
      store void ()* @f1, void ()** %2, align 8, !dbg !19
      %3 = load void ()*, void ()** %2, align 8, !dbg !19
      call void %3(), !dbg !20
      %4 = load void ()*, void ()** %2, align 8, !dbg !19
      %5 = bitcast void ()** %1 to i8*, !dbg !16
      call void @llvm.lifetime.start.p0i8(i64 8, i8* %5), !dbg !16
      store void ()* %4, void ()** %1, align 8, !dbg !16
      %6 = load void ()*, void ()** %1, align 8, !dbg !16
      call void %6(), !dbg !21
      %7 = bitcast void ()** %1 to i8*, !dbg !22
      call void @llvm.lifetime.end.p0i8(i64 8, i8* %7), !dbg !22
      br label %8, !dbg !23
    
    8:                                                ; preds = %0
      ret void, !dbg !23
    }
    
    ; Function Attrs: argmemonly nofree nosync nounwind willreturn
    declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0
    
    ; Function Attrs: argmemonly nofree nosync nounwind willreturn
    declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #0
    
    attributes #0 = { argmemonly nofree nosync nounwind willreturn }

    продолжаем говнокодить компилятор аля TypeScript в нативный код. ну это как С компилятор только без тупо-уродо-* у имен переменных

    1) компилим точно также как и до этого в постах
    2) получаем результат

    >> Hello World!
    Hello World!

    Запостил: ASD_77, 29 Апреля 2021

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

    • ну типа первый нах :)
      Ответить
    • Как много байткода высирается, чтобы написать хеловорд!
      Ответить
      • это видать в дебаг компиле LLVM вкомпиливает дебаг инфу для анализа.
        Ответить
    • где все флудисты?
      Ответить
    • А как ты будешь GC реализовывать?
      Ответить
      • Система приберёт потом.
        Ответить
        • полностью согласен. нет смысла делать то что система и так может сделать сама
          Ответить
      • для начала есть команда "delete" :) потом есть GC поддержка в LLVM (ни абы какая но есть). и есть а еще https://v8.dev/blog/high-performance-cpp-gc. есть https://www.hboehm.info/gc/ . а еще можно без GC а только с каунтерами но там цикличная проблема может возникнуть
        Ответить

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