Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

CINT, Cling для скриптов. Как?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Не могу комментировать в C++ дайджест № 4.
Там Vladyslav Kurmaz пишет, что использовали «CInt интерпретатор для тех же целей как и Lua, Pyhton... Нужно бдует попробовать пересобрать свои поделки с Cling-ом.».

Я с Cling один момент не улавливаю: это надо собрать весь llvm для него? Там же стотыщ файлов, оно собирается три часа.

Допустим, задача — интегрировать интерпритатор в движок игры. Чтоб он JIT компилил нативный код в память, а движок вызывал его как указатель на функцию.

char* code = "void f() { }";
void* buffer =...

compile(code, buffer);

void (*func)() = buffer;

func();

Если загуглить картинки «llvm classes dependencies diagram», то глядя на этот ад, правильно ли я понимаю, что перетянуть в движок только нужные модули невозможно? Т.е. llvm при таком подходе будет неизбежной внешней зависимостью?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Cling — пока не пробовал, поэтому все ниже — касается CInt.
...
То что ты описал в примере — делается достаточно просто, для этого CInt и разрабатывали.
Более того, из CInt скрипта можно вызывать код из главной программы, при определённых ограничаниях, можно даже дёргать методы объектов, которые были созданы вне CInt-а.
...
Вот здесь, пример с исходниками
www.codeproject.com/...t-compiler-from-Scintilla
Тут тоже можно многое подчерпнуть
root.cern.ch/phpBB3/viewforum.php?f=5
...
Если мне не изменяет память, мы пересобирали CInt сами, в бинарниках с сайта не хватало каких-то процедур, поэтому мы собирали с допонительными ключами.
Но на первом этапе — это не особо важно.

Ясно, спасибо за ссылки.

Я ещё чего про llvm вспомнил: хочется компилировать и под ARM для android. CINT не генерирует arm код, верно?

Если получится что-то с Cling (в плане урезания llvm), напиши сюда пару строк.

CINT не генерирует arm код, верно?
Нужно просто CInt собрать под другую платформу и подавать на его вход С\С++ код.
У нас был опыт сборки CInt и выполнения скриптов на PS3.
...
Если получится что-то с Cling (в плане урезания llvm), напиши сюда пару строк.
Давно собираюсь выложить свои наработки на Github, вот как раз новогодние праздники впереди — будет чем заняться )
Нужно просто CInt собрать под другую платформу и подавать на его вход С\С++ код.

Я имею в виду, что знает ли сам CINT как генерировать машинный код архитектуры ARM?
То, что будет лежать в buffer из моего примера. Ведь дальнейший вызов func(); будет выполняться на устройстве на ARM ядре.

Ещё про llvm.
Пару лет назад я пытался решить эту задачу — интегрировать llvm в движок. Сделал эксперимент: написал текстовый обработчик, который прошёлся по всем исходникам llvm и добавил в начало каждого метода и функции запись в лог (сам себе профайлер). Потом запустил простой пример генерации кода на Clang. Лог показал, что были вызваны сотни методов из сотен файлов. Точные числа уже не помню, на мне стало так грустно:), что я забросил эту идею.

Вот думаю, может с тех пор что-то изменилось... Но скорее всего нет.

Я имею в виду, что знает ли сам CINT как генерировать машинный код архитектуры ARM?
Смотри, тут такая же ситуация как с Java/C#, CInt последовательно интерпритирует текст, который ты подал на вход, он не генерит команды процессора на выходе, CInt — не компилятор.
...
Так как в С\С++ можно достаточно вольно работать и с памятью и со стеком (byte alignment, _alloca, cdecl, stdcall, etc.), то CInt может падать на хитросделанном коде, поддержка шаблонов тоже урезанная.
...
По своему опыту, если сильно не «выёживаться» и оставаться в базисе «С с классами» — такой симбиоз очень эффективен для геймдева.

Підписатись на коментарі