• 适用于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协议

  • 相关阅读:
    【HAOI2014】走出金字塔
    【HAOI2008】圆上的整点
    LOJ #116 有源汇点有上下界的最大流
    ZOJ [P2314] 无源汇点有上下界模版
    最小费用最大流模版
    最大流模版 dinic
    最大流模版 EK
    HDU [P1533]
    HDU [2255] 奔小康赚大钱
    POJ [P2289] Jamie's Contact Groups
  • 原文地址:https://www.cnblogs.com/163yun/p/10033850.html
Copyright © 2020-2023  润新知