Front-end/JavaScript

JS 동작원리 4편 - 콜 스택

파리외 개발자 2022. 11. 3. 01:01

메모리 힙에 이어서 이번엔 콜 스택에 대해 알아보도록 한다.

콜 스택은 이름에서 알 수 있듯이 스택 구조의 저장공간에서 코드를 호출한다.

 

Call Stack

위와 같은 코드의 JS문서가 실행된다고 가정했을 때 콜 스택을 확인해보자

크롬 개발자 콘솔창에서 해당 코드를 실행시켜서 디버깅을 하면 스코프 상태 밑에 콜 스택을 볼 수 있다.

처음 스택에 들어가는 것은 anonymous, 전체 파일이며 main함수라고 보면 된다.

파일이 실행되고 calc함수를 호출하는 코드를 만난다.

콜 스택을 확인해보자 anonymous위에 calc가 쌓인 것을 볼 수 있다.

이후 실행상태는 calc함수 내의 코드로 이동했다.

sum을 계산하고 리턴문으로 넘어갔더니 이번엔 sub함수 호출을 만나게 된다.

다음 행동이 이제는 예상이 갈 것이다.

역시나 sub가 호출되었으므로 콜 스택에 calc위로 sub이 쌓이게 되며

실행상태는 sub함수로 이동하여 계산을 한다.

계산이 끝난 sub함수는 리턴을 하고 종료가 된다.

콜 스택에서도 sub이 사라졌음을 확인할 수 있다.

마찬가지로 calc함수도 리턴을 하고 콜 스택에서 pop 될 것이고

마지막으로 anonymous가 콜 스택에서 사라짐으로써 프로그램은 종료될 것이다.

코드 실행을 한 줄씩 하면서 실행된 함수를 스택에 push하고 종료된 함수는 다시 pop을 한다.

 

Call stack overflow

스택 오버플로우는 보안 쪽에서 유명한 이슈이자 개발자 질답 사이트이기도 하다.

JS엔진의 콜 스택도 당연히 스택 자료구조를 사용하기 때문에 

메모리 힙과 마찬가지로 저장용량에 한계가 있다.

무한 재귀함수를 개발자 콘솔에서 실행시켜볼 생각 하니 가슴이 두근거린다.

메모리 힙의 메모리 누수와는 다르게 페이지가 멈추진 않았지만

콜 스택 사이즈를 넘어섯다는 오류를 확인할 수 있다.

중요하진 않지만 콜 스택의 사이즈는 브라우저마다 다르지만 대략 13000~15000의 크기를

가진다고 알고있다.

무한 루프 이외에는 웬만하면 스택 사이즈를 넘기긴 힘들지만

스택의 깊이가 과도하게 깊어지지 않게끔 함수를 작성하는 것이

조금은 스택의 공간 절약에 도움이 될 것이다.