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

2022-01-10 08:27:01 +08:00
 8520ccc
主要应用场景类似沙盒?

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

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

那我可以提供一个 user

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

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

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

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

其次就是编译原理整一套,通常就是写 AST parser 然后解释执行。
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
2022-01-10 09:33:15 +08:00
不要整天造轮子了,嵌个脚本引擎或者 wasm 直接走起吧
selca
2022-01-10 09:35:42 +08:00
CTRL+R
BQsummer
2022-01-10 09:50:28 +08:00
找个脚本引擎吧,比如 aviator
SmiteChow
2022-01-10 09:52:04 +08:00
如果你的需求是通用的嵌入式编程环境,建议 lualang 。如果你的需求和业务场景强相关,建议 DSL ,使用成熟的 antlr4 编译前端+java/python/...后端很容易设计实现一个新语言。
Via8veritas
2022-01-10 10:19:18 +08:00
我推测你的需求是需要一个规则引擎。试试直接用 Drools ,用户直接学习他的语法就可以了。你也可以二次开发增加自己的提供的 api 。
monkeyWie
2022-01-10 12:18:21 +08:00
python exec 就行了
learningman
2022-01-10 12:51:59 +08:00
真想写 yaac+llvm 走起
learningman
2022-01-10 12:52:35 +08:00
@learningman #15 yacc
churchill
2022-01-10 13:07:10 +08:00
https://craftinginterpreters.com/
我跟着这个教程两天时间用 dart 实现了一个
后面用 c 写的堆栈虚拟机感觉有点复杂就没继续了
ByteCat
2022-01-10 14:57:21 +08:00
ANTLR4 DSL ,我自己写了个代码生成器
msg7086
2022-01-10 15:20:02 +08:00
这不就是 binding 吗?
nginx 有个 lua binding ,vapoursynth 有个 python binding ,去挖他们源码看看就知道怎么玩了。
mxT52CRuqR6o5
2022-01-10 15:23:47 +08:00
[我想兼容别人的脚本语言]
你直接把别人用的那种语言的解释器 fork 出来改一改定制一下不就好了,为啥要从 0 实现呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827209

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX