고급->저급으로 갈수록 기계가 이해하기 쉬워짐.
컴퓨터에서 이해할 수 있는, 즉 실행 가능한 파일로 만드는 과정.
우리가 만든 소스코드를 '빌드'하면 실행 파일을 얻는다.(.exe)
clang이라는 컴파일러를 호출해서 C 소스 코드를 오브젝트 코드(물리적인 기계가 바로 읽어낼 수 있는 코드)로 컴파일.컴파일의 전체 과정은 네 단계로 나누어 볼 수 있다.
파싱 (Parsing)
1-1) 토큰화: 코드를 작은 단위인 토큰(Token)으로 분활. 토큰은 예약어, 식별자,연산자,숫자,문자열 등과 같은 코드의 의미 있는 부분을 말함.(소스코드를 의미있는 단위로 나누는 과정)
1-2) 구문 분석: 토큰들을 조합하여 문법 규칙에 따라 코드의 구조를 분석. 이를 통해 코드의 구성 요소와 관계를 이해하고, 문법적으로 유효하진 검사
추상 구문 트리 (Abstract Syntax Tree, AST) 생성:파싱된 코드는 추상 구문 트리라고 불리는 트리 형태의 자료구조로 변환. 추상 구문 트리는 코드의 구조를 계층적으로 표현하여 코드 실행에 필요한 정보를 담고있음. 각 노드(소스 코드의 항목(item)에 해당)는 토큰이나 표현식, 문장 등을 나타내며, 노드들 간의 관계를 통해 코드의 의미를 전달
바이트 코드 생성: 추상 구문 트리를 기반으로 인터프리터는 중간 표현 형태인 바이트 코드(Bytecode)를 생성.바이트 코드(가상 머신(자바스크립트 엔진)이 읽는 코드)는 자바스크립트 엔진이 이해하고 실행할 수 있는 낮은 수준의 명령어로 구성된 형태
실행: 생성된 바이트 코드(중간언어)는 인터프리터에 의해 한 줄씩 실행됩니다. 각 바이트 코드 명령은 스택 기반 가상 머신(자바스크립트 엔진)(Virtual Machine)에서 실행되며, 필요한 연산이 수행되거나 변수의 값이 변경될 수 있음.
*중간언어 : 고급언어와 기계어 사이의 언어를 뜻하는데 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로글매을 위한 이진 표현법.
모던 자바스크립트 컴파일러는 거의 런타임 내에서 빠르게 컴파일(JITC, Just-In-Time Compilation)을 수행한다.
결론적으로, V8은 JIT 컴파일 방식을 통해 바이트코드, 최적화 기계어를 통해 규모가 큰 js 파일을 고성능으로 돌릴 수 있게 되었다.(반복적으로 실행되는 코드에 대해 큰 성능 향상)
+) pypy : 인터프리터가 python으로 작성됨. JIT 컴파일 도입하여 CPython 보다 빠르다.
c,c++ 과 같이 명확하게 구분할 수 있는 언어도 있으나, 현대의 많은 프로그래밍 언어 중에서는 컴파일 언어와 인터프리터 언어간의 경계가 모호한 경우가 많다. 가령 대표적인 인터프리터 언어로 알려진 파이썬도 컴파일을 하지 않는 것은 아니며, Java의 경우 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행한다.
즉, 하나의 프로그래밍 언어가 반드시 둘 중 하나의 방식만으로 작동한다고 생각하는 것은 오개념이다.
참고
https://gguguk.github.io/posts/how_to_work_python/
https://velog.io/@seungchan__y/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-Compiler-Interpreter-%EC%96%B8%EC%96%B4%EB%8B%A4
https://gyujincho.github.io/2018-06-19/AST-for-JS-devlopers
<도서> 혼자 공부하는 컴퓨터 구조+운영체제