2014-10-15 3 views
2

이것은 StackOverflow에 대한 나의 첫 번째 질문이므로 프로토콜 위반 사례는 용서하십시오.왜 재귀 WebGL 함수는 스택 오버플로가 발생하지 않습니까?

저는 대학에서 컴퓨터 그래픽 수업을 통해 WebGL을 배우고 있습니다. 화면에 사각형 회전을 학습하는 동안, 내 친구들과 나는 렌더링 기능에 다음 코드를 발견 :

function render() 
{ 
gl.clear(gl.COLOR_BUFFER_BIT); 
theta += 0.1; 
gl.uniform1f(thetaLoc, theta); 
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); 
render(); 
} 

우리가 이해하지 못하는, 우리의 교수는 우리에게 적절한 대답을 할 수 없었다 무엇 이 코드가 반복적으로 자신을 호출하기 때문에 스택 오버플로가 발생하지 않는 이유입니다. 우리는 코드를 실행했지만 아무런 문제가 발생하지는 않지만 이유는 알 수 없습니다.

Google 교과서 또는 온라인에서 답변을 찾을 수 없습니다. 누구든지 그것을 설명 할 수 있다면, 나는 그것을 반 친구들에게 전달할 것이다. 미리 감사드립니다.

+2

http://stackoverflow.com/questions/310974/what-is-tail-call-optimization – JAre

+0

필자는 Tail Call Optimization에 대해 들어 본 적이 없지만 제공 한 링크를 통해 완벽하게 설명했습니다. 나는 정보를 전달할 것이다. 감사! – Lochian

+0

대부분의 컴파일러는 최적화 기회를 인식 할만큼 똑똑하지만 다른 하나는 오버플로가 될 수 있으므로주의하십시오. 반면에 함수형 언어는 재귀에 많이 의존하며 그 중 일부는 명확한 꼬리말 최적화를위한 수단을 제공하므로 재귀가 나쁜 것은 아니지만 위험 할 수 있습니다. – JAre

답변

3

스택 오버플로가 발생합니다. 내가 그것을 실행하면 나는 당신이 아마 재귀 아니다이 경우이

function render() { 
    ... 
    requestAnimationFrame(render); 
} 
render(); 

과 같은 코드를 본 것 같아요

Uncaught RangeError: Maximum call stack size exceeded 

를 얻을. 렌더링 함수가 애니메이션 프레임을 요청한 다음 종료합니다. 그런 다음 브라우저는 render을 다시 호출하는 다음 프레임을 렌더링합니다.

+0

나는 미쳤다고 확인해 주셔서 고마워요. 그러나 JAre는 Tail Call Optimization을 설명함으로써 의견에 대한 저의 질문에 대답했습니다. 분명히 브라우저에 최적화가 없어 스택 오버플로가 발생했습니다. 이 문제를 이해하도록 도와 주신 귀하와 그 분께 감사드립니다. – Lochian

+0

나는 ES6 +에만 꼬리 호출 최적화가 있다고 생각한다. – JAre

관련 문제