컴파일러

정지원·2022년 1월 5일
0

컴파일러(Compiler : 해석기, 번역기)
-> 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램

-> 주로 high-level language를 lower level language (ex) object 코드, 어셈블리 언어)
로 바꾸는데 사용한다. [소스 간 컴파일러] <-> [디컴파일러]

-> 원시코드를 목적코드로 옮기는 과정

컴파일러 등장 이유

컴퓨터의 언어 기계어를 통하여 프로그래밍을 하는 과정이 생산성이 매우 떨어지고,
만들어도 기기간 호환성(X86 아키텍쳐에 맞는 프로그램은 ARM에서 돌아가지 않음 -> CPU 언어가 다르기 때문에) 이 떨어지고 ,
디버깅은 정말 상상 하기 싫을 정도로 여러가지 면에서 효율적이지 않다.

이를 해결하기 위해 고수준 언어를 작성하고 이를 해석기를 통해 기계어로 번역하기 시작한다.

컴파일러 실행 단계

컴파일러나 프로그래밍의 언어의 특성에 따라 일부 단계가 생략되거나 더 세부적인 단계로 나뉠 수 있다.

구문 분석

소스코드 파일을 읽어 개별 문법요소(연산자, 괄호, 식별자 등) 단위로 자른 후, 이 문법 요소들을 해석하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 맞지 않는 소스코드는 사용자에게 알려준다.

추상 구문 트리 (Abstract syntax tree)

<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(바이트 코드 실행하기 위한 가상머신) 같은 가상머신이 이해할 수 있는 중간코드로 컴파일 한것을 말한다.

가상머신이 있는곳이라면 대체로 함께 존재하는데 , 가상머신이 텍스트를 로드하지는 않기 때문에 기계어와 같이 효율적으로 저장하고 불러 올 수 있는 형식이 필요하기 때문이다.

바이트코드는 인터프리터 방식으로 해석된다. 즉 바이트코드를 생성하는 것 까지가 컴파일 이고,
바이트 코드 자체는 인터프리터 언어이다.

상위 개념인 중간언어로 어셈블리어 형식과 바이트코드 형식을 통틀어 언급하는 경우도 있다.

AOT 컴파일

바이트코드 등의 중간코드를 기계어로 변환한다.

JIT 컴파일

JIT 컴파일은 따로 정리를 하겠다.

profile
지속적인 발전, 태도

0개의 댓글