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

2021-01-17 14:34:51 +08:00
 piqizhu8

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


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

请问我的观点对吗?

各位前辈能给点意见吗?

2417 次点击
所在节点    问与答
24 条回复
AndyAO
2021-01-17 15:28:36 +08:00
想问一问

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

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

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

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

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

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

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

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


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

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

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

不知道前辈有什么建议吗

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

一线工程师
的区别

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX