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

如何自己实现一门脚本语言?并且内置注入一些函数什么的?

  •  
  •   8520ccc · 2022-01-10 08:27:01 +08:00 · 3352 次点击
    这是一个创建于 808 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主要应用场景类似沙盒?

    可以给这个脚本里内置注入一些可用的东西

    例如假设这个脚本需要绑定一个用户账户

    那我可以提供一个 user

    用户可以直接使用我内置提供的 user.transfer()进行转账

    即把能平台解决的工作都由平台解决,用户只需要专注于自己的事情就好了!

    请问这样的脚本语言应该如何实现?

    有什么较好的方案吗?
    22 条回复    2022-01-10 21:28:03 +08:00
    murmur
        1
    murmur  
       2022-01-10 08:28:30 +08:00
    你用 lua 就可以了
    8520ccc
        2
    8520ccc  
    OP
       2022-01-10 08:33:28 +08:00
    @murmur 我想兼容别人的脚本语言!即按它的逻辑实现一个我自己的解释器
    CaffreySun
        3
    CaffreySun  
       2022-01-10 08:36:37 +08:00   ❤️ 1
    DSL ?要不试试 Ruby ?超级灵活的语法,做 DSL 很方便。
    为啥要自己搞解释器呢?
    musi
        4
    musi  
       2022-01-10 08:37:32 +08:00
    蹲一个方案,简单点就写个 AST parser 解析到对应的语言,然后在生成代码的时候做一些逻辑判断,然后去访问你封装好的对象就行了
    ClarkAbe
        5
    ClarkAbe  
       2022-01-10 08:40:26 +08:00
    https://github.com/dop251/goja Golang 语言的,特别好用......直接映射函数或者 map 进去就行
    murmur
        6
    murmur  
       2022-01-10 09:02:17 +08:00
    @8520ccc 造轮子没必要的,lua 很小,可以自己改解析器的映射,能防住一般用 luadec 的小贼
    2i2Re2PLMaDnghL
        7
    2i2Re2PLMaDnghL  
       2022-01-10 09:21:37 +08:00
    兼容现有脚本的语法?首先想办法嵌入原有解释器,毕竟可能有人写脚本时会依赖未定义行为(

    其次就是编译原理整一套,通常就是写 AST parser 然后解释执行。
    heguangyu5
        8
    heguangyu5  
       2022-01-10 09:29:12 +08:00
    可以看看我的这个 https://www.v2ex.com/t/826154

    被网友称为"玩具"

    这个"玩具"(BPC)兼容 PHP,也就是说,同样的 PHP 代码,用 php 执行出来的结果和 BPC 编译执行出来的结果是一样的.如果当作黑盒子用的话,我不说是 BPC,一般情况下外部来看就是 PHP.

    虽然我是走编译成二进制的路子,但是也可以做成解释执行的,只不过解释执行对我没用,就没做.

    具体实现思路的话,首先要实现一个要兼容的语言的核心或者说 runtime,这个核心保证了你的解释器和那个语言的行为是一致的,比如拿 PHP 来说,两个 int 相加,如果溢出了,就返回 float 而不是溢出,那么你的 runtime 里就要对加法这样来实现.
    然后再定义 /实现一个添加扩展函数或类的机制,来在 runtime 之外增加你需要的 user 及 user.transfer()

    再接下来就是 lexer parser 那一套了,解析脚本在做什么,调用 runtime 和扩展函数执行给出结果.
    janxin
        9
    janxin  
       2022-01-10 09:33:15 +08:00 via iPhone
    不要整天造轮子了,嵌个脚本引擎或者 wasm 直接走起吧
    selca
        10
    selca  
       2022-01-10 09:35:42 +08:00
    CTRL+R
    BQsummer
        11
    BQsummer  
       2022-01-10 09:50:28 +08:00
    找个脚本引擎吧,比如 aviator
    SmiteChow
        12
    SmiteChow  
       2022-01-10 09:52:04 +08:00
    如果你的需求是通用的嵌入式编程环境,建议 lualang 。如果你的需求和业务场景强相关,建议 DSL ,使用成熟的 antlr4 编译前端+java/python/...后端很容易设计实现一个新语言。
    Via8veritas
        13
    Via8veritas  
       2022-01-10 10:19:18 +08:00
    我推测你的需求是需要一个规则引擎。试试直接用 Drools ,用户直接学习他的语法就可以了。你也可以二次开发增加自己的提供的 api 。
    monkeyWie
        14
    monkeyWie  
       2022-01-10 12:18:21 +08:00
    python exec 就行了
    learningman
        15
    learningman  
       2022-01-10 12:51:59 +08:00
    真想写 yaac+llvm 走起
    learningman
        16
    learningman  
       2022-01-10 12:52:35 +08:00
    @learningman #15 yacc
    churchill
        17
    churchill  
       2022-01-10 13:07:10 +08:00
    https://craftinginterpreters.com/
    我跟着这个教程两天时间用 dart 实现了一个
    后面用 c 写的堆栈虚拟机感觉有点复杂就没继续了
    ByteCat
        18
    ByteCat  
       2022-01-10 14:57:21 +08:00
    ANTLR4 DSL ,我自己写了个代码生成器
    msg7086
        19
    msg7086  
       2022-01-10 15:20:02 +08:00
    这不就是 binding 吗?
    nginx 有个 lua binding ,vapoursynth 有个 python binding ,去挖他们源码看看就知道怎么玩了。
    mxT52CRuqR6o5
        20
    mxT52CRuqR6o5  
       2022-01-10 15:23:47 +08:00
    [我想兼容别人的脚本语言]
    你直接把别人用的那种语言的解释器 fork 出来改一改定制一下不就好了,为啥要从 0 实现呢
    8520ccc
        21
    8520ccc  
    OP
       2022-01-10 21:22:06 +08:00 via iPhone
    @mxT52CRuqR6o5 别人原创的……
    8520ccc
        22
    8520ccc  
    OP
       2022-01-10 21:28:03 +08:00
    @mxT52CRuqR6o5 而且是闭源的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4436 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:10 · PVG 18:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.