나는 방금이 질문을 알아 차렸고 여기에 $ .02를 더하고 싶었습니다.
Java의 경우 이것은 실제로 옵션이 아닙니다. "연결할 수없는 코드"오류는 JVM 개발자가 개발자를 모든 것으로부터 보호하거나 특별히 경계해야한다고 생각한 것이 아니라 JVM 사양의 요구 사항에서 비롯됩니다.
Java 컴파일러와 JVM은 모두 현재 메서드에 할당 된 스택의 모든 항목에 대한 명확한 정보 인 "스택 맵"을 사용합니다. JVM 명령이 한 유형의 항목을 다른 유형으로 잘못 처리하지 않도록 스택의 모든 슬롯 유형을 알아야합니다. 이것은 숫자 값이 포인터로 사용되는 것을 방지하는 데 가장 중요합니다. Java 어셈블리를 사용하여 숫자를 푸시 / 저장 한 다음 객체 참조를 팝 /로드 할 수 있습니다. 그러나 JVM은 클래스 유효성 검사 중에이 코드를 거부합니다. 즉, 스택 맵을 만들고 일관성을 테스트 할 때입니다.
스택 맵을 확인하기 위해 VM은 메서드에있는 모든 코드 경로를 살펴보고 실행될 코드 경로에 관계없이 모든 명령어의 스택 데이터가 이전 코드가 푸시 한 내용과 일치하는지 확인해야합니다. / 스택에 저장됩니다. 따라서 다음과 같은 간단한 경우 :
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
3 행에서 JVM은 'if'의 두 분기가 Object와 호환되는 항목 (로컬 var # 0 일뿐)에만 저장되었는지 확인합니다 (3 행 이상의 코드가 로컬 var # 0을 처리하는 방식이기 때문에) ).
컴파일러가 도달 할 수없는 코드에 도달하면 해당 지점에서 스택이 어떤 상태인지 알 수 없으므로 상태를 확인할 수 없습니다. 그 시점에서 더 이상 코드를 컴파일 할 수 없습니다. 지역 변수도 추적 할 수 없기 때문에 클래스 파일에이 모호함을 남기는 대신 치명적인 오류가 발생합니다.
물론 이와 같은 간단한 조건 if (1<2)
은 속일 수 있지만 실제로는 속이지는 않습니다. 코드로 이어질 수있는 잠재적 분기를 제공하고 적어도 컴파일러와 VM 모두에서 스택 항목을 사용할 수있는 방법을 결정할 수 있습니다. 의 위에.
추신 :이 경우 .NET이 무엇을하는지 모르겠지만 컴파일도 실패 할 것이라고 생각합니다. 이것은 일반적으로 모든 기계 코드 컴파일러 (C, C ++, Obj-C 등)에서 문제가되지 않습니다.