我用 llvm 实现了 bb 语言的加法和减法,也套娃的实现了打印功能,那怎么实现更高级的,如 http 请求功能呢,该怎么套娃呢?套 c 语言吗

2020-12-22 00:28:14 +08:00
 find456789

我一开始选择学 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 语言那样? 不是更简单吗

有大哥能解释一下吗?

谢谢

877 次点击
所在节点    问与答
4 条回复
agagega
2020-12-22 00:40:16 +08:00
llvm ir 存在的价值就不是为了跨平台的啊。你可以把它理解为一种经过精心设计,比较高级的汇编语言。要用它实现高级功能,你就需要调系统的若干接口。这些往往都是面向 C 的。
msg7086
2020-12-22 00:51:18 +08:00
Python 不基于 C 语言。

你说的那些功能都是运行时,不是语言。
什么是语言?语法和文法是语言。剩下的都是运行时和第三方类库。
比如说 Ruby 就有 stdlib,里面有打印字符,有读取文件,有访问网站的函数,这些都是运行时类库。
C 也有 libc,里面也有各种运行时类库。C 语言离开了 C 运行时,一样是什么大事都干不了。

因为你也没说你到底想干嘛,所以我也不知道什么东西对你有价值。
比如说 Python 里,a = b + c 是把 b 和 c 加起来存进 a 里。
你今天一拍脑瓜说,我要实现一种新的语言,要写成 b + c => a 来做同样的事情。
那你就需要实现一门新的语言。

至于 llvm IR,本来就是中间语言。
也就是说,让你学 IR 不是让你去写 IR,而是让你开发一个编译器,把你的语言转译成 IR 然后交给 LLVM 再二次处理的。
也就是你最后一段说的,「用 c 语言开发一门语言」,这个开发就是要把你的 bb 语言转成 IR 。
CEBBCAT
2020-12-22 00:52:55 +08:00
看到楼主的进步了,我觉得是挺快的,士别三日当刮目相看的感觉。

不过学的还是太少,比如还不了解解释型和编译型语言。关于操作系统的 syscall 也需要学习,其实成体系学习操作系统是有好处的
cmostuor
2020-12-22 09:09:40 +08:00
要想开发一门语言就得要先制定各种规范 这个可以参考已经成熟的编程语言的规范文档 然后在根据规范展开 比如用 c 写个编译器 然后在用自己的新语言实现一些底层的 lib 和 runtime 你这样没有规范的弄很难做出啥东西来

创建一门新语言就跟建造一栋新楼房一样 开发商不可能一开始就瞎盖 得先知道自己要啥然后去专门的设计公司提出自己的需求找他们要设计方面 设计公司接到需求根据房屋用地的大小进行房屋功能区的分化 也就是做平面图 然后还得弄水电图啦 施工方案图啦 装修效果图等一堆设计图 开发商拿到这些图再去找人买材料按照施工方案把楼给盖起来

还有既然你反反复复提到 c 语言那去维基百科看看他的发展史 https://en.wikipedia.org/wiki/C_(programming_language)
c 语言规范文档网站 http://www.open-std.org/jtc1/sc22/wg14/ https://wenku.baidu.com/view/439688f0f61fb7360b4c6552.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/737666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX