일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Babel
- 기초
- 자바스크립트
- SWC
- vanilla-extract
- 동기
- Critical Rendering Path
- 리액트네이티브
- 아키텍처
- Cache
- React
- 최적화
- 기본
- link
- 캐쉬
- async
- mockoon
- front-end mocking
- 목킹
- 쓰레드
- Concurrent Mode
- Basic
- styled-component
- next.js
- 비동기
- JavaScript
- mock service worker
- MSW
- CSS-in-JS
- react-native
- next hydration
- 개발자
- thread
- react server component
- 컴포넌트
- sprinkles
- amplify
- 리액트쿼리
- react-query
- 리액트
- Today
- Total
Don’t worry about failures
컴파일러와 인터프리터 본문
이해
컴파일러와 인터프리터는 사람이 이해할 수 있는 고급언어로 작성된 코드를 기계가 이해할 수 있는 기계어로 번역한 후 프로그램을 실행할 수 있게 해주는 것이다.
컴파일러
한번에 모든 코드를 고급언어에서 기계언어로 번역을한다. 이에 따라 초기에 오래걸리지만, 그 이후 runtime 때 실행 시간이 빠른 편이다. 미리 번역을 해놓았기 때문에 바로바로 컴퓨터가 이해할 수 있어 빠른 것이다.
인터프리터
한줄씩 번역을 진행을 하기 때문에 번역시간이 빠르나 실행하는 속도는 컴파일러에 비해 느리다.
컴파일러 문제점
컴파일러는 플랫폼(하드웨어)에 종속적이다.
전세계에 수 많은 종류의 하드웨어( cpu )가 존재한다. 이에 따라 a사 의 cpu에서 돌아가는 프로그램을 만들고, 타 사의 cpu에 돌려보면, 작동이 잘안된다. 이렇듯 컴파일러는 어떠한 cpu에 종속적이기 때문에 호환성 문제가 존재한다
하지만, 인터프린터는 해당 프로그램을 번역하는 하드웨어의 환경에 맞게 변환을 하기 때문에 호환에 있어 문제가 되지않는다.
자바의 경우, 컴파일러와 인터프리터를 같이 사용한다고 한다.
.java - > java compiler -> .class -> java interpreter -> machine language
위와 같이 java파일을 컴파일러가 바이트 코드인 .class파일로 변환 한 후 .class 파일 내의 바이트 코드를 특정 환경의 기계에서 실행될 수 있도록 변환을 해준다. 이를 해주는 것은 JVM이다.
개념은 대부분 검색해보면, 이정도로 정리가 끝난다. 하지만, 나는 javascript언어를 좋아하고 이 언어가 어떤 언어 변환기를 사용하는 지에 대해 더 알아보고자 한다.
자바스크립트는 인터프린터 && JIT
컴파일이 필요 없이 스크립트를 실행할 수 있는 것을 보면 알 수 있다. 하지만, 자바스크립트 또한 컴파일 과정을 거친다. 다만 자바스크립트 엔진 내부에서 실행중 컴파일이 필요한 경우 내부에서 컴파일을 한다.
즉, 일반적으로는 인터프린터 언어로 간주되기는 하지만, JIT 컴파일러와 혼합되어 실행하는 방식을 채용하고있다.
위의 사진은 chrome v8 엔진 구조이다. 위의 구조와 같이 프로파일러가 지켜보면서 최적화 할 수 있는 코드를 컴파일러에게 전달해준다. 주로 반복해서 실행되는 코드 블록을 컴파일(최적화) 한다. 그리고 원래 있던 코드와 최적화된 코드를 바꿔준다. 코드를 우선 인터프리터 방식으로 실행하고 필요할 때 컴파일 하는 방법을 JIT 컴파일러 라고 부른다.
또한, 자바스크립트에서 익숙한 컴파일러를 보면, babel과 typescript가 있다. ( 구체적으로는 transpiler )
babel - es6 등 최신 자바스크립트 스팩을 모든 브라우저에서 사용 가능하도록 컴파일
typescript - ts -> js로 컴파일
JIT 컴파일
- 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법.
- 인터프리터와 컴파일러를 혼합한 방식
- 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지.
AST( Abstract Syntax Tree ) 추상 구문 트리
- 이 트리의 각 노드는 소스 코드에서 발생되는 구조를 나타낸다. 소스에 대해 추상적인 트리를 생성하고 이를 기반으로 인터프리터로 읽어 바이트코드를 생성해 낸다.
참고 자료:
'cs' 카테고리의 다른 글
멀티태스킹 멀티프로세싱.. (0) | 2024.03.13 |
---|---|
쓰레드에 대해 (0) | 2024.03.13 |
CORS에 대해 (0) | 2021.06.20 |
Process & Thread (0) | 2021.06.13 |
cs 기초 ( Intro ) (0) | 2021.06.05 |