scaleform.minarto.com

메모리의 이원화 본문

Core

메모리의 이원화

미나토 2012. 1. 26. 12:26


1. js vs as2


앞선 포스팅에서 말했듯 저는 js를 사용해본 적이 거의 없기 때문에 잘 몰랐지만, as2는 사실 js를 그대로 본따 만든 언어입니다...

js의 window 가 바로 as2의 _global 이고, DOM 이 바로 MovieClip, TextField 입니다...

as2에서, new Array 는 가능하되... MovieClip은 new MovieClip 대신 attachMovie 를 써야하는 이유가 여기에 있는 겁니다. DOM 객체를 가져와서 사용할 뿐인거죠... 만들어서 쓰는 것이 아니고요

그러다 보니 as2도 js의 이원화된 메모리 관리를 그대로 따라갑니다...



2. 메모리 이원화

그럼 메모리 이원화에 대해 말해야겠군요...

js는 메모리 관리 영역이 두군데로 나뉩니다. 오브젝트(Object Class 를 말하는게 아닙니다) 영역과 실행 메모리 영역입니다...


프로그래밍을 해서 컴퓨터에서 실행을 하려면, 우리가 작성한 코드는 당연히 컴퓨터의 메모리 어딘가로 올라가야 합니다... 그래야 CPU에서 그걸 가지고 연산을 하겠죠...

우리가 작성한 코드... 그것을 하나의 오브젝트로 보고 js vm 에서 거대한 해시맵에 담아줍니다. 여기까지는 c 와 비슷하다면 비슷할겁니다.(전 c를 한번도 안해봤기 땜시 잘 모르겠지만...)
이것을 오브젝트 메모리 영역이라고 하겠습니다.


그럼 실행 메모리 영역은 무엇이냐...

코드란 것은 결국 동작시키기 위해 작성하는 것... 동작하지도 않을 코드는 존재하지 않겠죠...
앞에서 작성한 코드가 실행될 때... 즉, 함수가 실행될 때 메모리를 js vm에서 메모리를 새롭게 분배해 줍니다...
예를 들어, 함수 내에 var a = 1 라고 지역변수(일단은 이렇게 부르겠습니다)를 선언하면 1 이라는 Number 메모리를 새로 잡아주고 a 라는 변수에 참조시켜주는거죠


여기서 js가 c 같은 언어에 비해 느린 이유가 만들어집니다... c 는 동작시에 사용하게 될 메모리를 미리 개발자가 잡아놔야 합니다. 그러면 컴파일러에 의해 컴파일이 되면서 메모리를 정리(?)해주게 되고, 해당 포인터를 바로 사용하면 됩니다.

하지만 js는 컴파일이 없으니 실행되는 동안  vm이 알아서 그런 일을 다 해줘야 합니다...

게다가 알아서 생성해줬으니 알아서 지워도 줘야겠죠... 안그러면 메모리가 폭발할 테니까요... 바로 gc가 돌아야 합니다...



3. 요약

첫번째니 가볍게 정리를 하겠습니다.

1. as2  js
2. js는 메모리를 두가지로 관리한다. 오브젝트 영역과 실행 메모리 영역




참조해볼 사이트

http://js.bsidesoft.com/ 
http://blog.naver.com/kjhbond/50129536282


 
참조해볼 서적

javascript.jpg 
http://insightbook.springnote.com/pages/1109998 


js_patterns_cover_small.jpg 
http://insightbook.springnote.com/pages/8500578