我一开始选择学 llvm,是发现 llvm 可以把代码编译成各种平台上的二进制,llvm ir 可以跨平台,我就想着,把自己的代码 转换为 llvm ir 就可以了
llvm ir 里默认有 加法和减法的指令
比如加法:
; ModuleID = "ttt"
target triple = "unknown-unknown-unknown"
target datalayout = ""
define double @"fpadd"(double %".1", double %".2")
{
entry:
%"res" = fadd double %".1", %".2"
ret double %"res"
}
打印功能,我 间接调用了 c 语言的 printf (我看到网上其他人也是如此的,我就抄来了):
; ModuleID = ""
target triple = "unknown-unknown-unknown"
target datalayout = ""
define i32 @"main"()
{
main.entry:
%".2" = getelementptr inbounds [5 x i8], [5 x i8]* @".str0", i32 0, i32 0
%".3" = call i32 (i8*, ...) @"printf"(i8* %".2")
ret i32 0
}
declare i32 @"printf"(i8* %".1", ...)
@".str0" = constant [5 x i8] c"1111\00"
假如我要读取硬盘里的文件,请求某个网址, 是不是无法基于 llvm ir 来实现,只能想办法 间接调用 c 语言的接口?
可是这样的话,那 llvm ir 对于我就没有存在的价值了, 那我为什么不直接用 c 语言开发一门语言,类似 python 基于 c 语言那样? 不是更简单吗
有大哥能解释一下吗?
谢谢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.