
참고블로그
1. JavaScript | 자바스크립트 작동 원리(Event Loop와 Call Stack, Web API, Callback Queue)
2. 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
3. 위키피디아
JIT컴파일 : just-in-time compliation 또는 dynamic translation은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트 코드를 실행하는 시점에서 자바가상머신이 바이트코드를 JIT컴파일을 통해 기계어로 변환한다.
최근의 JVM(자바가상머신), .NET, V8(node.js)에서는 JIT 컴파일 지원
바이트코드 컴파일러는 소스 코드를 중간언어인 바이트 코드로 변환. 바이트코드는 기계어는 아니지만 가상머신에 의해 기계어로 손쉽게 변환할 수 있는 코드. JIT컴파일러는 바이트 코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이런 기계어 변환은 코드가 실행되는 과정에서 실시간으로 일어나며(just-in-time) 전체코드의 필요한 부분만 변환한다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.
일반적인 인터프리터 언어(cpython등)는 바이트코드나 소스코드를 최적화 과정이 없이 번역하기 때문에 성능이 낮다. 반면 정적으로 컴파일하는 언어(c언어 등)는 실행 전에 무조건 컴파일을 해야하기 때문에 다양한 플랫폼에 맞게 컴파일을 하려면 시간이 오래 걸린다. 동적 컴파일 환경은 실행 과정에서 컴파일을 할 수 있게 만들어졌다. JIT는 정적 컴파일러 만큼 빠르면서 인터프리터 언어의 빠른 응답속도를 추구하기 위해 사용한다. 바이트코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에 바이트코드에서 기계어 번역은 훨씬 빠르게 진행될 수 있다. 또한 바이트코드는 이식성이 뛰어나 가상 머신이 설치되어 있으면 빠르게 실행할 수 있다. JIT 코드는 일반적인 인터프러터 언어에 비해 훨씬 좋은 성능을 낸다. 심지어 경우에 따라 정적 컴파일러 언어보다 좋은 성능을 내곤 하는데, 이는 실행 과정에 컴파일을 할 수 있기 때문에 가지는 장점이라고 할 수 있다:
인터프리터(아래 중 적어도 한가지 기능을 가진 프로그램)
1) 소스 코드를 직접실행(실행 중 프로그래밍 언어를 읽어가며 해당 기능에 대응하는 기계어 코드 실행)
2) 소스 코드를 효율적인 다른 중간 코드로 변화하고, 변환한 것을 바로 실행
3) 인터프리터 시스템의 일부인 컴파일러가 만든, 미리 컴파일 된 저장 코드의 실행을 호출
컴파일러 : 고급 명령어들을 직접 기계어로 번역 (실행하기 전에 프로그램 코드를 기계어로 번역)
Process란?
thread란?
메모리 구조
코드(code)영역데이터(data)영역힙(heap)영역스택(stack)영역오버플로우(overflow)callStack란?
javascript -> single thread 언어 : 즉 한번에 한개의 일만 처리할 수 있음
function one(){
two();
}
function two(){
console.log('Hello World!');
}
one();
one을 실행하게 되면 stack에 다음과 같이 쌓이게 된다.


function first() {
console.log('1');
second();
console.log('2');
}
function second() {
console.log('3');
setTimeout(() => {
third();
console.log('4');
}, 3000);
console.log('5');
}
function third() {
console.log('6');
}
first();

위의 함수실행은 다음과 같다.
first()를 부르자마자
console.log('1')실행
second()호출
second()실행후
console.log('3')실행
setTimeout()실행 -> webAPIs로 들어감
비동기 처리로 console.log('5')실행
first()의 console.log('2')실행
setTimeout 3초 지나면
console.log('6')실행
third()호출
third()실행
console.log('4')실행
setTimeout()부분만 보자면





third가 넘어가서 console.log('6')이 실행되고 third()가 끝나면 second()에서 console.log('4')를 실행한다
function second() {
console.log('3');
setTimeout(() => {
third();
console.log('4');
}, 3000);
console.log('5');
}
web APIs
callback queue(event queue, task queue)
event loop
비동기/동기 블로킹/논블로킹을 비교하려다 여기까지왔다.. 정작 비교는 못했지만 자바스크립트 동작원리를 정리할 수 있어서 너무 뿌듯하다.
다른블로드글에 글이 너무 잘써져있어서 이해하면서 새롭게 작성한부분도 동일한 부분도 있는데 혹시 틀린부분이 있으면 언제든지 댓글로 이야기 해주시면 감사하겠습니다. 내일은 비교를 꼭 해보자..!