为什么 mpv 等很多软件使用 Lua 作为脚本语言,而不是更普及、门槛更低、性能更高(正文附来源)的 Javascript?如果要给软件加入用户自己编写扩展的功能, Lua 还是 JS 是更好的选择? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX    程序员

为什么 mpv 等很多软件使用 Lua 作为脚本语言,而不是更普及、门槛更低、性能更高(正文附来源)的 Javascript?如果要给软件加入用户自己编写扩展的功能, Lua 还是 JS 是更好的选择?

  •  2
     
  •   drymonfidelia 2024-02-15 17:06:01 +08:00 7172 次点击
    这是一个创建于 605 天前的主题,其中的信息可能已经有所发展或是发生改变。
    更普及、门槛更低 这个明显不用举例了
    性能更高 来源: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/lua.html
    44 条回复    2024-02-18 11:15:32 +08:00
    rocmax
        1
    rocmax  
       2024-02-15 17:14:49 +08:00 via Android
    因为 lua 可以方便地调用 c/c++
    adoal
        2
    adoal  
       2024-02-15 17:15:00 +08:00   1
    JS 性能更高吗?以前看过一篇论文,对常见的各种语言做了个 benchmarking ,脚本语言无 JIT 组 Lua 是第一,有 JIT 组 LuaJIT 是第一……
    ipwx
        3
    ipwx  
       2024-02-15 17:15:22 +08:00   1
    不上 jit 的情况下 lua 很快,js 很慢
    westoy
        4
    westoy  
       2024-02-15 17:15:50 +08:00
    早期 dhtml 时代 js 并不普及,PHP black book 作者公开在书里建议别用 js.......

    js 慢慢普及是 gmail 时代才开始的, 性能上去是 v8 出来后

    而且 lua 和 luajit 爆杀........
    inroading
        5
    inroading  
       2024-02-15 17:19:11 +08:00
    Javascript 只是在 Web 开发中占主导,Lua 可以很方便嵌入 mpv 这种桌面应用; Lua 更简单
    pursuer
        6
    pursuer  
       2024-02-15 17:19:23 +08:00
    只提性能,在不带 jit 的情况下,lua 的解释器实现是比 Javascript 更快的。不过好像也就 2-3 倍的样子
    如果带 jit ,那一般 js 说的是 v8/node ,我看了下电脑里的 node 排除掉 node_module 是 62.6mb ,可能是考虑有点大吧。
    dcsuibian
        7
    dcsuibian  
       2024-02-15 17:22:52 +08:00
    我觉得性能不是问题,主要是开发语言
    比如 Postman 包含一个基于 Node.js 的运行时,自然就会支持 Javascript 脚本
    如果是 C/C++开发的程序,那 Lua 或 Python 脚本就挺正常
    drymonfidelia
        8
    drymonfidelia  
    OP
       2024-02-15 17:25:49 +08:00
    @pursuer 纯 V8 看起来也没多大,我看 Microsoft.ClearScript.V8 才 768KB
    drymonfidelia
        9
    drymonfidelia  
    OP
       2024-02-15 17:26:57 +08:00
    @dcsuibian 如果我要给用 C#开发的跨平台程序加入脚本功能,Lua 还是 JS 更合适?看起来 Jint 相比 Lua 的解析器更成熟 ( V8 那个好像不能跨平台)
    icyalala
        10
    icyalala  
       2024-02-15 17:45:18 +08:00
    如果从开发者(而不是脚本使用者)的角度来看,Lua 显然是更容易集成的。
    纯粹的 C89 ,代码量非常少,编译超简单,想怎么集成就怎么集成,也不用考虑 C++ 和跨平台之类的各种问题。
    License 也是 Public Domain 的,没有其他顾虑。

    如果把 JS 要用在脚本语言,还是看看 quickjs 吧,至少体积和使用难度比 v8 小多了。
    kneo
        11
    kneo  
       2024-02-15 18:21:38 +08:00 via Android
    开发者友好,安装包体积友好。
    lijiangang886
        12
    lijiangang886  
       2024-02-15 18:21:48 +08:00
    为什么 lua 在游戏开发中应用普遍? - 韦易笑的回答
    https://www.zhihu.com/question/395593519/answer/2738722877

    总之就是 quickjs 出来的太晚了
    Trim21
        13
    Trim21  
       2024-02-15 18:41:13 +08:00 via Android   2
    额,你们都在说什么,mpv 支持 js 脚本啊…
    june4
        14
    june4  
       2024-02-15 18:58:00 +08:00
    lua 比 js 快?我不能相信
    ly841000
        15
    ly841000  
       2024-02-15 19:05:21 +08:00
    @drymonfidelia #8 这个只是包装的 DLL 大小,真实大小是 runtimes 目录下的 有 20 多 M
    phrack
        16
    phrack  
       2024-02-15 19:23:46 +08:00 via iPhone   6
    Javascript 程序员收收味,真是哪里都能看到你们。这垃圾语言设计的时候就没整好,要不是碰巧是给浏览器绑定早死绝了
    drymonfidelia
        17
    drymonfidelia  
    OP
       2024-02-15 19:40:25 +08:00
    @Trim21 自带的脚本都是 lua 写的
    lijiangang886
        18
    lijiangang886  
       2024-02-15 19:47:05 +08:00   1
    @phrack #16 原文:“Javascript 程序员收收味,真是哪里都能看到你们。这垃圾语言设计的时候就没整好,要不是碰巧是给浏览器绑定早死绝了”
    ======
    回复:你说得对,但 lua 也不比 js 好,甚至更烂,要跟 lua 比烂那估计得把 php 搬出来
    ikas
        19
    ikas  
       2024-02-15 19:47:54 +08:00
    说到底它还不支持 Lua5.2 呢
    这种纯粹开发喜好问题
    vincent7245
        20
    vincent7245  
       2024-02-15 19:49:44 +08:00
    1 lua 不算小众
    2 lua 至少比 js 语法更友好
    leonshaw
        21
    leonshaw  
       2024-02-15 20:18:10 +08:00
    @phrack 屎上雕花的典范
    starrycat
        22
    starrycat  
       2024-02-15 20:34:47 +08:00 via Android
    得看历史性能数据吧,我猜 mpv 使用 lua 时应该比 js 更普及和性能更高吧,就算现在 js 更好,现有代码够用为什么要换?
    Al0rid4l
        23
    Al0rid4l  
       2024-02-15 21:23:44 +08:00
    论性能, JS 和 Lua 其实差不多的
    论生态, JS 大得多
    论语法, 都是动态弱类型, Lua 的索引默认 1 开始真没看出来哪里友好了, 异步语法更不用说
    JS 的确丑陋, 但 Lua 和优雅也不搭边, 搁这吹 Lua 的还是歇歇吧
    用 Lua 的考量基本上只会是体积小和容易集成
    wolfan
        24
    wolfan  
       2024-02-15 21:47:02 +08:00
    首先,这事得结合时代来看。
    lua 的时候,存储空间还是寸土寸金,而 lua 就那么点大,使用 lua 有存储上的优势。
    其次是当年 C 大行其道,用 lua 辅助不是很正常。
    最后是强大的惯性作用。

    所以用 lua 没毛病嘬。
    lambdaq
        25
    lambdaq  
       2024-02-15 23:24:44 +08:00
    为啥不用 Emacs Lisp ?
    sunzhuo
        26
    sunzhuo  
       2024-02-16 00:18:19 +08:00
    Lua 的语法还是很简单的,集成也简单。
    stimw
        27
    stimw  
       2024-02-16 02:41:15 +08:00 via Android
    @phrack 你 17 年的帖子:

    楼主玩过不少语言,目前主力 python 。
    经常因为项目需要会要写 java 和 js ,但是为什么我一直觉得 java 和 js 非常机车啊!
    java 脱离 IDE 根本没法写,有 IDE 也是一大坨一大坨,看的人眼睛疼,js 我尝试了三次去熟悉这个语言,每次都是玩到想哭,真的,就是想哭,为什么到处都是回调,我根本不明白整个程序的流程到底是怎么走的?
    谁能帮我脱离苦海?!

    合着你 7 年过去了零进步呗。js 黑也没黑到点上,回调函数也能黑,这辈子就只会写 python 是吧...

    当年还是正常就事论事只说语言,现在倒学会打地图炮喷整个群体了。
    dnfQzjPBXtWmML
        28
    dnfQzjPBXtWmML  
       2024-02-16 02:48:16 +08:00 via Android
    Lua 解释器简单啊,在单片机上都能用
    Cookmilk
        29
    Cookmilk  
       2024-02-16 03:13:16 +08:00 via iPhone
    Lua 轻,啥叫轻。就是功能少。
    phrack
        30
    phrack  
       2024-02-16 04:29:08 +08:00 via iPhone
    @stimw 我进步在 python 和 Java ,js 确实没进步。地图炮嘴嗨爽啊。
    HaroldFinchNYC
        31
    HaroldFinchNYC  
       2024-02-16 05:07:59 +08:00
    Lua compiler 很小,可以整合到软件里
    MetroWind
        32
    MetroWind  
       2024-02-16 05:31:05 +08:00   1
    没事谁愿意用 Javascript 这破玩意
    yf215
        33
    yf215  
       2024-02-16 08:48:49 +08:00 via Android
    Quickjs 相对 luavm 性能还是差点,不过现在很多项目都是集成 quickjs 了。
    rrfeng
        34
    rrfeng  
       2024-02-16 10:05:35 +08:00 via Android
    小巧,不能玩花有时候也是优势。

    你整个 js 进去,随便拉个库 import 几十个 modules…

    说大项目不好重构的,不适合 lua 就是不适合,别强行用。
    pursuer
        35
    pursuer  
       2024-02-16 10:28:52 +08:00
    @lijiangang886
    @Al0rid4l
    lua 的设计我觉得不算差吧,索引为 1 只是规范问题,和多数语言不一致。_ENV upvalue 设计我觉得比 js 好,可以防止变量泄漏到全局,而且运算符的一致性也更好一点,例如经典 js 的==,虽然现在基本都用===了,js 用+做字符串连接,其他符号又转换为数字计算。lua 还支持有栈协程,也更灵活一些。lua 设计的时候就考虑尽可能快,所以排除 jit 的话有兼容性负担的 js 上限大概是达不到 lua 的水平的。

    但说到底这些设计上的差异并没有多大影响,js 优势就有非常强大的兼容性和生态,语法糖也更甜。这就足够了。

    @drymonfidelia 9#
    如果考虑 js 的话,有个 txiki.js 的项目可以看看,quickjs 基础上增加了一些 web api 支持
    如果脚本可能很复杂的话我觉得考虑下 rpc ,类似 Language Server Protocol 这样的
    jsq2627
        36
    jsq2627  
       2024-02-16 13:13:34 +08:00 via iPhone
    v8 的 embedding 难度比 lua 高多了
    mengzhuo
        37
    mengzhuo  
       2024-02-16 21:41:56 +08:00
    最近在实现 js 相关的解析器,发现要是现实的语法功能对比其他语言实在是太复杂了。
    而这些都是嵌入脚本式语言要避免的地方,尽量简单并能完成工作。
    Al0rid4l
        38
    Al0rid4l  
       2024-02-16 22:24:13 +08:00
    @pursuer "和多数语言不一致" 这就是不友好, 不然 Brainfuck 都能说自己友好, 每个语言的槽点都能说是规范问题, 毕竟谁还没个规范了

    上限是达不到 Lua, 不过主流解释器/编译器都带 JIT, 每个都有好爹, 实际情况就是 JS(JIT)和 LuaJIT 差不多, 但你把人家好爹排除了
    kaiveyoung
        39
    kaiveyoung  
       2024-02-16 22:43:15 +08:00 via Android
    你如果写过就知道了,Lua 和 C/C++集成互相调用非常方便,甚至都不用拷贝变量,直接使用 Lua 访问原生 C++对象。而且一个 5M 大小的 C++程序,在 600MHz 主频,128M 内存的嵌入式设备上运行
    ZhiyuanLin
        40
    ZhiyuanLin  
       2024-02-17 01:09:23 +08:00
    你嵌入过就知道,lua.h 比 v8.h 的 API 好用多了……
    byzod
        41
    byzod  
       2024-02-17 16:13:56 +08:00 via Android
    你是浏览器大战的时候没关注吧, 那时候的 js 性能只能用一坨屎来形容
    什么拳打 lua 脚踢 native, 都是卷出来的
    tywtyw2002
        42
    tywtyw2002  
       2024-02-18 08:34:36 +08:00 via iPhone   1
    lua 快啊

    程序插件脚本,基本上只需要实现基业务逻辑就行了,剩下的函数去 call api 。性能什么,并不拼浮点计算。

    lua 不爽的就是没原生 class ,table 有时候让人很头痛,还有就是 string 操作还是很原始。

    写 wow ,neovim 插件,你发现大部分操作都是 if else 然后 call api 。性能相关的函数都是 call c api 去解决的。
    mudssky
        43
    mudssky  
       2024-02-18 10:17:30 +08:00
    mpv 几年前我开始用的时候就支持 js 脚本了,我写 mpv 脚本都是用 ts 然后编译到 es5 就可以了。
    rockcat
        44
    rockcat  
       2024-02-18 11:15:32 +08:00
    用 Lua 主要是 runtime 小巧,js 的 runtime 太大了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5511 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 08:46 PVG 16:46 LAX 01:46 JFK 04:46
    Do have faith in what you're doing.
    ubao 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