컴파일러(Compiler : 해석기, 번역기)
-> 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램
-> 주로 high-level language를 lower level language (ex) object 코드, 어셈블리 언어)
로 바꾸는데 사용한다. [소스 간 컴파일러] <-> [디컴파일러]
-> 원시코드를 목적코드로 옮기는 과정
컴퓨터의 언어 기계어를 통하여 프로그래밍을 하는 과정이 생산성이 매우 떨어지고,
만들어도 기기간 호환성(X86 아키텍쳐에 맞는 프로그램은 ARM에서 돌아가지 않음 -> CPU 언어가 다르기 때문에) 이 떨어지고 ,
디버깅은 정말 상상 하기 싫을 정도로 여러가지 면에서 효율적이지 않다.
이를 해결하기 위해 고수준 언어를 작성하고 이를 해석기를 통해 기계어로 번역하기 시작한다.
컴파일러나 프로그래밍의 언어의 특성에 따라 일부 단계가 생략되거나 더 세부적인 단계로 나뉠 수 있다.
소스코드 파일을 읽어 개별 문법요소(연산자, 괄호, 식별자 등) 단위로 자른 후, 이 문법 요소들을 해석하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 맞지 않는 소스코드는 사용자에게 알려준다.
<https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%EA%B5%AC%EB%AC%B8_%ED%8A%B8%EB%A6%AC 참조>
각 노드는 소스코드에서 발생 되는 구조를 나타낸다.
추상 구문이라는 의미는 구문에 나타나는 모든 세세한 정보를 나타내지 않는 다는 의미이다.
-> 추상구문트리는 컴파일러에 널리 사용되는 자료구조이고, 프로그램 코드의 구조를 표현하는 컴파일러의 구문분석 단계의 결과물이다.
최적화(Optimization) : 주어진 조건이나 범위내에서 최대의 효율을 발휘하게 만드는 것.
ex) 동일한 개발도구와 프로그래밍언어를 사용하더라도 더 좋은 선응의 프로그램을 개발할 수 있다. - 알고리즘, 자료구조를 통해서
기능 : 추상구문트리를 분석하여 최적화를 수행한다.
ex) 분기 최적화 [분기 논리를 최소화 하고 물리적으로 분리된 코드블록 결합], 인라인 [함수 호출을 실제 프로그램 코드로 대체], 공통 부속식 제거 [공통표현식 에서 동일한 값이 후속 표현식에서 재사용. 이전값을 사용해 중복 표현식을 제거 할 수 있다] 등이 있다.
자세한 내용은...
https://www.ibm.com/docs/ko/aix/7.1?topic=techniques-compiling-optimization
최적화 된 구문 트리로부터 목적코드를 생성한다.
목표 언어가 기계어일 경우, 하드웨어에 맞는 최적화가 이 단계에서 수행된다.
링커 또는 링크에디터는 컴파일러가 만들어낸 하나이상의 목적파일을 단일 실행 프로그램으로 병합하는 프로그램이다.
링커는 라이브러리, 또는 런타임 라이브러리 라고 하는 모음에서 오브젝트들을 취할 수 있다.
1.여러 목적파일들을 하나로 합치고
2.여기에 Library들을 합쳐
3.단일 실행프로그램으로 만들어준다.
https://ko.wikipedia.org/wiki/%EB%A7%81%EC%BB%A4_(%EC%BB%B4%ED%93%A8%ED%8C%85)
아래 사진은 컴파일러를 정리한 다른 블로그의 내용이다. 자세한 내용은 사진 하단 주소롤 접속해서 보면 좋을거같다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kimwg0120&logNo=140187515610
원시코드를 바로 기계어로 변환한다.
원시코드를 바이트코드로 변환한다.
바이트코드란 high-level language 로 작성된 소스코드를 JVM(바이트 코드 실행하기 위한 가상머신) 같은 가상머신이 이해할 수 있는 중간코드로 컴파일 한것을 말한다.
가상머신이 있는곳이라면 대체로 함께 존재하는데 , 가상머신이 텍스트를 로드하지는 않기 때문에 기계어와 같이 효율적으로 저장하고 불러 올 수 있는 형식이 필요하기 때문이다.
바이트코드는 인터프리터 방식으로 해석된다. 즉 바이트코드를 생성하는 것 까지가 컴파일 이고,
바이트 코드 자체는 인터프리터 언어이다.
상위 개념인 중간언어로 어셈블리어 형식과 바이트코드 형식을 통틀어 언급하는 경우도 있다.
바이트코드 등의 중간코드를 기계어로 변환한다.
JIT 컴파일은 따로 정리를 하겠다.