以练代学,用 Rust 实现 Lua 解释器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
LoongRiver
V2EX    程序员

以练代学,用 Rust 实现 Lua 解释器

  •  
     
  •   LoongRiver 2023-07-13 22:24:52 +08:00 2717 次点击
    这是一个创建于 873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近写了一系列文章,《用 Rust 实现 Lua 解释器》,顾名思义,介绍用 Rust 从零开始实现一个 Lua 解释器,还请大家多提意见。

    我是在前年开始学习 Rust 语言。我平时工作的主力语言是古老又简陋的 C ,所以对现代编程语言的高级特性(比如泛型)基本上是第一次接触,更不要提 Rust 的所有权机制了。在读完《 Rust 程序设计语言》并写了些练习代码后,深感必须通过一个较大的项目实践才能理解和掌握。实现一个 Lua 解释器就很适合作为这个练习项目,规模适中,足够涉及 Rust 的大部分基础特性而又不至于难以企及。

    在这个项目过程中,就有了把整个过程记录下来的想法。以前还在上学时从同学那里看到一本于渊的《自己动手写操作系统》,按照书中的教程实现了一个简单的操作系统,收获巨大。首先是课堂上学的操作系统等理论都落地了,其次是接触到了真实的项目并意识到了自己的无知,最后在这个过程中学习到的 ubuntu, vim, gcc, makefile 等算是给后来的工作开了个好头,并一直使用到现在。所以,我想把这个从头开始实现 Lua 解释器的过程写下来,应该也是很有意义的。于是就有了这系列文章。

    学习之作,难免错误。希望各位多提意见。

    18 条回复    2023-07-27 22:42:54 +08:00
    llbbzh
        1
    llbbzh  
       2023-07-14 00:22:05 +08:00
    谢谢楼主,有空一定会跟着学习!!
    其实这类文章,最怕的就是作者贴一大段代码,然后文字只有几个字,看到作者写了不少字,就感觉已经很了不起了
    yl20181003
        2
    yl20181003  
       2023-07-14 08:54:17 +08:00
    感谢分享
    LoongRiver
        3
    LoongRiver  
    OP
       2023-07-14 09:03:13 +08:00
    @llbbzh 赞同。所以我在写的时候,尽量多画图,然后是列表,再然后是文字,实在不行再贴代码。
    lizhenda
        4
    lizhenda  
       2023-07-14 09:16:39 +08:00
    厉害了,感谢分享
    Helsing
        5
    Helsing  
       2023-07-14 09:18:31 +08:00 via iPhone
    厉害,先收藏了
    kernelpig
        6
    kernelpig  
       2023-07-14 09:45:00 +08:00
    感谢分享
    suyuyu
        7
    suyuyu  
       2023-07-14 11:05:57 +08:00
    显得我很笨
    huihuiHK
        8
    huihuiHK  
       2023-07-14 11:28:16 +08:00
    厉害。后面可以出书了
    wxf666
        9
    wxf666  
       2023-07-14 11:41:01 +08:00
    性能有提升吗?
    Slurp
        10
    Slurp  
       2023-07-14 12:06:08 +08:00
    @wxf666 不看正文?学习用途讲啥性能。
    wxf666
        11
    wxf666  
       2023-07-14 12:13:59 +08:00
    @Slurp #10 我经常看到,用 Rust 重写其他语言的项目,性能就提升几十倍,的文章,

    现在又看到了类似文章,所以就来问问啦
    LoongRiver
        12
    LoongRiver  
    OP
       2023-07-14 12:17:30 +08:00
    @wxf666 虽然主要是为了学习,但是也会考虑性能方面。追求性能的话,对 Rust 学的就更深入些。

    1. Lua 的官方实现本身已经在性能方面很高效了,要想全面超过基本不可能的了。能尽力做到一致就很知足了。

    2. 因为个人能力不足,所以直接使用了 Rust 的 Rc 来做垃圾回收。一般认为 RC 比狭义的 GC 要慢。具体讨论可以参见文章中的 [垃圾回收和 Rc]( https://wubingzheng.github.io/build-lua-in-rust/zh/ch03-05.gc_vs_rc.html) 这节。

    3. 但在某些方面,我的实现是比 Lua 的官方实现要更高效的。主要是对短字符串的处理。具体参见 [字符串定义]( https://wubingzheng.github.io/build-lua-in-rust/zh/ch03-01.string_type.html) 这节。

    4. 我做了一些简单的性能测试。很多情况下比官方实现慢 1 倍,但有的情况下,比如短字符串比官方实现快一些。不过我希望能在完成大部分功能后,再去做完整的性能测试和优化。所以目前做的性能测试就没贴出来。
    amiaaaz
        13
    amiaaaz  
       2023-07-14 15:54:34 +08:00
    牛,感谢分享
    zuisong
        14
    zuisong  
       2023-07-14 16:23:09 +08:00
    最近正在跟着这个课程学习,结果作者出现了 感谢分享
    LoongRiver
        15
    LoongRiver  
    OP
       2023-07-14 17:49:20 +08:00
    @zuisong 欢迎多提意见 :)
    u823tg
        16
    u823tg  
       2023-07-14 23:32:43 +08:00
    加油,感谢分享。
    ViVi333
        17
    ViVi333  
       2023-07-18 10:07:36 +08:00
    楼主啊,写的很好,我也很想学学。但是我不会 rust 啊,看的很吃力,能不能把 rust 改成伪代码或 c 啊,这样受众会广很多。楼主看到我看到我。
    LoongRiver
        18
    LoongRiver  
    OP
       2023-07-27 22:42:54 +08:00
    @ViVi333 我的本意是为了学习 Rust ,而拿 Lua 解释器作为一个练手的项目。

    不过你不会 Rust ,这也是有好处的。就是你可以只看文章里的文字说明部分,然后用自己的理解,用 C 语言自己实现一遍。如果我本来就是用 C 语言介绍的,那你可能就偷懒了,只是自己看一遍而不去自己实现,或者自己实现的时候不独立思考而是直接照搬我的代码。

    自己实现一遍的收获 是远大于 只看一遍文章的。

    不过 Lua 的官方实现是 C 语言,你也可以参考。网上也有很多源码阅读的文章,也有几本相关的实体书。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4249 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 05:34 PVG 13:34 LAX 21:34 JFK 00:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86