适用于Java的嵌入式脚本语言
此文已由作者赵昕授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
fakescript
轻量级嵌入式脚本语言
https://github.com/esrrhs/fakescript-java
简介
fakescript是一款轻量级的嵌入式脚本语言,使用Java语言编写,语法吸取自lua、golang、erlang,基于jflex、cup生成语法树,编译成字节码解释执行。 C/C++版本fakescript
脚本特性
语法类似lua
全部为函数
支持array,map,可以无限嵌套
支持fake testfunc(param1)产生routine,实现假多线程效果
支持Java静态函数和Java类成员函数的绑定
自带解释器
支持多返回值
自带profile,可获取脚本各个函数运行时间
支持热更新
支持Int64
支持const定义
支持包
支持struct
示例
-- 当前包名
package mypackage.test -- 引入的文件
include "common.fk" -- 结构体定义
struct teststruct
sample_a
sample_b
sample_c
end -- 常量值
const hellostring = "hello"
const helloint = 1234
const hellomap = {1 : "a" 2 : "b" 3 : [1 2 3]} -- func1 comment
func myfunc1(arg1, arg2) -- Java静态函数和类成员函数的调用
arg3 := cfunc1(helloint) + arg2:memfunc1(arg1) -- 分支
if arg1 < arg2 then
-- 创建一个协程
fake myfunc2(arg1, arg2)
elseif arg1 == arg2 then
print("elseif")
else
print("else")
end -- for循环
for var i = 0, i < arg2, i++ then
print("i = ", i)
end -- 数组
var a = array()
a[1] = 3 -- 集合
var b = map()
b[a] = 1
b[1] = a -- Int64
var uid = 1241515236123614u
log("uid = ", uid) -- 子函数调用
var ret1, var ret2 = myfunc2() -- 其他包的函数调用
ret1 = otherpackage.test.myfunc1(arg1, arg2) -- 结构体
var tt = teststruct()
tt->sample_a = 1
tt->sample_b = teststruct()
tt->sample_b->sample_a = 10 -- 分支
switch arg1
case 1 then
print("1")
case "a" then
print("a")
default
print("default")
end -- 多返回值
return arg1, arg3 end
Java示例
#!java
// 创建一个实例
fake f = fk.newfake(null);
// 注册包里全部标记@fakescript的函数
fk.reg(f, "com.test");
// 解析fake脚本文件
fk.parse(f, "test.fk");
// 执行myfunc1函数,传入两个参数分别为1和2
double ret = (double)fk.run(f, "myfunc1", 1, 2);
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 网易容器云平台的微服务化实践(一)
【推荐】 四两拨千斤式的攻击!如何应对Memcache服务器漏洞所带来的DDoS攻击?
【推荐】 wireshark抓包分析——TCP/IP协议
适用于Java的嵌入式脚本语言的更多相关文章
- 适合学习C语言开源项目——嵌入式脚本语言 Berry
嵌入式脚本语言 Berry github网址 :https://github.com/Skiars/berry Berry 是一款面向小型嵌入式系统的脚本语言,目前发布了 0.1.0 版本.相比于其他 ...
- Java动态调用脚本语言Groovy
Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...
- [Java面试九]脚本语言知识总结.
核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...
- Java学习笔记--脚本语言支持API
Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...
- ECMAScript进化史(1):话说Web脚本语言王者JavaScript的加冕历史
互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...
- 深入LUA脚本语言,让你彻底明白调试原理
这是道哥的第008篇原创 一.前言 上篇文章我们聊了gdb的底层调试机制,明白了gdb是利用操作系统提供的系统信号来调试目标程序的.很多朋友私下留言了,看到能帮助到大家,我心里还是很开心的,其实这也是 ...
- C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.
C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...
随机推荐
- WPF DataGrid 控件的运用
WPF DataGrid 控件的运用 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-23 参考: King Cobra 博客 ...
- PHP - 输出缓存 - 关于ob系列函数和flush函数
偶然机会看到了flush().知道他的神奇功能可以用在异步传输的comet 模式之后,于是我去试了试这个方法.然后翻手册去看了看什么意思.发现它神奇的和ob类函数在一起.有点好奇,先放一放,来说flu ...
- ShaderLab内置变量
[ShaderLab内置变量]
- FP寻源报错
ERROR [HY000] [Oracle][ODBC][Ora]ORA-01114: IO error writing block to file (block # ) ORA-01114: I ...
- SaltStack 的插件特性
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- 125. Valid Palindrome (Array; Two-Pointers)
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- 少一些套路,多一些真诚 ——groovy消灭表现层套路
初次认识groovy是在2009年,当时看了Manning出版的<Groovy in Action 1st Edition>,对groovy这个语言的交互性shell,以及灵活的语法留 ...
- [Jenkins] Jenkins 执行 Composite 模式的 SoapUI Project
cd %WORKSPACE% cmd /c call "D:\Program Files\SmartBear\ReadyAPI-1.3.1\bin\testrunner.bat" ...
- python 文件操作(二)
一. 文件的读写 1.找到文件 文件路径:./test.py 2.打开文件 open('文件路径','模式') 模式: r, 以只读的方式打开 w, 打开一个文件只用于写入,如文件已存在,直接重 ...
- es学习-映射管理
2.2.1 增加映射 url:http://192.168.0.108:9200/yingshe/_mapping/user/(前提 索引存在,如索引不存在 请按照上一篇创建索引添加映射) 参数: { ...