2012-02-08 2 views
3

배경 : 학교 프로젝트를 위해 .NET 컴파일러 (C#과 매우 유사)를 프로그래밍 중입니다. 현재 추가하려고하는 기능 중 하나는 메서드 내에서 꼬리 호출 재귀입니다.인스턴스 메서드의 CIL (MSIL) tailcall 재귀

추가 정보 : CIL에서는 "this"가 마치 다른 인수 인 것처럼 인스턴스 메서드에 전달됩니다. 따라서 정적 메서드의 첫 번째 인수에 액세스하면 ldarg.0을 내보내 겠지만 인스턴스 메서드의 첫 번째 인수에 액세스하면 ldarg.1을 내고 ldarg.0을 내 보낸 인스턴스 메서드에서 "this"에 액세스합니다. . (인스턴스 메소드는 상상했던 것보다 확장 메소드와 훨씬 비슷합니다.)

질문 : 부작용없이 starg.0을 사용하여 "this"를 설정할 수 있습니까?

문제의 원인 : 메서드가 인스턴스 메서드인지 여부는 BlackB 비트 인 MethodBuilder로 설정됩니다. "this"는 다른 모든 인수와 같지만 일부 JIT 컴파일러는 "this"를 별도로 추적하고이 값에 따라 동작을 변경한다는 것을 알고 있습니다. 인스턴스 메서드에서 "this"를 설정할 때 부작용이 있다면 어떻게 피할 수 있습니까?

+0

흥미로운 질문이지만, 저는 여러분이 제가 생각하는 것에 대해 묻고 싶습니다. 다른 클래스 인스턴스에서 현재 메소드를 꼬리표로 처리하는 경우에만 문제가됩니다. 당신이 어쨌든 설명하는 방법으로 다른 방법을 시도하는 것은 불가능합니다. 동일한 'this'를 사용하여 현재 메소드를 호출하는 것은 인수 0의 수정을 필요로하지 않습니다. – hvd

답변

2

how F# implements tail-call을보고 싶을 수 있습니다.

+0

완벽한! 고맙습니다! – aboveyou00

+0

누군가 관련 부분을 지적 할 수 있습니까? – Stilgar

+0

나는 아래의 코멘트에서 이것을 말했다. 그러나 나는 그것을 여기에서 되풀이 할 것이다. 되돌아 보면, 저는 실제로 그것이 의미하는 바를 물어 보지 않았습니다. 단지 그것의 증상을 수정하는 방법이었습니다.그것은 정직한 실수했다, 그러나 나는 어쨌든 오해의 소지가되었다 죄송합니다. – aboveyou00

1

로컬 변수로 추출 할 수 있습니다. 이렇게하면 안전하게 설정할 수 있음을 알 수 있습니다. (귀하의 질문을 올바르게 이해하시기 바랍니다.)

+0

이것은 문제를 해결하지 않습니다 - 일어날 동일한 부작용 당신이 starg.0을 방출하고 JIT 컴파일러가 업데이트되었다는 가정하에 행동한다면. 답변을 주셔서 감사합니다. – aboveyou00

+0

@ aboveyou00 이것은'starg.0'이 안전하지 않더라도 (나는 왜 그런지는 모르지만 확실하지는 않습니다), 인수 0 대신에 여분의 변수를 사용해야합니다. 안전한. – hvd

+0

그래서 로컬 변수에 대한 참조를 전달하더라도 JIT 컴파일러가 "this"를 추적 할까 걱정됩니다. – Stilgar