Maple-IR-это промышленная структура статического анализа на основе ИК для Java Bytecode. В настоящее время он реализует анализ на основе SSA-формы, а также строительство и разрушение от байт-кода до IR. Набор инструментов делает вход байт -кода, поднимает его в SSA IR, преобразует IR, а затем перекомпилируется обратно в Bytecode. Это делается путем символического выполнения каждого метода при моделировании стека, аналогично тем, как работают шестигранные лучи ниндзя или IDA Pro. Интрапроцедурный анализ потоков данных полностью реализован, и также реализованы оптимизация, такие как постоянное складывание и пропаганда копии. Также доступен экспортер CFG Graphviz; Смотрите ниже для примеров.
Maple-IR не в активном развитии. Он находится на перерыве на неопределенный срок, хотя вклады кода приветствуются. Пожалуйста, подайте вопросы, комментарии и проблемы на трекере выпуска.
Maple-IR в его нынешнем виде еще не готова к производству, хотя его можно сделать с небольшим усилием.
Если вы используете Maple-IR, сообщите нам об этом! Мы хотели бы услышать о любых крутых проектах, для которых вы используете его.

«Это как LLVM, но хуже».
Вот визуализация Graphviz для оптимизированного, разрушенного (пост-SSA) IR для следующего кода:
void test130 () {
int x = 5 ;
int y = 10 ;
do {
try {
trap ( x , y );
y = x ;
trap ( x , y );
y = 123 ;
} catch ( RuntimeException e ) {
do {
trap ( x , y );
int z = y ;
trap ( x , y );
y = x ;
trap ( x , y );
x = z ;
trap ( x , y );
} while (! p ());
}
} while ( p ());
System . out . println ( x );
System . out . println ( y );
}
Вот более скучная функция в оптимизированной форме SSA, взятой из декомпилятора папоротника:
Разрушение SSA реализуется с использованием методов Sreedhar et al. и Boissinot et al. Деструктор Boissinot в настоящее время является деструктором по умолчанию. Конструкция SSA внедрена на основе быстрого алгоритма линейного сканирования с 1 проходом, свободно основанным на методе Cytron et al. С использованием границ доминирования. Более подробную информацию см. Ssagenpass.java. Разрушение байт -кодов в Java сложно из -за диапазонов исключений. Кроме того, линеаризовать график потока управления (CFG) простым способом сложно из -за гнездования петли. Линеаризация обрабатывается путем рекурсивного применения алгоритма компонентов Тарджана. Таблицы исключений для каждого метода отбрасываются и регенерируются на основе структуры графика управления. Для получения более подробной информации см. Controlflowgraphdumper.
Для получения более подробной информации см. Белый документ.
javac . Это означает, например, finally блоки обрабатываются правильно, хотя и не аккуратно. Построить:
mvn clean compile test package
Сборка будет производить две банки, одна с включенными зависимостями ( mapleir-full.jar ), а один без ( mapleir-full-with-deps.jar ). Вы также можете использовать каждый модуль индивидуально.
Тогда необязательно:
mvn install
Вы также можете получить Maple-IR на Jitpack.
Контакт: Подайте проблему, я сделаю все возможное, чтобы ответить как можно быстрее.
Обмен приведет к сообщению и избиению (благословение)
Maple-IR лицензирован в GPLV3. Для получения дополнительной информации, пожалуйста, смотрите здесь.
Copyright (C) 2022 Bibl и RCX