1. Compile
: 인간이 작성한 소스 코드를 컴퓨터가 이해할 수 있도록 머신 코드로 바꿔주는 과정
1. Compiler 언어
: 컴파일러를 통해 컴파일 타임에 전체 소스 코드를 한 번에 기계어로 변환 후 실행파일을 만든다
- e.g. C, C++, C#, JAVA
- 컴파일 단계와 실행 단계가 각각 분리되어 있으며, 컴파일은 단 한번만 수행
- 실행은 파일을 실행시킴으로써 할 수 있으며, 실행시 Compile과정을 거치지 않기에 속도가 빠름
- 전체 소스코드를 변환 후 에러를 보고
런타임 전, VSCode에서 빨간줄로 표시됨⇒ 이는 컴파일이 아니다. 이는 IDE에서 제공하는 타입 체크이다.
syntex error: 문법에 맞지 않는 코딩을 했을 경우 발생- e.g. 괄호 누락
type error: 타입에 맞지 않는 코딩을 했을 경우 발생- e.g. 문자열에 숫자를 더하기
2. Next.js와 Compile
Rust로 작성된 SWC를 사용하여 Next.js코드를 Javascript코드로 변환하고 minify한다.
- SWC : Rust 기반의 확장성있는 개발자 툴
1. Next.js가 Compile하는 것들
- Styled component :
next.config.js에서 설정 - Jest :
jest.config.js에서 설정 - Remove React Properties
- Remove Console : application code에서
console.*를 제거 - Emotion
2. Compile하는 타이밍
$ yarn build입력 시, env파일을 load하여 compile 과정을 거친다.compile과정에서 eslint의 Warning, Error등을 잡아냄 → Warning은 무시, Error는 Build 중단
3. V8과 Compile
V8 : 웹 브라우저를 만드는 데 기반을 제공하는 Open Source Javascript Engine
- Chrome브라우저와 안드로이드 브라우저에 탑재
- V8엔진의 Profiler등장
Profiler: Interpreter를 관찰하며 실행되는 코드를 계속 모니터링 → 코드내에 실행되는 코드가 있다면 이를 Compiler에게 넘겨 실시간으로 Compile하도록 함 → 최적화된 Byte코드를 생성
JIT(Just In Time)컴파일러 : 필요할 때마다 Compile하는 Compiler
2. Interpret
: 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램
1. Interpreter 언어
- 컴파일 하지 않고 소스 코드를 한 줄씩 읽어들여 실행
- 컴파일 하는 시간은 소요되지 않으나, 실행 파일을 별도로 생성하지 않기 때문에 실행시마다 Interpret 과정이 반복 수행되어 실행 속도가 느림
- Interpreter 언어 : Intermediate Code로 변환하고 이를 각 행마다 실행
- 각 행마다 확인해 에러가 발생되면 즉시 중단 후 에러 보고
- e.g. Python, Javascript, Ruby
2. Javscript와 Interpreter언어
Javascript는 기본적으로 Interpreter언어
Javascript는 기본적으로 Interpreter언어이다.
Javascript 엔진 내 Interpreter에게 전달되기 전에 일련의 과정이 필요하다.
- Tokenizer : 의미있는 단위로 나눔
- Parser : Tokenizer에 의해 생성된 토큰들의 배열을 바탕으로 Javascript문법에 맞는 방식으로 AST(Abstract Syntext Tree)로 변화
- Interpreter : AST는 Interpreter를 거쳐 기계가 알아볼 수 있는 Byte코드로 변환
Javascript는 Compiler 언어일까, Interpreter 언어일까
Javascript는 기본적으로 Interpreter 언어로서의 성질을 가지지만, 성능상의 최적화를 위해 Compiler언어의 특성도 같이 가진다. 하지만, Javascript는 Runtime에 Compile되며 실행 파일이 생성되지 않고 Interpreter의 도움 없이 실행할 수 없기에 Compiler 언어라 할 수 없다.