Связанные представления данных
Усложняйте восстановление логики ценных вычислений.
Несколько значений в одном представлении#
Независимые кодировки оставляют независимые задачи восстановления. Связанное состояние объединяет взаимодействующие скаляры: одна координата может зависеть от нескольких исходных значений. Для допустимых int/long-регионов предусмотрены аффинные и нелинейные треугольные представления с явными условиями входа и выхода.
Важна граница полезного вычисления. Регион может работать непосредственно в связанных координатах, уменьшая необходимость восстанавливать каждую переменную перед каждой операцией. Анализу приходится восстанавливать и представление, и выраженное в нём вычисление.
Выбор семейства представлений#
Реализация выходит за пределы аффинной арифметики: полиномиальная связь над GF(2), битовые булевы схемы, представления с IEEE-754 и кодированные рекуррентные циклы. У семейств разные затраты преобразования и условия доказательства для допустимых регионов; они не взаимозаменяемы для произвольного байткода.
| Представление | Что меняется | Следствие для анализа |
|---|---|---|
| Связанные координаты | Несколько int/long-значений используют общее представление. | Нужно восстанавливать связи значений, а не только отдельные кодировки. |
| GF(2) / bit-slice | Допустимые вычисления используют полиномиальные или булевы представления. | Узнаваемое арифметическое выражение перестаёт быть рабочим представлением. |
| Состояние между итерациями | Представление может сохраняться между поддерживаемыми итерациями. | Локальные выражения нужно рассматривать вместе с изменяющимся состоянием. |
| Слияние с потребителем | Выбранные вычисления выполняются прямо в кодированных координатах. | В регионе может не остаться отдельной границы декодирования перед вычислением. |
Константа как часть потребителя#
Обычная граница восстановления раскрывает значение и передаёт его другой операции. Преобразования потребителя могут объединять константу с использующим её вычислением. Сравнения и решения представляются трансдьюсером. Выбранная арифметика выражается DAG-комбинаторами MethodHandle с примитивными типами, связываемыми через ConstantDynamic.
Меняется объект реконструкции: узнаваемый литерал или простое арифметическое тело может превратиться в связь компонентов исполнения. Ожидаемый результат сохраняется, меняются представление и путь его получения.
Сохранение семантики языка#
Преобразования должны сохранять точную разрядность, знаковую интерпретацию, переполнение и исключения Java. Тесты охватывают 32/64-битные обратные преобразования, вычисления в связанных координатах, предусловия, ветвящиеся циклы и состояние обработчиков исключений. Это проверка конкретных границ, а не универсальной совместимости.