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

想更熟悉 LLVM,是不是要学会 c++?还要学其他的吗?

  •  
  •   piqizhu8 · 2021-01-17 14:34:51 +08:00 · 2416 次点击
    这是一个创建于 1406 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的最终目标是创造一门编程语言


    因为我看到 wiki 上说,llvm 用 c++写的, 所以我猜想,如果我学会了 c++, 将来用 llvm 做东西(开发编程语言), 应该会容易很多

    请问我的观点对吗?

    各位前辈能给点意见吗?

    24 条回复    2021-01-18 12:42:20 +08:00
    AndyAO
        1
    AndyAO  
       2021-01-17 15:28:36 +08:00   ❤️ 1
    想问一问

    你开发编程语言是出于什么目的呢?

    单纯是为了兴趣还是解决某个实际问题?
    piqizhu8
        2
    piqizhu8  
    OP
       2021-01-17 15:29:10 +08:00
    @AndyAO

    谢谢, 也有兴趣, 也有解决某类问题
    AndyAO
        3
    AndyAO  
       2021-01-17 15:31:02 +08:00
    @piqizhu8 #2
    如果你能提供更多信息,我想会能收集到更多有用的线索,你目前说的东西太少了.
    我之所以想回答这个问题,是因为最近在看 Ruby 创始人松本行弘的书.
    里面讲了很多,他创造变成语言的故事,所以我对你这个问题还是比较感兴趣的,希望你能说多一些.
    yzbythesea
        4
    yzbythesea  
       2021-01-17 15:57:20 +08:00   ❤️ 1
    如果你是写一个 LLVM frontend,不用深入学 C++。
    secondwtq
        5
    secondwtq  
       2021-01-17 17:30:27 +08:00 via iPhone   ❤️ 1
    如果你想”创造编程语言”,也不必熟悉 LLVM……
    secondwtq
        6
    secondwtq  
       2021-01-17 17:30:53 +08:00 via iPhone
    倒是学学 C++可能对”创造编程语言”有更实际的帮助
    piqizhu8
        7
    piqizhu8  
    OP
       2021-01-17 20:32:54 +08:00
    @AndyAO

    谢谢, 我目前已经掌握了 python,我想开发一门类似 c,go 这样可以静态编译的语言, 我在网上搜索研究后,发现 llvm 不但可以作为后端直接编译,还可以跨平台,所以我就直接拿来用了,不用从头造轮子

    我目前,已经用 llvm+python 制作了一个支持加法、减法的 语言雏形, 由于加法、减法是 cpu 自带的功能(我之前看了一个讲操作系统的资料,明白了 cpu 默认是支持加减乘除、逻辑运算),所以借助 llvm 很容易实现加减乘除

    但是我不知道如何用 llvm 制作高级功能,如 打印文字、网络请求

    所以我就在想,是不是我需要学会 c++,以便更加了解 llvm

    因为我本身英语能力很弱,需要借助翻译工具才能看,最后能理解消化的内容就更少了
    piqizhu8
        8
    piqizhu8  
    OP
       2021-01-17 20:37:48 +08:00
    @secondwtq @yzbythesea


    谢谢,因为我已经掌握了 Python 的基本用法, 所以我想前端用 python 做词法、语法分析;后端用 llvm 编译成目标平台的机器码

    借助基础的 llvm ir,可以很容易实现 加减乘除, 但是 llvm ir 并没有提供 网络 io 、文件读取等高级功能

    我之所以想深入学 llvm,是因为我觉得深入学好 llvm 后, 我就可以用 llvm ir 实现 高级的 网络 io 、文件读取等功能

    不知道前辈有什么建议吗

    感谢
    linux40
        9
    linux40  
       2021-01-17 21:09:45 +08:00 via Android   ❤️ 1
    @piqizhu8 文件、网络这些不归 LLVM 管。
    hxndg
        10
    hxndg  
       2021-01-17 21:16:43 +08:00   ❤️ 1
    你需要区分计算机科学工作者

    一线工程师
    的区别

    一线工程师干事可是追求简单粗暴的。很多时候会有很离谱的事情发生。

    有点类似理论医学和临床医学,两波人互相鄙视。
    piqizhu8
        11
    piqizhu8  
    OP
       2021-01-18 01:04:40 +08:00
    @linux40

    谢谢, 用 llvm ir 有办法实现 文件 io 、网络请求吗? 或者如何间接的实现呢? 方便给个关键词吗 谢谢大哥
    piqizhu8
        12
    piqizhu8  
    OP
       2021-01-18 01:05:17 +08:00
    @hxndg

    谢谢, 不过我没有理解你要表达的意思, 方便展开说说吗
    Mithril
        13
    Mithril  
       2021-01-18 01:07:45 +08:00   ❤️ 1
    你说的打印文字、网络请求,都不是 LLVM 该做或者你想创造一门语言该有的功能。。。
    他只不过是语言本身提供的 SDK,STL 或者系统库的功能,也就是一个操作系统 API 的胶水层而已。
    语言本身的话,加减乘除就够了。
    piqizhu8
        14
    piqizhu8  
    OP
       2021-01-18 01:13:52 +08:00
    @Mithril

    谢谢
    我一直以为,编程语言该有的 [基本功能] ,在 llvm 里都可以找到, 我只需要,对我的语言进行词法、语法分析后,把功能映射到 llvm 就行了(因为目前我的编程语言的加减乘除,都是用的 llvm 提供的,所以我猜想,文件读写,网络请求,llvm 应该也有),



    看到你的解释,似乎我对 llvm 的理解有错误 ,llvm 没有封装操作系统的 api 吗

    看来我还需要深入研究才行

    现在我的编程语言已经可以实现加减乘除, 我该如何一步步让我的编程语言支持 文件读写,网络请求呢? 大哥能给一些关键词吗? 我想去搜索,深入了解一下

    谢谢大哥
    Mithril
        15
    Mithril  
       2021-01-18 01:27:50 +08:00   ❤️ 1
    @piqizhu8 所有涉及到硬件的东西,都需要硬件驱动进行支持。你觉得加减乘除不用,那是因为 LLVM 帮你做了这部分。LLVM 本质上也就是个编译器,通过前端和后端,把你的编程语言 A 翻译成另一种编程语言 B 。A 可以是自制的,B 可以是另一种,或者 B 干脆就是机器码。机器码你可以认为是 CPU 的硬件驱动支持的一种语言。
    但是你如果需要访问文件,或者发送网络请求,这部分是需要硬件驱动支持的,或者说需要你目标操作系统来帮助你进行这部分操作。这就需要你实现一个简单的运行时,把你编程语言的某些函数调用转换成目标操作系统支持的调用方式,从而使用操作系统的功能完成文件访问或者网络请求。操作系统会帮你把这些硬件驱动抽象成几个 API 调用,你直接去用就好了。
    个人觉得这没什么意义。你如果想要体验设计一个编程语言到这里就够了。或者你也可以搞个东西把你的语言转换成一种更加通用的语言,比如 Java 字节码,那就不需要考虑这些问题了。
    更重要的是你想通过这东西学到什么,花太多时间在这种实现相关的具体细节上面个人认为没什么必要。
    piqizhu8
        16
    piqizhu8  
    OP
       2021-01-18 02:29:21 +08:00
    @Mithril

    谢谢大哥, 我去了解了一下 jvm,发现有很多语言都基于 jvm,如 Groovy 、Scala 等等

    也明白了,基于 jvm 的好处, 但是好可惜,如此的话我得去学习 java

    我目前掌握了 python, 所以 我在思考, 能否 基于 pvm ( python vm ) 来制作一门编程语言

    不过可惜,似乎 pvm 远远比如 jvm 成熟、强大
    levelworm
        17
    levelworm  
       2021-01-18 04:17:29 +08:00 via Android   ❤️ 1
    可以看一下 crafting interpreter 这个网站,跟着走一遍就知道大概怎么写解释器、编译器了。不过编程语言
    levelworm
        18
    levelworm  
       2021-01-18 04:18:49 +08:00 via Android   ❤️ 1
    不过创作编程语言还是得了解一下编程语言理论方面的知识。解释器和编译器是编程语言创作者已经想好内容了然后他们负责实现的,但是创造编程语言本身并不仅仅是这些实现。
    levelworm
        19
    levelworm  
       2021-01-18 04:21:16 +08:00 via Android   ❤️ 1
    如果只用 python 的话可以看一下两个内容,一个是 python 版本的 sicp,最后一部分是教你用 Python 写 scheme 的解释器。还可以看 Peter Norvig 用 Python 写 Basic 解释器的源代码,不长就几百行。但是看之前需要大致了解一下解释器到底是怎么个构成的,里头的几个部分是如何工作的。
    levelworm
        20
    levelworm  
       2021-01-18 04:25:57 +08:00   ❤️ 1
    crafting interpreter:
    https://craftinginterpreters.com/contents.html
    这是比较平民化的解释器 /编译器教程,跟着写就可以了。

    Peter Norvig 的 BASIC 解释器:
    https://github.com/norvig/pytudes/blob/master/ipynb/BASIC.ipynb

    SICP (Python version):
    https://wizardforcel.gitbooks.io/sicp-in-python/content/21.html
    这一节是介绍如何写 scheme 解释器的,可以从上一节开始看起。
    Goldilocks
        21
    Goldilocks  
       2021-01-18 06:35:16 +08:00 via Android   ❤️ 1
    如果你不会 c++,你能用 llvm 做什么? llvm 的 code 和 API 都是 c++啊。
    sadfQED2
        22
    sadfQED2  
       2021-01-18 09:45:55 +08:00 via Android   ❤️ 1
    不是我打击你,你这基础,连编译器是干啥的都没弄明白吧,就像新发明编程语言。你真要搞,先把编译原理,计算机组成原理这些东西学明白,然后搞明白各种语言不同的优势,生态,这时候再开始吧

    或许说,第一步你先看看别人咋做的,看看 go 编译器源码,或者是看看 jvm 源码
    xarthur
        23
    xarthur  
       2021-01-18 10:41:11 +08:00 via iPhone   ❤️ 1
    1. llvm 官网上就有如何用 llvm 写一个编程语言的例子,走一遍就知道如何创造编程语言了。
    https://llvm.org/docs/tutorial/OCamlLangImpl1.html
    2. llvm ir 不能帮你解决 io 等问题,是标准库的功能,需要你自己实现。ir 只是中间码。
    3. 编译原理是计算机科学里的屠龙之计,但不是只要学会编译原理就能创造新的语言了,语言的各类标准库也是需要考虑的。还有异步,多线程模型和语法等等等
    4. 如果你要做静态类型语言,还需要了解类型系统。
    5 好的语言设计是一个取舍,所以要了解足够多的语言才知道怎么做取舍好。
    linux40
        24
    linux40  
       2021-01-18 12:42:20 +08:00   ❤️ 1
    @piqizhu8 #11 收藏多年的实现操作系统的教程,自己没时间看: https://littleosbook.github.io/#introduction
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:26 · PVG 22:26 · LAX 06:26 · JFK 09:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.