V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
find456789
V2EX  ›  问与答

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

  •  
  •   find456789 · 2020-12-22 00:28:14 +08:00 · 916 次点击
    这是一个创建于 1435 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    有大哥能解释一下吗?

    谢谢

    4 条回复    2020-12-22 09:09:40 +08:00
    agagega
        1
    agagega  
       2020-12-22 00:40:16 +08:00 via Android   ❤️ 1
    llvm ir 存在的价值就不是为了跨平台的啊。你可以把它理解为一种经过精心设计,比较高级的汇编语言。要用它实现高级功能,你就需要调系统的若干接口。这些往往都是面向 C 的。
    msg7086
        2
    msg7086  
       2020-12-22 00:51:18 +08:00   ❤️ 1
    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
        3
    CEBBCAT  
       2020-12-22 00:52:55 +08:00 via Android   ❤️ 1
    看到楼主的进步了,我觉得是挺快的,士别三日当刮目相看的感觉。

    不过学的还是太少,比如还不了解解释型和编译型语言。关于操作系统的 syscall 也需要学习,其实成体系学习操作系统是有好处的
    cmostuor
        4
    cmostuor  
       2020-12-22 09:09:40 +08:00   ❤️ 1
    要想开发一门语言就得要先制定各种规范 这个可以参考已经成熟的编程语言的规范文档 然后在根据规范展开 比如用 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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1286 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:01 · PVG 02:01 · LAX 10:01 · JFK 13:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.