1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/esrrhs-fakescript

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
readme.md 6.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 24.11.2024 13:12 07c61ab

Фейк: лёгкий встраиваемый скриптовый язык

Введение Фейк — это лёгкий встраиваемый скриптовый язык, написанный на C++. Его синтаксис вдохновлён языками Lua, Go и Erlang. Он использует генераторы синтаксических деревьев flex и bison для компиляции в байт-код, который затем интерпретируется.

Особенности скрипта

  • Работает на платформах Linux amd64 и MacOS amd64.
  • Поддерживает виртуальные машины и JIT (экспериментальный).
  • Позволяет создавать подпрограммы с помощью fake testfunc(param1), которые могут имитировать многопоточность в однопоточной среде (эта функция не поддерживается JIT).
  • Имеет встроенные отладчики: командную строку в стиле GDB и визуальную среду разработки в стиле VS. Также можно использовать интерфейс для вызова отладки из C.
  • Обеспечивает возможность горячей замены кода.
  • Позволяет связывать функции C и методы классов C++ с фейком.
  • Включает профилировщик для отслеживания времени выполнения каждой функции скрипта.
  • Предоставляет структуры данных array, map с возможностью бесконечного вложения.
  • Возвращает несколько значений.
  • Использует 64-битные целые числа.
  • Разрешает использование констант.
  • Реализует пакеты.
  • Предлагает поддержку структур.
  • Может упаковывать файлы в бинарные или исполняемые форматы.

Применение Язык Фейк используется в различных проектах, таких как «Безумный взрыв небес» (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 в свой проект и используйте их напрямую.

Компиляция

  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).

  • Командная строка (bin/fakebin).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/esrrhs-fakescript.git
git@api.gitlife.ru:oschina-mirror/esrrhs-fakescript.git
oschina-mirror
esrrhs-fakescript
esrrhs-fakescript
master