Взломайте JVM, чтобы избежать ненужных проверок границ и отбрасываний

Есть несколько языков, поддерживающих достаточно мощную систему типов, которую они могут доказать во время компиляции, чтобы код не обращался к массиву за пределами его границ. Мой вопрос заключается в том, что если мы должны скомпилировать такой язык для JVM, можно ли каким-то образом воспользоваться этим для производительности и удалить проверки границ массивов, которые происходят при каждом доступе к массиву?

1) Я знаю, что недавний JDK поддерживает некоторые проверки проверки границ массива, но поскольку во время компиляции я знаю, что определенные вызовы безопасны, я мог бы удалить намного безопаснее.

2) Некоторые могут подумать, что это не сильно влияет на производительность, но это, безусловно, имеет место, особенно в приложениях с массивами/вычислениями, таких как научные вычисления.

Тот же вопрос, касающийся кастинга. Я знаю, что что-то есть определенный тип, но Java не потому, что его система ограниченного типа. Есть ли способ сказать JVM "доверять мне" и пропустить какие-либо проверки?

Я понимаю, что, вероятно, нет способа сделать это, поскольку JVM обычно распространяется, может ли разумно изменить JVM с помощью этой функции? Это что-то сделано?

Это одно из разочарований в компиляции более мощного языка для JVM, ему все еще мешают ограничения Java.

Ответ 1

В принципе это невозможно сделать безопасным способом без инфраструктуры сопроводительного кода (PCC). PCC позволит вам встраивать свои соображения безопасности в файл class. Проверенное встроенное доказательство проверяется на время загрузки класса. Класс не загружается, если есть недостаток в доказательстве.

Если JVM когда-либо позволяла вам отбрасывать проверки во время выполнения, не требуя формального подтверждения, то, по словам SecurityMatt, это победит оригинальную философию Java в качестве безопасной платформы.

JVM использует специальную форму PCC для проверки локальных переменных типа в методе. Вся локальная информация для ввода переменных используется механизмом загрузки классов для проверки его правильности, но после этого отбрасывается. Но это единственный экземпляр концепций PCC, используемых в JVM. Насколько я знаю, нет общей инфраструктуры PCC для JVM.

Я однажды услышал, что один из них существует для платформы JavaCard, которая поддерживает небольшое подмножество Java. Я не уверен, что это может быть полезно в вашей проблеме.

Ответ 2

Одна из ключевых особенностей Java заключается в том, что не нужно "доверять" разработчику для проверки границ. Это устраняет уязвимости безопасности "переполнения буфера", которые могут привести к тому, что злоумышленники смогут выполнить произвольный код в вашем приложении.

Предоставив разработчикам возможность отключить проверку границ, Java потеряет одну из своих ключевых функций - независимо от того, насколько неправильным является Java-разработчик, в его/ее коде не будет никаких эксплуатационных переполнений буфера.

Если вы хотите использовать язык, на котором программисту доверяют управлять собственной проверкой границ, могу ли я предложить С++. Это дает вам возможность выделять массивы без автоматической проверки границ (new int []) и распределять массивы с проверкой встроенных границ (std::vector).

Кроме того, я настоятельно рекомендую, чтобы перед тем, как обвинять ограничения в скорости потери скорости в вашем приложении, вы выполняете некоторую BENCHMARKING, чтобы определить, есть ли где-то еще в вашем коде, который может вызвать узкое место.

Вы можете обнаружить, что для цели компилятора язык байт-кода, такой как MSIL, больше подходит для ваших нужд, чем байт-код Java. MSIL строго типизирован и не страдает от ряда неэффективных действий, которые вы нашли в Java.