V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

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

  •  2
     
  •   drymonfidelia · 2024-02-15 17:06:01 +08:00 · 6388 次点击
    这是一个创建于 368 天前的主题,其中的信息可能已经有所发展或是发生改变。
    更普及、门槛更低 这个明显不用举例了
    性能更高 来源: 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   ❤️ 5
    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
    没事谁愿意用 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   ·   实用小工具   ·   3311 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.