Эксплуатация и бенчмарки¶
Админ-команды (/fastscript, алиас /fs, право fastscript.admin)¶
| Команда | Действие |
|---|---|
/fastscript reload |
Перекомпилировать все скрипты (слушатели старого набора снимаются первыми) |
/fastscript scripts |
Список скриптов: триггеры/команды/функции |
/fastscript variables |
Число персистентных переменных |
/fastscript bench [N] |
Замер первой функции первого скрипта (прогрев + N вызовов, нс/вызов) |
plugin.yml: дублирование команд¶
Bukkit видит только команды из plugin.yml. На каждую command xxx в скриптах
нужна запись:
commands:
heal:
description: Declared by a script
usage: /heal <player>
kit:
description: Declared by a script
usage: /kit
Без неё в логе: script command '/xxx' is not declared in plugin.yml.
Бенчмарки¶
BenchRunner <script.fs> <iterations> — self-test + сравнение скомпилированного
байткода против tree-walking интерпретатора того же AST (bench/Interpreter):
один скрипт (bench/scripts/Arithmetic.fs: fib, sum-range, countdown,
echo-number, sum-count), одинаковые входы, прогрев перед замером.
Ориентир: fib ~4x, sum-range ~12–20x (плавают от машины — нормально).
Честные рамки: один процесс, базовый прогрев, без JMH и доверительных
интервалов — это показывает окупаемость подхода на выбранных операциях,
а не ускорение всего сервера.
Сравнение со Skript делается на своём сервере по процедуре
из bench/skript/README-skript.md (там же benchmark.sk и benchmark.fs):
один алгоритм с обеих сторон, прогрев, 5 прогонов, медиана.
Ошибки: как читать¶
file.fs:13:5: expected ':'—ScriptException.render(), строка:колонка.unknown function 'x'— нет builtin'а и нет своей функции с таким именем/арностью.unknown variable 'x'— локал не объявлен (или затенён builtin — см.player).unsupported event '...'— нет такого события в таблице.division by zero— вместоNaN, осознанно и громко.NegativeArraySizeExceptionиз ASM при сборке массивов аргументов — исправлено (dupпередaastore); если увидите снова — это баг упаковки, а не вашего скрипта.
Известные ограничения¶
- Глобалы и per-player переменные (
$name,#name) сохраняются вvariables.yml(игроки — под__players__) при выключении плагина, а не на каждое изменение. Неудачный/fastscript reloadоставляет предыдущий рабочий набор вместо затирания. - Планировщик (
Host.runLater) в DSL не выведен. where— обычное выражение на строке шапки.- Индексация и
for— через динамический диспатч, не примитивы;forтребует список. is===;#имябез пробела — переменная,# текст— комментарий.- Релокация ASM — по явной карте классов (
SimpleRemapperпрефиксы не умеет).