일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- TypeScript
- react
- prettier
- 타입 단언
- Headless 컴포넌트
- useLayoutEffect
- Dockerfile
- Sparkplug
- CS
- Render Queue
- prettier-plugin-tailwindcss
- AJIT
- React.memo
- useEffect
- JavaScript
- task queue
- useMemo
- Custom Hook
- docker
- linux 배포판
- Microtask Queue
- 암묵적 타입 변환
- 프로세스
- useCallback
- type assertion
- Event Loop
- Compound Component
- 주니어개발자
- 좋은 PR
- 명시적 타입 변환
- Today
- Total
구리
[용어] 컴파일과 인터프리터의 차이 본문
개발을 하다보면 컴파일, 인터프리터란 단어를 많이 쓰는데 무슨 뜻인지 정확한 개념을 알고 써야 한다고 생각되어 정리한 글입니다.
사전 지식
본문
코드 실행의 기본 원리
- 프로그래밍 언어로 코드를 작성
- 인터프리팅, 컴파일 등의 과정을 통해 0,1로 이뤄진 기계어로 변환
- 0,1로 이뤄진 기계어 코드가 Memory 라는 곳에 저장됨
- CPU는 메모리에 있는 0,1로 이뤄진 코드를 읽어 on/off 전기 신호로 실행시킴
- 이때 on/off 전기 신호는 이진수 계산으로 각종 연산을 수행하며, 사실 메모리에 저장된 데이터도 전기신호임
언어의 종류
프로그래밍 코드, 기계어는 어떻게 다를까요?
1. 고급 언어
- JavaScript나 Java처럼 사람이 이해하고 작성하기 쉬운 코드
- 인터프리팅, 컴파일 등을 통해 최종적으로 기계어로 변환되어 CPU에서 실행됨
const num = 10;
const add = num + 20;
console.log(add);
2. 바이트코드(Bytecode)
- 사람이 작성한 고급언어(JavaScript 등)를 가상머신이 이해할 수 있도록 변환한 코드
- 가상머신은 바이트코드를 다양한 종류의 CPU에 맞게 기계어로 컴파일함
Add r0, [6] LdaSmi [1]
3. 기계어(Machine Code)
- CPU가 바로 읽어서 실행할 수 있는 비트 단위의 이진 코드(0,1)
- CPU 종류에 따라 코드를 해석하고 수행하는 방식이 다르며, 어셈블리어와 1대 1로 대응됨
10110000 01100001
참고로 어셈블리어
는 기계어로 구성된 명령어를 사람이 알아보기 쉬운 니모닉 기호(mnemonics)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것으로 기계어보다 한 단계 위의 저급언어입니다.
mov al
코드 해석/변환 방식
고급언어로 작성된 코드는 컴파일러, 인터프리터를 통해 CPU가 실행할 수 있도록 변환됩니다.
이때 컴파일러, 인터프리터의 역할은 다음과 같습니다.
컴파일러(Compiler)
파일 전체를 읽은 뒤, 코드의 의미를 해석하고 파일 전체를 기계어로 변환합니다. (이 과정을 컴파일
이라고 합니다)
인터프리터(Interpreter)
코드를 한줄한줄 읽어내려가며 한줄씩 중간 단계의 Bytecode로 변환됩니다. (이 과정을 인터프리팅
이라고 합니다)
그리고 자바스크립트는 기본적으로 인터프리터 언어입니다.
컴파일러 언어와 인터프리터 언어의 차이점을 정리해보면 다음과 같습니다.
컴파일러 언어 | 인터프리터 언어 | |
코드 변환 방식 | 코드가 실행되기 전 컴파일 타임에 소스코드 전체를 한번에 기계어로 변환 후 실행 | 코드가 실행되는 런타임에 문 단위로 한 줄씩 Bytecode로 변환 후 실행 |
실행 파일 생성 | O | X |
코드 실행 과정 | 컴파일 단계와 실행 단계가 분리 명시적인 컴파일 단계를 거친 후, 명시적으로 실행 파일을 실행 |
인터프리터 단계와 실행단계가 분리되지 않음 인터프리터는 한 줄씩 Bytecode로 변환 후 즉시 실행 |
반복 여부 | 실행 전 컴파일은 단 한번만 수행 | 코드가 실행될 때마다 인터프리트 과정이 반복 수행 |
실행 속도 | 컴파일과 실행 단계가 분리돼있어 코드 실행 속도가 빠름 | 인터프리트 단계와 실행 단계가 분리되지 않고 반복 수행되므로 실행 속도가 느림 |
참고 자료
https://developer.mozilla.org/ko/docs/Glossary/Compile
https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0
https://ko.wikipedia.org/wiki/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4
https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
'기타' 카테고리의 다른 글
[용어] 운영체제, 프로세스, 그리고 커널 (1) | 2023.08.13 |
---|---|
[용어] 추상화 그리고 가상화 (1) | 2023.08.12 |
[용어] 런타임과 런타임 환경이란 (0) | 2023.08.08 |
[Git] fork한 repository 복사해서 잔디 심기 (1) | 2023.03.14 |
[Window] 윈도우 10 한영키를 Capslock으로 변경하기 (2) | 2022.07.15 |