V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LoongRiver
V2EX  ›  程序员

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

  •  3
     
  •   LoongRiver · 282 天前 · 1613 次点击
    这是一个创建于 282 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近写了一系列文章,《用 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  
       282 天前
    谢谢楼主,有空一定会跟着学习!!
    其实这类文章,最怕的就是作者贴一大段代码,然后文字只有几个字,看到作者写了不少字,就感觉已经很了不起了
    yl20181003
        2
    yl20181003  
       281 天前
    感谢分享
    LoongRiver
        3
    LoongRiver  
    OP
       281 天前
    @llbbzh 赞同。所以我在写的时候,尽量多画图,然后是列表,再然后是文字,实在不行再贴代码。
    lizhenda
        4
    lizhenda  
       281 天前
    厉害了,感谢分享
    Helsing
        5
    Helsing  
       281 天前 via iPhone
    厉害,先收藏了
    kernelpig
        6
    kernelpig  
       281 天前
    感谢分享
    suyuyu
        7
    suyuyu  
       281 天前
    显得我很笨
    huihuiHK
        8
    huihuiHK  
       281 天前
    厉害。后面可以出书了
    wxf666
        9
    wxf666  
       281 天前
    性能有提升吗?
    Slurp
        10
    Slurp  
       281 天前
    @wxf666 不看正文?学习用途讲啥性能。
    wxf666
        11
    wxf666  
       281 天前
    @Slurp #10 我经常看到,用 Rust 重写其他语言的项目,性能就提升几十倍,的文章,

    现在又看到了类似文章,所以就来问问啦
    LoongRiver
        12
    LoongRiver  
    OP
       281 天前
    @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  
       281 天前
    牛,感谢分享
    zuisong
        14
    zuisong  
       281 天前
    最近正在跟着这个课程学习,结果作者出现了 🥳 感谢分享
    LoongRiver
        15
    LoongRiver  
    OP
       281 天前
    @zuisong 欢迎多提意见 :)
    u823tg
        16
    u823tg  
       281 天前
    加油,感谢分享。
    ViVi333
        17
    ViVi333  
       277 天前
    楼主啊,写的很好,我也很想学学。但是我不会 rust 啊,看的很吃力,能不能把 rust 改成伪代码或 c 啊,这样受众会广很多。楼主看到我看到我。
    LoongRiver
        18
    LoongRiver  
    OP
       268 天前
    @ViVi333 我的本意是为了学习 Rust ,而拿 Lua 解释器作为一个练手的项目。

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

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

    不过 Lua 的官方实现是 C 语言,你也可以参考。网上也有很多源码阅读的文章,也有几本相关的实体书。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   916 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:08 · PVG 04:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.