activation record - hochan222/Everything-in-JavaScript GitHub Wiki
Activation Record
ํจ์ ํธ์ถ์ ํน์ ์ธ์คํด์ค์ ๋ํ ์ค์ํ ์ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Data Structure)์ด๋ค. ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๊ฑฐ๋ ๋ถ๋ถ์ ์ผ๋ก ๋ ์ง์คํฐ์ ์ ์ฅ๋ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก Activation Record๋ ๋ค์์ด ํฌํจ๋๋ค.
- ํธ์ถ์์ Activation Record์ ๋ํ ํฌ์ธํฐ(DynamicChain)
- ์ค์ฒฉ๋ Lexical Scoping ์ ํ์ฉํ๋ ์ธ์ด ์์ ๋๋ฌ์ธ๋ ๋ฒ์์ ActivationRecord ์ ๋ํ ํฌ์ธํฐ(Referencing Environment, Static Chain)
- ์ด๋ฌํ ๋๋ถ๋ถ์ ์ธ์ด์์๋ ์ผ๋ฐ์ ์ผ๋ก ํธ์ถ ์ฒด์ธ์ ์ด๋๊ฐ์ ๋๋ฌ์ธ๋ ํจ์๊ฐ ํธ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ง์ญ ๋ณ์ (๋ ์ง์คํฐ์ ์์ฃผ ์บ์๋๋ค.)
- ํจ์์ ๋ํ ์ค์ ๋งค๊ฐ ๋ณ์ (์ด๊ฒ๋ ๋ ์ง์คํฐ์ ์์ฃผ ์บ์๋๋ค.)
- ํจ์์ ์ต์ข ๋ฐํ ๊ฐ์ ์ํ ๊ณต๊ฐ
๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ Activation Record๋ ์๊ฒฉํ LIFO(LastInFirstOut) ๊ท์จ์ ์ ์ง ํ๋ฏ๋ก ์คํ์ ์ ์ฅ๋๋ค. ์ด๋ฌํ ์ด์ ์์ Activation Record๋ ์ผ๋ฐ์ ์ผ๋ก Stack Frame์ด๋ผ๊ณ ๋ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก C์์๋ ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก ์คํ์ ํญ์ ์ฌ์ฉํ๋ฏ๋ก Stack Frame์ด ์ ํํ ์ฉ์ด์ธ๋ฐ ๋ค๋ฅธ ์ธ์ด์์๋ ์คํ์ ์ฌ์ฉํ์ง ์๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ Activation Record๋ ๋ง์ด ์๊ฒผ๋ค. (๋ ์ ํํ ์ฉ์ด)
๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์ ์๋ํ๋ค. (LIFO ์๋ฐ ๊ฒฝ์ฐ)
- First Class Lexical Closures (ํด๋ก์ ๋ ์ฐธ์กฐ ํ๊ฒฝ๋ณด๋ค ์ค๋ ์ง์๋ ์ ์๋ค.)
- Continuations, excluding UpwardContinuations
- CoRoutines, BlocksInSmalltalk, and a few other control structures that are found in various languages.
- ์ฝ๋ฃจํด์ ํธ์ถ ์ฌ์ด์ ์ ์ด ์ํ๋ฅผ ์ ์ฅํ๋ ํจ์ ๋๋ ํ๋ก์์ ์ด๋ค. ์ผ๋ฐ์ ์ธ ์๋ก ์ดํ๋ถ์๊ธฐ๊ฐ ์๋ค.
ํธ์ถ์์ Activation Record์ ๋ํ ํฌ์ธํฐ(DynamicChain)
-
About ํธ์ถ์์ Activation Record์ ๋ํ ํฌ์ธํฐ (== Frame Pointer)
- ํจ์์ Stack Frame ์์์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ์ง์คํฐ์ด๋ค.
- IA32์์๋ ์ฃผ๋ก EBP๋ฅผ ์ด๋ฌํ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
- Stack Frame์ ์คํํ ๋ ์ค์ ๋๋ฉฐ, Stack Frame์ด ๋ซํ๋๊น์ง ๋ณํ์ง ์๋๋ค.
-
Why?
- Stack๋ด์ ๋ฐ์ดํฐ๋ ์ปดํ์ผ ํ์์์ ๊ทธ ์ฃผ์๋ฅผ ์ ์ ์๋ค. ๊ทธ๋์ ํจ์์ ์คํ ๊ฒฝ๋ก์ ๋ฐ๋ผ Call Stack ๋ชจ์์ด ๋ณํ๊ฒ ๋๊ณ , ๋ํ, ์ค๋๋ ์ ๋๋ถ๋ถ์ OS๋ค์ Stack Buffer Overflow ๋ฐฉ์ด๋ฅผ ํ๊ธฐ์ํด Random Stack์ ์ฌ์ฉํ๋ค.
- ์์ ๊ฐ์ ์ด์ ๋ก ESP๊ฐ์ ๊ทธ ์์น๊ฐ ๊ณ ์ ๋์ง ์๊ณ ์ปดํ์ผ๋ฌ์๊ฒ ํฐ ๋ถ๋ด์ ์ค๋ค. ์ด๋ ์ฐ๋ฆฌ๋ ๊ณ ์ ๋ ๊ธฐ์ค์ ์ด ํ์ํ๋ฐ ๊ทธ๊ฒ Frame Pointer์ด๋ค.
Function Prolog
- Stack Frame์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํจ์๋ ํญ์ Frame Pointer๋ฅผ ์ ์ ํ๋ ์ฝ๋ ๊ตฌ๋ฌธ์ผ๋ก ์์ํ๊ฒ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
PUSH EBP ; caller์ Stack Frame Pointer๋ฅผ ๋ฐฑ์
ํ๋ค.
MOV EBP, ESP ; ESP ๊ฐ์ EBP์ ๋ณต์ฌํจ์ผ๋ก์จ Stack Frame Pointer๋ฅผ ์
์
ํ๋ค.
SUB ESP, n ; ํ ๋น๋ ์ง์ญ๋ณ์๋ฅผ ์ํ ๊ณต๊ฐ์ ESP์ ์์น๋ฅผ ์ฎ๊ธฐ๋ฉด์ ํ๋ณดํ๋ค.
- ๋งจ๋ฐ์ SFP(Stack Frame Pointer)๋ main ํจ์๋ฅผ ์ํ Pointer์ด๋ค.
- ๋งจ๋ฐ์ ์ฐํ EBP์ ์์น๊ฐ call myfuncํจ์๋ฅผ ๋ถ๋ฅด๋ฉด์ ์๋ก ์ฎ๊ธฐ๊ฒ ๋๋ค.
- ์ค๊ฐ์ ๋ง๋ค์ด์ง SFP๋ myfuncํจ์๋ฅผ ์ํ Pointer์ด๋ค.
- Stack Frame์ด ๋ง์ง๋ง์ผ๋ก ๋ง๋ค์ด์ง ๊ณณ์ EBP๊ฐ ์์นํ๊ฒ ๋๋ค.
- ๊ทธ ํ POP EBP๋ฑ์ ํตํด ๋งจ ๋ง์ง๋ง SFP๊ฐ ํธ์ถ๋ ๊ณณ์ EBP์ ์์น๋ก ์ด๋ํ๊ฒ ๋๋ค.
Function Epliog
Stack Frame์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํจ์์ ๋๋ถ๋ถ์๋ Frame Pointer๋ฅผ ์๋๋๋ก ๋ณต์ํ๋ ์ฝ๋๊ฐ ์ค๊ฒ๋๋ค.
MOV ESP, EBP ; EBP๊ฐ ์ฆ, ๊ณ ์ ๋ EBP๊ฐ์ ESP์ ์ค์ผ๋ก์จ ์ง์ญ ๋ณ์๋ฅผ ์ํด์ฃผ์๋ ๊ณต๊ฐ์ ์์ค๋ค.
POP EBP ; EBP์์น๋ฅผ ๊บผ๋ด๋ฉด์ ์๋ EBP ์์น๋ก return ๊ฐ์ ๋ถ๋ฌ์จ๋ค.
Call Stack
Call Stack์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ Stack Frame์ ๋ง๋ ๋ค. ์ฆ, Call Stack์ ๊ฐ ๋จ๊ณ๊ฐ Stack Frame์ด๋ค. Call Stack์ด ๋จ์ผ์ด๊ธฐ ๋๋ฌธ์ ํจ์ ์คํ์ด ์์์ ์๋๋ก ํ๋ฒ์ ํ๋์ฉ ์ํ๋๋ค. ์ฆ, ํธ์ถ ์คํ์ ๋๊ธฐ์ ์ด๋ค.
์์์ ์ธ๊ธํ์ง๋ง ํ๋ฒ ๋ ์ ์ด๋ณธ๋ค. Call Stack์ ๋ฌด์์ธ๊ฐ? ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ค์์ ํธ์ถ ์คํ์ LIFO ์์น์ ์ฌ์ฉํ์ฌ ํจ์ ํธ์ถ์ ์์๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ค.
๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค.
function firstFunction(){
throw new Error('Stack Trace Error');
}
function secondFunction(){
firstFunction();
}
function thirdFunction(){
secondFunction();
}
thirdFunction();
Manage function invocation (call)
- call stack์ ๊ฐ ์คํ ํ๋ ์์ ์์น ๊ธฐ๋ก์ ์ ์งํ๋ค. ์คํํ ๋ค์ ํจ์๋ฅผ ์๊ณ ์๊ณ , ์ด๊ฒ์ด JavaScript์์ ์ฝ๋ ์คํ์ ๋๊ธฐ์ ์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
StackOverflow๋ฅผ ์ผ์ผ์ผ๋ณด์.
์ค๊ฐ Summary
- Call Stack
- ๋จ์ผ ์ค๋ ๋์ด๋ค. (ํ๋ฒ์ ํ๊ฐ์ง๋ง ๊ฐ๋ฅ)
- ์ฝ๋ ์คํ์ด ๋๊ธฐ์ ์ด๋ค.
- Call Stack์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ Stack Frame์ ๋ง๋ ๋ค.
- LIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
๊ทธ๋์ this์ ๋ํ ์ ๋ณด๊ฐ Activation Record์ ๊ธฐ๋ก๋๋ค๋๋ฐ ์ด๋ป๊ฒ ๊ธฐ๋ก๋๋๋ฐ?
์ ๋๋์ด.. ๋ณธ๋ก ์ ๋งํ๊ธฐ์ํ ์ค๋น๋ฅผ ๊ฐ์ท๋ค.. CS ์ง์ ์ด๋ ๊ฒ ์ค์ํ๋ค..ใ
Stack Frame ๊ตฌํ์ ์ํ ํจ์๋ก Stack Frame์ ์ด๋ค๊ฒ ๋ค์ด๊ฐ๋์ง ์ธ๋ถ ์ ๋ณด๊ฐ ์๋์์๋ค.
์์์ ์์๋ณธ Activation Record์ ๊ฐ๋ ๋ค๋ก ๋ฏธ๋ค ๋ดค์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ ๊ฒ์ด๋ค.
function foo() { var a = 1; }
function bar() { var b = 2; foo(); }
bar();
start of the stack
---------------------------
bar local frame
* a couple of OS pointers
* local variable b (2)
* place for returned value
* pointer to next frame
---------------------------
foo local frame
* a couple of OS pointers
* local variable a (1)
* place for returned value
์ฐพ์๋ค.. ๊ฐ๊ฐ์ stack frame์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค.
- Whether the call is a construct call.
- The type of the
this
value (Type). - The name of the function called (functionName).
- The name of the property of this or one of its prototypes that holds the function (methodName).
- The current location within the source (location)
The Type value is the name of the function stored in the constructor field of this. In V8, all constructor calls set this property to the constructor function so unless this field has been actively changed after the object was created it, it holds the name of the function it was created by. If it is unavailable the Class property of the object is used.
๋๋ฒ์งธ ์์๋ this์ ์์ฑ์ ํ๋์ ํจ์ ์ด๋ฆ์ด ์ ์ฅ๋๋ค. V8์์ ๋ชจ๋ ์์ฑ์๋ค์ ์์ฑ์ ํจ์์ ์ด ๊ฐ์ ๋ฃ๋๋ค. ๊ทธ๋์ ๊ฐ์ฒด ์์ฑ๋ค์ ์ด ๊ฐ์ด ๋ณํ ์ ์๊ณ , ์์ ์ ์์ฑํ๊ฒํ ํจ์์ ์ด๋ฆ์ ๊ฐ๋๋ค. ์ ๋งํ๋ฉด ์ด ๊ฐ์ ์ ์ง๋๋ค. ๊ฐ์ฒด๊ฐ Class ์์ฑ์ผ ๋๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
์ด์ this์ ๋์์ด ์ดํด๊ฐ ๋๋ค. ํจ์ ๋ด๋ถ์ this๊ฐ ์์๋ object ๋ด๋ถ์ ์์๋๋ object๋ฅผ ๊ฐ๋ฅดํค๋๋ฐ ์ผ๋ฐ ํจ์ ์์์๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ ์ด์ ๊ฐ ์ ์ด์ object ์์ฑ์ ์ ๋ฌด๋ก ์ฌํ ๋น์ ํ๊ธฐ ๋๋ฌธ์ด์๋ค.
์์ง ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋์ด๋์ง ์์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ Call Stack์ Execute Stack, Stack Frame์ Execute Context๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ค์ ๊ธ๋ก ์ด๋ํ์. Execute Stack
History
# Activation Record
- https://wiki.c2.com/?ActivationRecord
- https://www.cs.princeton.edu/courses/archive/spring03/cs320/notes/7-1.pdf
- https://securely.tistory.com/entry/NO13-Stack-Frame%EA%B3%BC-%EB%B3%80%EC%88%98-%EA%B3%B5%EA%B0%84-%ED%99%95%EB%B3%B4%EC%97%90-%EB%8C%80%ED%95%B4
- https://en.wikipedia.org/wiki/Call_stack
# call stack
# caller vs callee
# SavedFrame
- https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/SavedFrame
-
SavedFrame์ธ์คํด์ค๋ ์คํ ํ๋ ์์ ๋จ์ผ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ๋๋ค. ๊ณผ๊ฑฐ ์คํ ์์ ์ JavaScript ํธ์ถ ์คํ์ ๋ํ๋ ๋๋ค.
-
# Stack Size
# Stack Frame JS