Визуальный язык программирования
Визуальный редактор скриптов был создан около двух лет назад. Он является основной частью процедурного моделирования в редакторе Dreams 3D, именно на нем производится основная часть расчетов. Задается логика поведения, условия при которых генератор выбирает правильный путь построения. Изначально визуальный редактор скриптов создавался для игры Space Soldiers, для управления логикой игры, но в ходе разработки было принято решение расширить его возможности.
Прежде чем создавать визуальный редактор, я изучил подобные проекты. Первым на очереди был Blender, следом за ним Unreal Engine, так же посмотрел и на совершенно другие реализации в продуктах от компании Autodesk. Изучив все плюсы и минусы, начал создание не с визуального редактора, а с виртуальной машины. Виртуальная машина это среда где будет происходить выполнение кода. В интернете очень много информации про Абстрактные синтаксические деревья и за основу изначально планировалось взять именно такой подход. Но после проведения тестов, выяснилось, что данный метод далеко не самый быстрый, а код получается сложным и огромным.
Но решение было найдено, простейшая виртуальная машина:
void vm_step()
{
vm_arg *arg0 = get(instr, 0);
vm_arg *arg1 = get(instr, 1);
switch(instr[idx])
{
case 0x0: *arg0 = *arg1; break;
case 0x1: ++(*arg0); break;
case 0x2: —(*arg0); break;
case 0x3: stack::push(arg0); break;
case 0x4: stack::pop(arg0); break;
………
Но это было лишь началом, дальше больше. После достижения пределов скорости, на помощь пришла библиотека AsmJit. С её помощью удалось достичь скорость выполнения кода в разы быстрее подобных языков, но до уровня с++, всё еще далеко, код в 2-4 раза медленней чем c++. Так как в основе «условно» абстрактное дерево, пришлось заняться оптимизацией дерева до перевода его в бинарный код. Первым делом была добавлена возможность построения констант, константой могут быть даже десятки функций. Если результат не изменялся при выполнения кода, либо, если на результат не могут повлиять функции и их значения он становился константой. Это позволило в разы ускорить выполнение кода.
После достижения нужной скорости, приступил к визуальному оформлению. Из всёх понравилось оформление у Unreal Engine. Оно удобное, да и визуально приятно смотреть на структуру. Не долго думая оформил в похожем виде.
Код компилятора, виртуальной машины и редактора получился компактным, всего ~ 8 тыс. строк. Сама же виртуальная машина которая выполняет весь код всего 430 строк (если без AsmJit).
Самое сложное было создать возможность перестройки кода во время выполнения. Это позволило создавать динамический код, где меняются структуры, набор связей. Где программа может расширяться прямо во время выполнения, без остановки и перезапусков.
Научится тока пользоваться этим всем.