Введение
Оптимизация компилятора
В информатике, исключение проверки границ — это оптимизация компилятора, полезная в языках программирования или средах выполнения, которые обеспечивают проверку границ, то есть проверку каждого индекса при обращении к массиву на предмет его нахождения в пределах допустимого диапазона индексов. Её цель — определить, какие из этих операций индексирования не требуют проверки во время выполнения, и устранить эти проверки. Типичный пример — доступ к элементу массива, его изменение и сохранение измененного значения в тот же массив по тому же индексу. Обычно в этом случае проверка границ выполняется при чтении элемента из массива и повторно — при записи измененного элемента с использованием того же индекса. Исключение проверки границ может устранить вторую проверку, если компилятор или среда выполнения могут установить, что размер массива и индекс не изменяются между этими двумя операциями. Другой пример возникает, когда программист перебирает элементы массива, а условие цикла гарантирует, что индекс остается в пределах границ массива. Может быть сложно определить, что ручная проверка, выполненная программистом, делает автоматическую проверку избыточной. Однако компилятор или среда выполнения все равно могут успешно выполнить исключение проверки границ в этом случае.
In computer science, bounds checking elimination is a compiler optimization useful in programming languages or runtime systems that enforce bounds checking, the practice of checking every index into an array to verify that the index is within the defined valid range of indexes. Its goal is to detect which of these indexing operations do not need to be validated at runtime, and eliminating those checks. One common example is accessing an array element, modifying it, and storing the modified value in the same array at the same location. Normally, this example would result in a bounds check when the element is read from the array and a second bounds check when the modified element is stored using the same array index. Bounds checking elimination could eliminate the second check if the compiler or runtime can determine that neither the array size nor the index could change between the two array operations. Another example occurs when a programmer loops over the elements of the array, and the loop condition guarantees that the index is within the bounds of the array. It may be difficult to detect that the programmer's manual check renders the automatic check redundant. However, it may still be possible for the compiler or runtime to perform proper bounds checking elimination in this case.
На языках, скомпилированных на основе исходного языка
Один из способов исключения проверок границ — использовать типизированное статическое представление в форме одиночного присваивания и для каждого массива создавать новый тип, представляющий безопасный индекс для этого конкретного массива. Первое использование значения в качестве индекса массива приводит к приведению типов во время выполнения (и соответствующей проверке), но впоследствии это безопасное значение индекса можно использовать без приведения типов, не теряя при этом корректности или безопасности.
На языках, составленных JIT
Точно вовремя компилируемые языки, такие как Java и C#, часто проверяют индексы во время выполнения перед обращением к массивам. Некоторые компиляторы JIT, например HotSpot, способны исключить часть этих проверок, если они выясняют, что индекс всегда находится в допустимом диапазоне, или если предыдущая проверка уже привела бы к возникновению исключения.