http://thedeemon.livejournal.com/ ([identity profile] thedeemon.livejournal.com) wrote in [personal profile] thedeemon 2016-03-25 10:33 am (UTC)

Привет!
Видел твое письмо, просто не успел еще ответить.

Да, у меня эта штука до сих пор используется в большинстве продуктов, только на этой неделе переводил интерпретатор ВМ на D и вставлял в Video Enhancer 2.0, выходящий совсем скоро (публичная бета уже на сайте). Я не слежу пристально за крэками, но из того что пока видел, регулярно появляются псевдовзломанные версии - люди убирают наг-скрин и думают что взломали, а проверить работоспособность проги не утруждаются. Она же, обнаружив себя измененной, при попытке обработать видеофайл тупо закрывается. Один крэк видел рабочий несколько лет назад, там смогли обойти вызов ВМ, но я потом сделал так, что если код на ВМ не отработал, то некоторые другия части программы перестают работать. После этого годных взломов уже давно не видел.

Я никогда не пробовал делать бэкенд для LLVM, но априори мне кажется, что это довольно много возни, и спектр вопросов, требующих решения, там намного шире чем в своей поделке на двадцать команд. Тут мне не надо думать о нуждах C Runtime, например. Если ты собираешься много существующего кода в ВМ переносить, то путь через clang-llvm весьма разумен, имеет смысл. У меня же все реальные программы на Leo меньше 200 строк. Сделать свой компилятор заняло две увлекательных недели до чего-то уже работающего, плюс потом периодически возвращался с дополнениями и модификациями. Полагаю, с clang'ом я б дольше возился, и без удовольствия.
Пожалуй, есть один момент, где пригодилось иметь свой компилятор, а не просто бэкенд. Он у меня не только оптимизирующий, но одновременно и пессимизирующий. Некоторые части кода хочется оптимизировать, чтобы работали побыстрее (подсчет чексумм и расшифровка данных), а некоторые другие части и общую логику хочется наоборот сделать более сложными и запутанными. И у меня в компиляторе есть преобразование AST, которое добавляет туда много новых вычислений и ветвлений, чтобы вместо простого
a[4] = 1
было что-нибудь вроде
x2 = 2
x7 = 66
x3 = x7 + 1
x13 = 8
x16 = 3
x5 = x13 * 6
x4 = x16 + x2
x12 = x13 * x13
x11 = 255 ^ 128
x1 = x12 + x11
x8 = x1 * 4
x9 = 765 - x8
x6 = x9+1
x7 = x4 - x16
x10 = x6*x7
if (x3 > x2) {
a[x10] = x9
} else {
a[x10] = x5
}

Только реально ветвлений там еще больше вставляется. Возможно, это можно делать на уровне блоком LLVM IR, но кажется на уровне AST это несколько проще и приятней.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting