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

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

  •  
  •   8520ccc · 267 天前 · 2830 次点击
    这是一个创建于 267 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主要应用场景类似沙盒?

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

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

    那我可以提供一个 user

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

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

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

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

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