8.2 Dead Code Elimination
8.2 Dead Code Elimination
Dead Code Elimination 또는 DCE는 출력에서 사용되지 않는 코드를 제거하는 컴파일러 기능이에요. 타이핑 후 컴파일러는 DCE 진입점(보통 main 메서드)을 평가하고 어떤 필드와 타입이 사용되는지 재귀적으로 결정합니다. 사용된 필드는 그에 따라 표시되고, 표시되지 않은 필드는 그 클래스에서 제거됩니다.
DCE는 명령줄 호출 시 설정되는 세 가지 모드가 있어요:
-dce std: Haxe 표준 라이브러리의 클래스만 DCE의 영향을 받는다. 모든 대상의 기본 설정.-dce no: DCE가 수행되지 않는다.-dce full: 모든 클래스가 DCE의 영향을 받는다.
DCE 알고리즘은 타입 있는 코드에서는 잘 동작하지만, dynamic이나 리플렉션(reflection)이 관련되면 실패할 수 있어요. 이는 다음 메타데이터를 붙여 필드나 클래스를 사용됨으로 명시적으로 표시해야 할 수 있습니다:
@:keep: 클래스에 사용하면 클래스와 모든 필드가 DCE의 영향을 받지 않는다. 필드에 사용하면 그 필드가 DCE의 영향을 받지 않는다.@:keepSub: 클래스에 사용하면 주석 처리된 클래스와 모든 하위 클래스에@:keep처럼 작동한다.@:keepInit: 보통 DCE로 모든 필드가 제거된(또는 처음부터 빈) 클래스는 출력에서 제거된다. 이 메타데이터를 사용하면 빈 클래스가 유지된다.@:ifFeature("pack.SomeType.field"): 필드에 사용하면pack.SomeType.field가 사용되고 DCE로 제거되지 않으면 그 필드가 유지된다.@:ifFeature("pack.SomeType.*"): 필드에 사용하면pack.SomeType가 사용되고 DCE로 제거되지 않으면 그 필드가 유지된다.
클래스를 소스 코드를 수정하지 않고 명령줄에서 @:keep로 표시해야 하면 컴파일러 매크로가 있습니다: --macro keep('type dot path'). 이 매크로의 자세한 내용은 haxe.macro.Compiler.keep API를 참조하세요. 이는 패키지, 모듈 또는 하위 타입이 DCE에 의해 유지되도록 표시하고 컴파일에 포함합니다.
컴파일러는 활성 모드에 따라 값이 "std", "no" 또는 "full"인 플래그 dce를 자동으로 정의합니다. 이는 조건부 컴파일에 사용할 수 있어요.
추가 정보: DCE 다시 쓰기 — DCE는 원래 Haxe 2.07에서 구현되었습니다. 이 구현은 함수가 명시적으로 타이핑되었을 때 사용된 것으로 간주했어요. 문제는 인터페이스 같은 여러 기능이 타입 안전성을 검증하기 위해 모든 클래스 필드를 타이핑하게 만든다는 것이었습니다. 이것은 효과적으로 DCE를 완전히 무너뜨려 Haxe 2.10에서 다시 쓰기를 촉발했습니다.
추가 정보: DCE와 try.haxe.org —
JavaScript대상의 DCE는 http://try.haxe.org 웹사이트가 게시되었을 때 큰 개선을 보았습니다. 생성된 JavaScript 코드의 초기 반응은 엇갈렸고, 어떤 코드를 제거할지 더 세밀한 선택으로 이어졌습니다.
본문
DCE 모드
-dce std(기본, 표준 라이브러리만), -dce no(없음), -dce full(전체) 세 모드가 있어요. main 진입점에서 재귀적으로 사용된 필드를 결정하고 나머지를 제거합니다.
유지 메타데이터
@:keep, @:keepSub, @:keepInit, @:ifFeature로 DCE에서 유지할 클래스/필드를 표시합니다. --macro keep('...')로 명령줄에서도 가능해요.
dce 플래그
컴파일러는 dce 플래그를 std/no/full 중 하나로 정의해 조건부 컴파일에 쓸 수 있습니다.