
첫번째 책 스터디를 진행했다.
나는 책의 1.6 인터프리터 이해하기 부분을 맡게 되었다.
인터프리터와 컴파일러는 빌드 방식의 차이가 있다.
빌드란?
개발자가 만든 소스 코드를 기계어(machine code)로 번역하여 실행 가능한 파일로 만드는 과정
- 컴파일 방식 : 소스 코드 전체를 기계어로 번역한 파일을 만들고, 그 파일을 실행함
- 인터프리터 방식 : 소스 코드를 한 줄씩 번역하면서 실행함
- 하이브리드 방식 : 소스 코드 전체를 중간코드(바이트 코드로 번역한 뒤) VM 에서 한 줄씩 실행함
고급 프로그래밍 언어로 작성된 소스 코드를 한 줄씩 읽어 즉시 실행하는 프로그램
별도의 코드를 변환하는 과정(컴파일) 없이 소스 코드를 바로 해석하여 실행

장점
단점
예시
소스 코드를 기계어로 번역하는 과정(컴파일)을 거친다.
컴파일 시, 소스 코드 전체를 한 번에 분석하고 최적화 한 후 실행 파일(바이너리 파일)을 생성한다.

장점
단점
예시
파싱과 컴파일
파싱은 분석, 컴파일은 번역이라고 생각하면 될 거 같다.
기존의 코드를 파싱(분석/정리)하고 그 내용을 컴파일(번역)하여 실행 파일을 만든다.
파싱 단계에서 문제가 있다면 오류가 발생한다.(구문 오류/정적 오류)
빠른 개발, 간결한 코드 작성이 중요하면 ⇒ 인터프리터 언어
실행 속도와 안정성이 중요하면 ⇒ 컴파일 언어
웹 브라우저에서 HTML, CSS를 제어하거나, 서버의 동작을 자동화하는 등 특정 응용 프로그램의 동작을 제어하고 확장하는 데 사용
대부분 인터프리터 언어처럼 소스 코드를 런타임에 해석하여 실행하는 방식을 사용
다른 언어보다 문법이 간결하고 배우기 쉬운 경우가 많다고 한다.
인터프리터 언어는 실행 방식을, 스크립트 언어는 용도를 나타내는 표현
스크립트 언어는 주로 인터프리터 방식으로 실행되기 때문에, 많은 스크립트 언어가 인터프리터 언어에 속함
ex) JavaScript, Python, PHP 등
웹에서 고성능 계산 작업을 위해 만들어진 자바스크립트의 부분 집합(subset)
브라우저 개발사(특히 모질라)가 자바스크립트의 성능 한계를 극복하고자 개발한 것으로
C/C++ 코드를 컴파일하여 웹으로 가져오는 데 특히 유용하다.
런타임 최적화가 잘 되어 있어 웹 브라우저에서 네이티브 코드에 가까운 성능을 낼 수 있으며,
웹 어셈블리(WebAssembly) 등장 전까지 웹의 성능 향상을 이끌었던 중요한 기술이다.
asm.js의 성능적 한계를 극복하기 위해 등장한 웹 어셈블리(WASM)는, asm.js보다 더 빠르고 효율적인 바이너리 포맷으로,
현재 웹에서 고성능 애플리케이션을 구현하는 데 있어 asm.js를 대체하고 있다
특징
웹 브라우저에서 C, C++, Rust 등 다양한 언어로 작성된 코드를 고성능으로 실행할 수 있도록 컴파일하는 이진 명령어 형식의 개방 표준
사용
인터프리터 언어의 실행 속도를 개선하기 위한 기술 중 대표적으로 Just-In-Time(JIT) 컴파일러가 있다.
JIT 컴파일러는 프로그램 실행 중에 자주 사용되는 코드를 기계어로 컴파일하여 성능을 개선한다.
ex) Python의 PyPy, JavaScript의 V8 엔진 등
위에서 설명한 ASM.js와 Wasm은 JIT가 처리할 수 있는 입력 코드 형태라고 볼 수 있다.
JVM(Java Virtual Machine)
자바를 실행하기 위한 가상 컴퓨터로, JIT 방식을 사용한다.
Java 소스 코드를 컴파일 한 바이트 코드를 다시 기계어로 컴파일(번역)해준다.

→ 여기까지가 빌드 단계. 이후 런타임 단계
즉, 런타임 시 코드를 변환하고 실행하는 과정에서 JIT가 적용된다.
책의 저자인 카일 심슨은 JavaScript를 컴파일 언어라고 표현한다.
하지만 MDN에서는 JavaScript를 인터프리터 혹은 JIT 컴파일 프로그래밍 언어라고 표현한다.
컴파일을 실행하면 컴파일 언어 아닌가?
컴파일이 미리 처리되는 것이 아니라 런타임에 처리되기 때문에 인터프리터 언어로 분류됨 (MDN)