컴파일 언어 프로그램의 생명주기는 Language Code(Lint Time) -> Machine Language(Compile Time) -> File -> Load -> Run(Run time) -> Terminate 이다. Load되어 컴퓨터에 올라간 것을 프로그램이라고 한다.
스크립트 언어 프로그램의 생명주기는 Language Code -> File -> Load -> Machine Language -> Run -> Terminate 이다. 일반 프로그램과는 달리 컴파일이 되지 않고 로드된 후에 컴파일을 하고 실행된다.
자바스크립트도 스크립트 언어이기 때문에 코드를 브라우저에 로딩하고 로드가 끝난 다음에 컴파일을 하고 실행한다.
코드는 명령부분과 데이터부분으로 나눠져서 메모리에 적재된다.
CPU는 4가지로 구성된다.
그래서 런타임이란?
Load (메모리에 적재)
-> Run
컴파일러는 어떻게 메모리에 적재되지 않아서(로드가 되지 않음) 물리적인 메모리를 갖고있지도 않은 상태에서 코드를 검증하지?
essential definition loading (프로그램 실행에 반드시 필요한 것들을 컴파일할 때 메모리에 적재)
-> v table mapping (로딩하고 실행하기 전에 가상 메모리와 진짜 메모리를 매핑)
-> run
-> runtime definition loading
-> run
이처럼 컴파일 시점에서 확정되는게 아니라 런타임에서 정의되기도 한다.
따라서 스태틱과 런타임이란 상대적인 것이다. 1번이 정의되어야만 2번이 정의될 수 있으므로 2번에게 1번은 static이 된다.
메모리, 주소, 포인터, 변수, 디스패치(주소로부터 값을 얻는 행위)가 존재한다.
A의 메모리 참조를 가지고 있는 B를 직접참조한 C가 있다. 여기서 B가 다른 메모리를 참조하더라도, C는 계속해서 자신은 B를 가지고 있다고 생각하고, 여기서 에러가 발생한다. 이처럼 참조를 복사하면 큰 문제가 일어난다.
함수형 프로그래밍에서는 참조를 사용하지 말도록 한다. 객체지향 프로그래밍에서는 직접참조하지 않도록 더블 디스패치로 해결한다.
명령이 순서대로 실행되는 과정을 흐름이라고 한다. 원래 메모리에 적재되는 명령어를 수행하는 동안 간섭하지 못한다. 하지만 제어문을 이용해 flow control을 할 수 있다. 함수나 클래스를 이용해 sub flow도 만들 수 있다.