【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
编程语言是构成软件的基石,是算法的载体,是广大程序员群体赖以生存的技能,以及进行发明创造的快乐源泉。然而世界上的编程语言千千万,每年还会涌现出更多新的编程语言,设计并开发一个编程语言真的有那么神秘嘛?实际上,大多数编程语言的编译器早期都是使用 C 和 C++ 等系统语言开发,与一般的软件工程别无二致,但是近年来随着 Rust 这门高性能、高安全的系统语言的热度逐渐攀升,也涌现了很多直接使用 Rust 语言编写的编译器,那么该如何使用 Rust 设计并开发自己的一个领域编程语言呢?
OSCHINA 本期高手问答 (11 月 10 日 - 11 月 16 日) 我们请来了徐鹏飞老师和大家一起探讨关于编程语言设计与开发相关的问题。
可讨论的问题包括但不限于:
- 编程语言及编译器相关设计与开发
- 云原生配置相关内容
- 区块链智能合约相关内容
- Rust 语言相关内容
此外,还可以专注于开源的使用 Rust 语言开发的领域编程语言 [KCL] 的源码、设计、实践等相关细节进行提问和讨论。
嘉宾介绍
徐鹏飞,蚂蚁集团工程师,工作长期聚焦在 Rust 语言及编程语言设计与开发领域,包括编译器前端、编译器中后端、LLVM、WASM 等。KCL 记录及函数语言、Sonar 智能合约语言核心设计与开发工程师。
- KCL 项目地址: https://github.com/KusionStack/KCLVM
- Github: https://github.com/Peefy
- 开源中国:https://my.oschina.net/u/4724711
为了鼓励踊跃提问,我们会在问答结束后从提问者中抽取 5 名幸运会员赠予随机福袋一份。
OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。
下面欢迎大家就编程语言设计与开发相关的问题向徐鹏飞老师提问,请直接回帖提问。
高手问答第 293 期 —— 用 Rust 语言设计并开发领域编程语言
@iman123 @pyboy58 @赤脚小子 @權少 @osc_69835966
恭喜以上5位网友分别获得幸运福袋一份。
请于11月25日12:00前登陆账号, 私信 @yaosaya 告知快递信息(格式:姓名+电话+地址)
@徐鹏飞Peefy 你好,目前rust我感觉已经很成熟了,性能很好,跨平台,目前也有很多的工具链都是用rust来编写或者重写,但是相比golang学习曲线较陡,生态系统的crates可能质量还有待提高,你感觉未来相比golang,哪个会发展的越来越强大?
我也对各种编程语言感兴趣,有没有rust编写其他编程语言完整示例,是不是解释型要好实现一些,编译型的涉及到更多的平台底层实现,稍难一点?
个人感觉国内自己的编程语言几乎没有,这是什么原因造成的,是不是因为很多时候都是短期利益导致的,不愿做更多的投资大收益风险大的基础性研究,还是难以形成一个良性的生态系统继续演进发展?
@徐鹏飞Peefy 1.你好,Rust语言和java微服务这块业务可以怎么结合?
2.小白要怎么学习Rust语言, 学会了Rust 可以做啥东西,比较好?
3.https://github.com/KusionStack/KCLVM 我看你这个项目里有go和Python的 , 这是自己新创建了一个Kusion 配置语言(KCL) ,脚本语言吗?
@徐鹏飞Peefy 蚂蚁有用 rust ? 主要在哪部分使用呀?使用场景是什么?还有 rust 有前途吗?
@徐鹏飞Peefy 👍,有个老外靠重写 Monkey 语言编译器入门,https://www.influxdata.com/blog/rust-can-be-difficult-to-learn-and-frustrating-but-its-also-the-most-exciting-thing-in-software-development-in-a-long-time/
引用来自“pyboy58”的评论
@徐鹏飞Peefy 1.你好,Rust语言和java微服务这块业务可以怎么结合?
2.小白要怎么学习Rust语言, 学会了Rust 可以做啥东西,比较好?
3.https://github.com/KusionStack/KCLVM 我看你这个项目里有go和Python的 , 这是自己新创建了一个Kusion 配置语言(KCL) ,脚本语言吗?
个人根据经验简单回答一下
1. 微服务这块我了解不多,我倒是知道一些项目比如 https://github.com/apache/dubbo-rust 可以考虑作一定结合。此外,Rust 官方也在不遗余力地支持 Rust 异步模型用于网路场景:https://www.rust-lang.org/what/networking,这块的门槛也在逐渐降低,可能还是要看具体的使用场景和指标,上手,研发和维护效率综合来看
2. 我个人的经验是找官方的文档,边学边练,也多学习优秀开源 Rust 项目,学会上理论什么都可以做的,做些场景适合(要求高性能、安全)的东西感觉较好,练手的话感觉可以简单的做些 CLI 工具、简单的 server 应用等
3. 我们使用 Rust 设计并研发了一个 KCL,主要用在配置和策略场景,算作一个领域编程语言吧,类似 ngnix 配置那种,但是融入了更多现代编程语言元素,可编程能力更强一些。更多介绍可以访问项目仓库 https://github.com/KusionStack/KCLVM 和我们的网站 https://kusionstack.io/
@徐鹏飞Peefy 你好,请问rust的相关问题
我们说发明一种新工具/语言,一定是想解决一些具体的问题。
rust从各种宣传上来看,是牺牲了编码的体验来换取绝对的内存安全。
性能上对标c,超越一众带gc的语言。
还记得学c时被指针支配的恐惧,想请问rust里最难啃的骨头是哪部分,对初学者如何啃下来?
以及每换一种语言/框架都是在学习一种新的编程思想,比如前端的vue,react后端的webflux,spring
那么针对rust,他的核心思想是什么样的呢?
引用来自“赤脚小子”的评论
@徐鹏飞Peefy 你好,请问rust的相关问题
我们说发明一种新工具/语言,一定是想解决一些具体的问题。
rust从各种宣传上来看,是牺牲了编码的体验来换取绝对的内存安全。
性能上对标c,超越一众带gc的语言。
还记得学c时被指针支配的恐惧,想请问rust里最难啃的骨头是哪部分,对初学者如何啃下来?
以及每换一种语言/框架都是在学习一种新的编程思想,比如前端的vue,react后端的webflux,spring
那么针对rust,他的核心思想是什么样的呢?
从我个人的经历以及众多 Rust 开发人员大多数选择来看,Rust 中最难理解的应该是 lifetime 生命周期这块,因为它同时耦合了类型系统,内存管理,作用域等相关概念,而且有时错误提示比较迷惑,容易陷入编译错误无法自拔。对于初学者我的建议就是多学多写多才坑,因为俗话说师傅领进门,修行在个人;实践是最好的老师。针对 Rust,我感觉它的核心思想是 Trust,当然不一定准确, 就是你可以把一些其他语言在运行时才能完成的东西放到编译时,比如与 C++ 段错误缠斗的时间转换为与 Rust 编译器编译报错缠斗,并发程序默认检查安全,这些都是一些广大开发着比较容易踩到坑,然后把这些坑转换为语言或者编译器内置的东西,同时 Rust 还能带来不错的程序抽象和高性能,又不会像 C++ 那样较为复杂。就像您提到的学习 c 被指针支配的恐惧,就是有编程语言不会将这些概念暴露到用户使用的编程语言界面,本质上编程语言还是面向开发者的工具,Rust 可以让我们相信这个工具,只是这个工具使用前需要安装安装,用多了就趁手了。
引用来自“osc_69835966”的评论
@徐鹏飞Peefy 你好,一般认为C++,Java这类面向对象的编程语言相比C语言一类更适合软件工程开发,然而现在go也好,rust也好,都在弱化面向对象功能。这是为什么呢?面对对象的构架,和go,rust的struct的构架比较,有什么用的优劣呢?
我个人理解软件工程应该不仅包含写代码这个层面,还包含了可维护性等其他问题。如果仅从编程语言的角度回答这个问题,可以看看我在知乎的这个回答:https://www.zhihu.com/question/511958588/answer/2724843611。
一些现代编程语言更多地采用组合而不是继承的方式实现结构或者行为的复用,实际上有 class 的(我理解题主的意思应该是 OOP 的结构和继承)也提供了很多组合方式来实现复用(比如范型、接口等语言特性),因此从功能完备性角度来说,其实采用其中一种都能完成功能,而我个人观点来看,仅选取组合(比如范型和接口等具体实现方式)的其中一个好处是
继承没法很好地同时用于函数和数据结构的复用(继承本身的问题也多,比如单继承限制,各种继承需要考虑的问题,语言需要提供一大堆关键字比如 override, virtual 等来完善),但是范型等组合方式却可以同时用于结构和函数,因此一些新兴的编程语言更倾向给用户提供组合方式而不是继承方式。
引用来自“iman123”的评论
@徐鹏飞Peefy 你好,目前rust我感觉已经很成熟了,性能很好,跨平台,目前也有很多的工具链都是用rust来编写或者重写,但是相比golang学习曲线较陡,生态系统的crates可能质量还有待提高,你感觉未来相比golang,哪个会发展的越来越强大?
我也对各种编程语言感兴趣,有没有rust编写其他编程语言完整示例,是不是解释型要好实现一些,编译型的涉及到更多的平台底层实现,稍难一点?
个人感觉国内自己的编程语言几乎没有,这是什么原因造成的,是不是因为很多时候都是短期利益导致的,不愿做更多的投资大收益风险大的基础性研究,还是难以形成一个良性的生态系统继续演进发展?
确实在我个人项目的实践过程中 Rust 存在学习曲线陡峭和 crates 生态等问题(这个官方也将这两个列为 Rust 未来发展的十个问题中的两个),Golang 和 Rust 我个人觉得未来是两门齐头并进都会越来越强大的语言,当然目前 Golang 的社区活跃度和开发者人数较为多一些,这两个语言我个人都很喜欢,并且社区中越来越多的项目同时采用 Golang 和 Rust,是一个好的趋势。
一般来说,编译器的实现解释型好实现一些,编译型的编译器确实要对接到不同的平台底层,稍难一些,不过有 LLVM 这样的编译器框架大大降低了对接不同平台的难度,同时可能还要在语义分析阶段做大量工作,比如类型推导和类型检查。用 Rust 编写的编译器项目还是蛮多的(Rust 项目在 Github 上 star 数最多的就是编译器项目了),rust, deno, swc, pualang, starlark-rust 等。
还有稍微推荐下我个人正在参与的项目 KCL:https://github.com/KusionStack/KCLVM
国内自己的编程语言或者说影响力较高的通用语言项目确实还不多,我个人感觉主要原因是国内可能主要还是起步晚一些,编译器最火的时候应该是上世纪 60-80 年代,国外做了很多的研究、探索和实现。国内起步较晚,并且感觉后来者更难的是难以形成一个良性的生态系统继续演进发展。不过最近几年国内也在编译器领域奋起直追,涌现了很多有影响力的项目,比如 rescript, taichi 等等。我相信未来会更好!