경계 검사 제거
Bounds-checking elimination컴퓨터 과학에서 경계 검사 제거는 경계 검사를 시행하는 언어 또는 런타임 시스템을 프로그래밍하는 데 유용한 컴파일러 최적화로서, 모든 인덱스를 배열로 검사하여 인덱스가 정의된 유효한 인덱스 범위 내에 있는지 검증하는 관행이다.[1]이 회사의 목표는 이러한 인덱싱 작업 중 런타임에 검증할 필요가 없는 작업을 감지하고 이러한 검사를 제거하는 것이다.
하나의 일반적인 예는 배열 요소에 접근하여 수정하고 수정된 값을 동일한 위치에 같은 배열로 저장하는 것이다.일반적으로 이 예에서는 요소를 배열에서 읽을 때 경계 검사를 수행하고 수정된 요소를 동일한 배열 인덱스를 사용하여 저장할 경우 두 번째 경계 검사를 수행할 수 있다.경계 검사 제거는 컴파일러 또는 런타임이 두 어레이 작업 간에 어레이 크기나 인덱스가 모두 변경될 수 없다고 판단할 수 없는 경우 두 번째 검사를 제거할 수 있다.또 다른 예는 프로그래머가 배열의 요소들을 루핑할 때 발생하며, 루프 조건은 색인이 배열의 범위 내에 있음을 보장한다.프로그래머의 수동 체크는 자동 체크 중복성을 렌더링한다는 것을 감지하기 어려울 수 있다.그러나 이 경우 컴파일러 또는 런타임은 적절한 경계 검사 제거를 수행할 수 있다.
구현
고유하게 컴파일된 언어로
경계 검사 제거를 위한 한 가지 기법은 입력된 정적 단일 할당 양식 표현과 각 배열에 대해 특정 배열에 대한 안전 색인을 나타내는 새로운 유형을 생성하는 것이다.값을 어레이 인덱스로 처음 사용하면 런타임 유형 캐스트(및 적절한 검사)가 발생하지만, 이후에 안전 인덱스 값을 정확성이나 안전성을 희생하지 않고 유형 캐스트 없이 사용할 수 있다.
JIT 컴파일 언어의 경우
Java, C#와 같은 적시 컴파일된 언어는 어레이에 액세스하기 전에 런타임에 인덱스를 확인하는 경우가 많다.HotSpot과 같은 일부 적시 컴파일러는 인덱스가 항상 올바른 범위 내에 있다는 것을 발견하거나 이전 검사에서 이미 예외를 두었을 경우 이러한 검사 중 일부를 제거할 수 있다.[2][3]
참조
- ^ Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2.
bounds-checking elimination.
- ^ Kawaguchi, Kohsuke (2008-03-30). "Deep dive into assembly code from Java". Archived from the original on 2008-04-02. Retrieved 2008-04-02.
- ^ "Fast, Effective Code Generation in a Just-In-Time Java Compiler" (PDF). Intel Corporation. Retrieved 2007-06-22.
외부 링크
- W. Amme, J. von Ronne, M. Franz.금고 사용기존 Java 가상 머신의 성능을 높이기 위한 TSA 표현(2002)