• 请不要在回答技术问题时复制粘贴 AI 生成的内容
8520ccc
V2EX  ›  程序员

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

  •  
  •   8520ccc · Jan 10, 2022 · 4607 views
    This topic created in 1760 days ago, the information mentioned may be changed or developed.
    主要应用场景类似沙盒?

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

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

    那我可以提供一个 user

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

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

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

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

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