Spiiin's blog

daScript - скорость

Рассказывал о daScript коллеге в отпуске, в ответ на то, почему он такой быстрый, задумался, что особо коротко и не ответишь, не влезая в детали реализации, проще замерить. Очень поверхностно:

Заявленное авторами

(Performance, overview, VM):

  • Быстрый интероп в C++ и обратно.
  • AoT, чтобы вообще убрать интероп, в случаях, когда можно транспилировать в C++ вместо интерпретации.
  • Кастомные аллокаторы для строк и хипа. Плюс политика для отдельных скриптов, в которых не нужно хранить выделенное — быстро перезапустить всю виртуальную машину, прибив всё аллоцированное без освобождения. Политика управления памятью или сохранения состояния может быть кастомизирована на стороне C++ — модель памяти daScript максимально простая и быстрая.
  • Использование hardware-friendly типов для нод, поддержка векторных типов в языке (в геймдеве повсюду встречаются vec4 и mat4 — многие алгоритмы просто векторизировать).

AoT

Код, скомпиленный из daScript в C++, может получиться быстрее среднего C++ кода, так же как компилятор может перевести C++ в более быстрый ассемблерный код, чем средний код, написанный на ассемблере. Причина в том, что при выборе вариантов реализации asm инструкций может быть много вариантов, из которых компилятор может выбрать более быстрый, чем рядовой программист. Т.е. если авторы языка хорошо представляют себе, во что скомпилиться сгенерированный C++ код, то теоретически, они могут сгенерировать код лучше, чем написанный средним программистом.

Кроме daScript, транспиляцию в C++ поддерживает Nim, который на тестах также выдаёт очень хорошие результаты. Скорее всего, генерировать LLVM код было бы эффективнее, что и планируют делать авторы языка в будущем, однако и генерация быстрого C++-кода делает эти языки очень быстрыми уже сейчас.

Перестройка кода

Данные и код на daScript можно кастомизировать (макросы, преобразовывающие AST, а также перегрузка simulate и visit, fusion engine для паковки инструкций), это делать намного легче чем на C++. Пример из доклада, про разницу подходов при задаче раскладывания данных data-oriented для ECS фреймворка, на C++ и на daScript.

Наверное, чё-то ещё есть, лучше у авторов уточнить.

Доверие авторам

Отдельный очевидный момент — быстрый код на языке следует из идеи языка. Если авторы всячески декларируют желание сделать быстрый язык и продолжать разгонять его — то они и будут делать именно это.

Косвенный признак возможности сделать что-то в языке быстро — наличие специализированных оптимизированных конструкций/структур/алгоритмов (block+lambda, string+das_string, array+int[N] etc).

Почему я верю конкретно в этот язык — потому что давно видел изнутри движки Gaijin, их тулзы, и знаю качество их кода и используемые скриптовые языки. Ковырял все доступные материалы по скриптовым языкам Naughty Dogs (книга “Архитектура игровых движков”, доклады про использование Lisp-а как языка описания данных и скриптового языка в играх), некоторые идеи из которых, по интервью с автором, реализованны в daScript. Ну и сам Борис Баткин, небезызвестен в русском геймдев-комьюнити еще образца 2000х годов (интервью глазами пострадавшего), да и просто интересный человек, скорее всего знает толк в быстром коде.

update
Устройство интерпретаторов lua-jit и daScript — продолжение