배경 : 학교 프로젝트를 위해 .NET 컴파일러 (C#과 매우 유사)를 프로그래밍 중입니다. 현재 추가하려고하는 기능 중 하나는 메서드 내에서 꼬리 호출 재귀입니다.인스턴스 메서드의 CIL (MSIL) tailcall 재귀
추가 정보 : CIL에서는 "this"가 마치 다른 인수 인 것처럼 인스턴스 메서드에 전달됩니다. 따라서 정적 메서드의 첫 번째 인수에 액세스하면 ldarg.0을 내보내 겠지만 인스턴스 메서드의 첫 번째 인수에 액세스하면 ldarg.1을 내고 ldarg.0을 내 보낸 인스턴스 메서드에서 "this"에 액세스합니다. . (인스턴스 메소드는 상상했던 것보다 확장 메소드와 훨씬 비슷합니다.)
질문 : 부작용없이 starg.0을 사용하여 "this"를 설정할 수 있습니까?
문제의 원인 : 메서드가 인스턴스 메서드인지 여부는 BlackB 비트 인 MethodBuilder로 설정됩니다. "this"는 다른 모든 인수와 같지만 일부 JIT 컴파일러는 "this"를 별도로 추적하고이 값에 따라 동작을 변경한다는 것을 알고 있습니다. 인스턴스 메서드에서 "this"를 설정할 때 부작용이 있다면 어떻게 피할 수 있습니까?
흥미로운 질문이지만, 저는 여러분이 제가 생각하는 것에 대해 묻고 싶습니다. 다른 클래스 인스턴스에서 현재 메소드를 꼬리표로 처리하는 경우에만 문제가됩니다. 당신이 어쨌든 설명하는 방법으로 다른 방법을 시도하는 것은 불가능합니다. 동일한 'this'를 사용하여 현재 메소드를 호출하는 것은 인수 0의 수정을 필요로하지 않습니다. – hvd