【发布时间】:2018-10-18 15:10:55
【问题描述】:
这是我的第一个 Stackoverflow 问题 :-)
我的背景:
- 2 年 Python 经验
- 2个月的水晶语言经验(使用Amber框架运行的网站)
- 1 个月进入 C、C++、汇编
事实: - 水晶朗正在编译和运行没有任何问题 - 在 x86_64 上运行
请客气,因为我还没有太多低级语言知识。
据我了解,当我们使用 LLVM 编译和运行一个基本的 hello.c 文件时,它的内容如下:
你好.c:
#include
int main() {
printf("hello world\n");
return 0;
}
外壳:
$ 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"
外壳:
$ 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 在两种情况下都不相似?
- 我在水晶程序中做错了吗?
谢谢!
【问题讨论】:
标签: llvm-ir crystal-lang