Code Monkey home page Code Monkey logo

fake's Introduction

fake

Codacy Badge

轻量级嵌入式脚本语言

README_EN

简介

fake是一款轻量级的嵌入式脚本语言, 使用c++语言编写, 语法吸取自lua、golang、erlang, 基于flex、bison生成语法树, 编译成字节码解释执行。

Java版本fake

Go版本fake

脚本特性

  • 运行环境linux amd64、MacOS amd64
  • 支持VM, JIT(实验性质)
  • 支持fake testfunc(param1)产生routine, 在单线程上实现多线程效果(此特性不支持JIT)
  • 支持调试, 自带gdb风格的命令行调试器, 以及VS风格的可视化编辑调试ide, 也可在C里直接通过接口调用, 开始命令行调试
  • 支持热更新
  • 支持C风格函数和C++类成员函数的绑定
  • 支持profile, 可获取脚本各个函数运行时间
  • 支持array, map, 可以无限嵌套
  • 支持多返回值
  • 支持Int64
  • 支持const定义
  • 支持包
  • 支持struct
  • 支持打包bin文件或可执行文件

产品应用

image疯狂炸翻天 image我是大主宰 image天天炫斗

示例



-- 当前包名
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)
	
	-- C函数和类成员函数的调用
	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

C++示例

// 创建一个实例
fake * fk = newfake();
// 注册全局函数
fkreg(fk, "cfunc1", cfunc1);
// 注册类成员函数, 不同的类注册一样的函数名字不冲突
fkreg(fk, "memfunc1", &class1::memfunc1);
// 解析fake脚本文件
fkparse(fk, argv[1]);
// 执行myfunc1函数, 传入两个参数分别为1和2
ret = fkrun<int>(fk, "myfunc1", 1, 2);
// 删除实例
delfake(fk);

性能比较

运行cd benchmark/ && ./benchmark.sh ,在MacBook Pro 2.3 GHz Intel Core i5上的数据

Lua Python Fake Fake JIT
Loop 0.8s 2.3s 1.3s 0.2s
Prime 13.5s 20.9s 12.8s 5.9s
String 0.8s 0.4s 1.2s 3.2s

注:因为JIT目前无法GC,所以String反而最慢

如何使用

复制 include/fake-inc.h 和 bin/libfake.so 到你的工程, 直接使用

如何编译

  1. 安装cmake
  2. (可选)安装flex, bison, 运行./gen.sh
  3. 安装gcc, gcc-c++
  4. ./build.sh 或者 ./build.sh release

测试示例

  1. test/sample 目录下有脚本示例代码
  2. 运行方法 cd test && ./test.sh
  3. bin/fakebin 为可执行文件,可以自己编写运行,如:./fakebin your.fk

调试环境

  • IDE (bin/fakeide.app)

image

  • 命令行 (bin/fakebin)

image

Stargazers over time

Stargazers over time

fake's People

Contributors

bryant1410 avatar esrrhs avatar ip-gpu avatar songbingyu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fake's Issues

gc询问

vm的关键在gc呀。小代码测试不出gc问题,业务复杂点gc就关键了,请问贵脚本gc是何方法?

性能/正确性 问题

此前在网上看到系列脚本的测试脚本,拿斐波那契数列的脚来看:
Lua:
function fibR(n)
if (n < 2) then return n end
return (fibR(n-2) + fibR(n-1))
end

function fibI(n)
local last = 0
local cur = 1
n = n - 1
while (n > 0)
do
n = n - 1
local tmp = cur
cur = last + cur
last = tmp
end
return cur
end

改用fake重写之后:
func fibR(n)
if (n < 2) then return n end
return (fibR(n - 2) + fibR(n - 1))
end

func fibI(n)
var last = 0
var cur = 1
n = n - 1
while (n > 0)
then
n = n - 1
var tmp = cur
cur = last + cur
last = tmp
end
return cur
end

func main()
var N = 43
print("fib: " .. fibR(N) .. " = " , fibI(N))
end

流程一样,在我i9-8950HK CPU,32GB内存的64位Linux环境下,lua要跑55秒,fake半小时都不见返回

缺乏语法说明,我变量定义都出错

我写一个递归函数:
func fibR(n)
if (n<2) then
return n
end
return fibR(n-2)+fibR(n-1)
end
在return fibR(n-2)+fibR(n-1)报错了,无奈,我定义两个变量
1: arg1 := n-1
arg2 := n-2
2: var arg1 = n-1, arg2 = n-2
3: var arg1,arg2
arg1 = n-1
arg2 = n-2
横竖都不对

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.