Фейк: лёгкий встраиваемый скриптовый язык
Введение Фейк — это лёгкий встраиваемый скриптовый язык, написанный на C++. Его синтаксис вдохновлён языками Lua, Go и Erlang. Он использует генераторы синтаксических деревьев flex и bison для компиляции в байт-код, который затем интерпретируется.
Особенности скрипта
Применение Язык Фейк используется в различных проектах, таких как «Безумный взрыв небес» (https://www.muzhiwan.com/com.fkzft.gamewin.mzw.html), «Я — великий владыка» (http://dzz.youxi.com) и «Небесный блеск каждый день» (http://ttxd.qq.com/act/a20160419brandP/).
Пример кода
-- Текущий пакет называется mypackage.test
package mypackage.test
-- Импортируем файл common.fk
include "common.fk"
-- Определяем структуру teststruct
struct teststruct {
sample_a
sample_b
sample_c
}
-- Объявляем константы
const hellostring = "hello"
const helloint = 1234
const hellomap = {1 : "a" 2 : "b" 3 : [1 2 3]}
-- Функция myfunc1 с комментариями
func myfunc1(arg1, arg2) {
-- Вызов функций C и методов классов C++
arg3 := cfunc1(helloint) + arg2:memfunc1(arg1)
-- Условные операторы
if arg1 < arg2 then {
-- Создаём сопрограмму
fake myfunc2(arg1, arg2)
} elseif arg1 == arg2 then {
print("elseif")
} else {
print("else")
}
-- Цикл for
for var i = 0, i < arg2, i++ {
print("i = ", i)
}
-- Массив
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")
}
}
-- Возврат нескольких значений
return arg1, arg3
}
Пример на C++
// Создаём экземпляр
fake * fk = newfake();
// Регистрируем глобальные функции
fkreg(fk, "cfunc1", cfunc1);
// Регистрируем методы класса, разные классы могут использовать одни и те же имена функций без конфликтов
fkreg(fk, "memfunc1", &class1::memfunc1);
// Анализируем файл скрипта
fkparse(fk, argv[1]);
// Запускаем функцию myfunc1, передавая два аргумента 1 и 2
ret = fkrun<int>(fk, "myfunc1", 1, 2);
// Удаляем экземпляр
delfake(fk);
Сравнение производительности
Запустите cd benchmark/ && ./benchmark.sh
на MacBook Pro с процессором Intel Core i5 2.3 ГГц. Результаты приведены ниже:
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 пока не поддерживает сборку мусора, поэтому String работает медленнее.
Использование Скопируйте include/fake-inc.h и bin/libfake.so в свой проект и используйте их напрямую.
Компиляция
./gen.sh
../build.sh
или ./build.sh release
.Тестирование
cd test && ./test.sh
../fakebin your.fk
.Среда отладки
IDE (bin/fakeide.app).
Командная строка (bin/fakebin).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )