gpt4 book ai didi

llvm-ir - Crystal-lang:为什么 LLVM "hello.bc"是由 Crystal 或 clang 生成的不一样?

转载 作者:行者123 更新时间:2023-12-04 20:28:18 25 4
gpt4 key购买 nike

这是我的第一个 Stackoverflow 问题:-)

我的背景:

  • 2 年 Python 经验
  • 2 个月的 Crystal-lang 经验(使用 Amber 框架运行的网站)
  • 1 个月进入 C、C++、汇编

  • 事实:
    - Crystal-lang 编译运行没有任何问题
    - 在 x86_64 上运行

    请客气点,因为我还没有太多的低级语言知识。

    根据我的理解,当我们使用 LLVM 编译和运行一个基本的 hello.c 文件时,它是这样的:

    你好ç :
    #include
    int main() {
    printf("hello world\n");
    return 0;
    }

    shell :
    $ clang -O3 -emit-llvm hello.c -c -o hello.bc
    $ llc hello.bc -o hello.s
    $ gcc hello.s -o hello.native
    $ ./hello.native

    这来自 LLVM 示例)

    我的观点是,我们可以生成一个非常短的 hello.bc 文件(128 行),可以使用以下方法以较慢的方式运行:
    $ lli hello.bc

    但是当我尝试从 hello.cr 文件生成一个类似的 hello.bc 并像使用 hello.c 文件一样运行它时:

    你好.cr :
    puts "hello world"

    shell :
    $ crystal build hello.cr --emit llvm-bc --release
    $ llc hello.bc -o hello.s

    我注意到了什么:
  • 这个 hello.bc 文件比从 c 文件生成的文件大得多(43'624 行)
  • 此 hello.bc 不能使用“lli”运行,因为它会生成:

    “LLVM 错误:程序使用了无法解析的外部函数 'pcre_malloc'!
  • 我什至无法从 hello.s 编译为 hello.native
  • 同样的问题,如果我尝试使用 generate 和 hello.ll 文件

  • 据我了解,LLVM 是可移植的,并且所有前端语言都会生成一个中间 *.bc,然后可以将其编译为任何架构。

    我的问题是:
  • 为什么 hello.bc 在这两种情况下都不相似?
  • 我在 Crystal 程序中做错了什么吗?

  • 谢谢!

    最佳答案

    一切都正如它应该的那样。 Crystal 有一个运行时库,即使您没有包含任何东西,它也始终存在。这是运行 Crystal 程序所必需的。

    除了对 printf 的系统调用之外,C 示例几乎不包含任何其他内容。 .这就是为什么编译后的 ASM 也非常小。

    Crystal 的简单puts电话背后有更多的东西。它基于用于处理异步 IO、并发、信号处理、垃圾收集等的库。其中一些库完全在 Crystal 标准库中实现,一些使用直接嵌入到二进制文件中的其他库( libgc )或仍然需要来自系统的动态库( libpcrelibpthread )。

    默认情况下,任何 Crystal 程序都带有此运行时库。甚至是一个空程序。这通常完全没有引起注意,因为无论如何较大的程序最终都会需要这些东西,并且运行时库的编译二进制大小小于 500 KB(在 Release模式下)。
    像你这样的小程序并不真正需要所有这些来打印一个字符串。但是,Crystal 运行时需要这些库。

    注意:您可以在没有这些默认库的情况下编译 Crystal 程序。但这意味着您不能使用 Crystal stdlib 中的任何内容,您必须使用 Crystal 语法编写 C 代码(或实现您自己的 stdlib):

    require "lib_c"
    require "c/stdio"

    LibC.printf pointerof("hello world".@c)

    这可以用 --prelude=empty 编译选项,它将生成一个小得多的 ASM,大致类似于 C 示例。

    关于llvm-ir - Crystal-lang:为什么 LLVM "hello.bc"是由 Crystal 或 clang 生成的不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52877191/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com