컴파일러 설계-개요
컴퓨터는 소프트웨어와 하드웨어의 균형 잡힌 조합입니다. 하드웨어는 기계 장치의 일부일 뿐이며 그 기능은 호환되는 소프트웨어에 의해 제어됩니다. 하드웨어는 소프트웨어 프로그래밍에서 이진 언어에 대응하는 전자 요금의 형태로 명령을 이해합니다. 이진 언어에는 0과 1이라는 두 개의 알파벳 만 있습니다. 지시하려면 하드웨어 코드를 이진 형식으로 작성해야합니다. 이는 단순히 일련의 1과 0입니다. 컴퓨터 프로그래머가 그러한 코드를 작성하는 것은 어렵고 번거로운 작업이 될 것입니다. 이것이 우리가 그러한 코드를 작성하는 컴파일러가있는 이유입니다.
언어 처리 시스템
우리는 모든 컴퓨터 시스템이 하드웨어와 소프트웨어로 구성된다는 것을 배웠습니다. 하드웨어는 인간이 이해할 수없는 언어를 이해합니다. 그래서 우리는 이해하고 기억하기 쉬운 고급 언어로 프로그램을 작성합니다. 그런 다음 이러한 프로그램은 일련의 도구 및 OS 구성 요소에 공급되어 기계에서 사용할 수있는 원하는 코드를 얻습니다. 이것은 언어 처리 시스템으로 알려져 있습니다.
고급 언어는 다양한 단계에서 이진 언어로 변환됩니다. ㅏcompiler고급 언어를 어셈블리 언어로 변환하는 프로그램입니다. 마찬가지로assembler 어셈블리 언어를 기계 수준 언어로 변환하는 프로그램입니다.
먼저 C 컴파일러를 사용하는 프로그램이 호스트 컴퓨터에서 실행되는 방식을 이해하겠습니다.
사용자가 C 언어 (고급 언어)로 프로그램을 작성합니다.
C 컴파일러는 프로그램을 컴파일하고이를 어셈블리 프로그램 (저수준 언어)으로 변환합니다.
그런 다음 어셈블러는 어셈블리 프로그램을 기계어 코드 (객체)로 변환합니다.
링커 도구는 실행을 위해 프로그램의 모든 부분을 함께 연결하는 데 사용됩니다 (실행 가능한 기계어 코드).
로더는 이들 모두를 메모리에로드 한 다음 프로그램이 실행됩니다.
컴파일러의 개념으로 바로 들어가기 전에 컴파일러와 밀접하게 작동하는 몇 가지 다른 도구를 이해해야합니다.
전 처리기
일반적으로 컴파일러의 일부로 간주되는 전처리 기는 컴파일러에 대한 입력을 생성하는 도구입니다. 매크로 처리, 증강, 파일 포함, 언어 확장 등을 다룹니다.
통역사
컴파일러와 같은 인터프리터는 높은 수준의 언어를 낮은 수준의 기계 언어로 번역합니다. 차이점은 소스 코드 또는 입력을 읽는 방식에 있습니다. 컴파일러는 한 번에 전체 소스 코드를 읽고, 토큰을 만들고, 의미 체계를 확인하고, 중간 코드를 생성하고, 전체 프로그램을 실행하고, 많은 패스를 포함 할 수 있습니다. 반대로 인터프리터는 입력에서 명령문을 읽고 중간 코드로 변환하고 실행 한 다음 다음 명령문을 순서대로 가져옵니다. 오류가 발생하면 인터프리터는 실행을 중지하고이를보고합니다. 컴파일러는 여러 오류가 발생하더라도 전체 프로그램을 읽습니다.
어셈블러
어셈블러는 어셈블리 언어 프로그램을 기계어 코드로 변환합니다. 어셈블러의 출력은 객체 파일이라고하며, 여기에는 기계 명령어와 이러한 명령어를 메모리에 배치하는 데 필요한 데이터의 조합이 포함됩니다.
링커
링커는 실행 파일을 만들기 위해 다양한 개체 파일을 함께 연결하고 병합하는 컴퓨터 프로그램입니다. 이러한 모든 파일은 별도의 어셈블러에 의해 컴파일되었을 수 있습니다. 링커의 주요 작업은 프로그램에서 참조 된 모듈 / 루틴을 검색하고 찾고 이러한 코드가로드 될 메모리 위치를 결정하여 프로그램 명령어가 절대 참조를 갖도록하는 것입니다.
짐을 싣는 사람
로더는 운영 체제의 일부이며 실행 파일을 메모리에로드하고 실행하는 역할을합니다. 프로그램의 크기 (명령 및 데이터)를 계산하고이를위한 메모리 공간을 생성합니다. 다양한 레지스터를 초기화하여 실행을 시작합니다.
크로스 컴파일러
플랫폼 (A)에서 실행되고 플랫폼 (B)에 대한 실행 코드를 생성 할 수있는 컴파일러를 크로스 컴파일러라고합니다.
소스-소스 컴파일러
한 프로그래밍 언어의 소스 코드를 가져 와서 다른 프로그래밍 언어의 소스 코드로 변환하는 컴파일러를 소스 간 컴파일러라고합니다.