컴파일러는 어떻게 작동합니까? [닫은]


17

참고 : 이전에 요청되지 않았으며 검색 된 경우 검색에서 찾을 수 없다는 것에 놀랐습니다.

나는 수많은 웹 사이트에 있었고, 많은 기사를 읽었으며, 많은 설명을 들었습니다. 그들 대부분은 좋았지 만 모두 광범위하거나 너무 복잡하거나 평범했습니다. 그래서 내 질문은 컴파일러가 어떻게 작동합니까?

이것이 어렵고 광범위한 질문 인 경우 알려주십시오. 그러나 그렇지 않은 경우 질문에 대답하십시오.


4
최소한 "어떻게 작동합니까"부분이 너무 넓습니다. 그 주제에 관한 모든 책이 있습니다.
Oded

1
en.wikipedia.org/wiki/Compiler 는 쉽게 찾을 수없는 위키피디아 링크 일 것입니다. 이 질문은 "컴파일러가 한 언어에서 다른 언어로 코드를 변환합니다"라는 현명한 알렉 응답을주기를 원할만큼 광범위합니다. 그것은 실제로 무엇을 포함합니까?
JB King

1
예, 나는 그것이 꽤 잘 대답했다고 생각합니다.
제레미

1
컴파일러의 작동 방식에 대한 설명은 너무 광범위하거나 너무 복잡합니다. 복잡한 주제이며, 컴파일러 클래스는 내가 본 것 중 가장 어려운 컴퓨터 관련 과정이었습니다.
David Thornley

1
@David 물론 컴파일러는 복잡하므로 여기서 어떻게 작동하는지에 대한 모든 세부 사항을 설명 할 수는 없습니다. 그러나 컴파일러 과정을 시작하기 전에 컴파일러가 무엇인지 또는 작동 방식에 대한 기본적인 수준의 이해가 필요합니다.
Dima

답변:


24

컴파일러는 다른 프로그램의 소스 코드를 프로그래밍 언어에서 실행 가능한 코드로 변환하는 프로그램입니다.

소스 코드는 일반적으로 고급 프로그래밍 언어 (예 : Pascal, C, C ++, Java, Perl, C # 등)로되어 있습니다. 실행 코드는 CPU에 의해 직접 실행될 수있는 일련의 기계 명령 일 수 있거나, 가상 기계 (예를 들어, Java 바이트 코드)에 의해 해석되는 중간 표현 일 수있다.

요컨대, 컴파일러는 프로그램을 사람이 읽을 수있는 형식에서 기계가 읽을 수있는 형식으로 변환합니다.

컴파일러의 작동 방식은 실제로 복잡합니다. 주제에 관한 서적과 대학 과정이 있습니다. 프로세스의 주요 단계를 간략하게 설명하려고 시도하지만 이것은 매우 개략적 인 개요입니다.

  1. 렉싱-프로그램의 텍스트를 "토큰"으로 나눕니다. 토큰은 식별자 (키워드, 변수 이름, 함수 이름 등) 또는 연산자 (=, *, & 등)와 같은 프로그래밍 언어의 "단어"입니다.
  2. 구문 분석-토큰 순서를 구문 분석 트리로 변환합니다. 구문 분석 트리는 유형 선언, 변수 선언, 함수 정의, 루프, 조건부, 표현식 등 다양한 언어 구문을 나타내는 데이터 구조입니다.
  3. 최적화-상수 표현식을 평가하고, 사용하지 않는 변수 나 도달 할 수없는 코드를 최적화하고, 가능하면 루프를 풀 수 있습니다.
  4. 구문 분석 트리를 기계 명령어 (또는 JVM 바이트 코드)로 변환하십시오.

다시, 나는 이것이 매우 간단한 설명이라고 강조한다. 현대의 컴파일러는 매우 영리하고 결과적으로 매우 복잡합니다.


2
실제로 언어를 다른 언어로 변형합니다. 초기 C ++ 컴파일러는 C로 컴파일했습니다. Vala 컴파일러도 마찬가지입니다. Java 컴파일러는 JVM의 JIT 컴파일러 없이는 실행할 수없는 바이트 코드로 컴파일됩니다.
deadalnix

1
@deadalnix IMHO, 요점은 실행 불가능 코드에서 실행 코드로 이동한다는 것입니다. C-front는 컴파일러가 아니라 C 컴파일러의 프론트 엔드라고 주장합니다. 또는 컴파일 프로세스의 단계입니다. 가상 머신은 물론 "실행 가능"과 "실행 불가능"사이의 경계를 흐리게합니다. 여기서는 단순히 실행 코드를 바이트 코드와 같은 가상 머신에 들어가는 것으로 간주하고 JIT와 같이 VM 내부에서 발생하는 모든 것을 추상화합니다.
Dima

1
@Dima, 그것은 비 실행 코드에서 실행 코드가 될 필요는 없습니다. 예를 들어, Windows 시스템에서 직접 JVM 바이트 코드를 실행할 수 없습니다.

1
@ Thorbjørn Ravn Andersen : 바이트 코드는 JVM에서 실행할 수 있습니다. "가상 머신"의 요점이 프로그래머에게는 실제 머신처럼 보이지 않습니까?
Dima

2
나는 전통적으로 컴파일러가 Dima가 말한 것처럼 프로그램을 사람이 읽을 수있는 형식에서 기계가 읽을 수있는 형식으로 변환했다고 주장합니다. C ++에서 C로 변환하는 Cfront 또는 Java에서 바이트 코드로 변환하는 javac 변환과 같은 변형은 기본적이고 전통적인 개념에 익숙하지 않은 사람에게 설명 할 때까지 남겨 두어야 할 고급 주제입니다.
Carson63000

5

컴파일러는 프로그래밍 언어 (소스 언어)로 작성된 소스 코드를 다른 컴퓨터 언어 (종종 객체 코드라고하는 이진 형식을 갖는 대상 언어)로 변환하는 컴퓨터 프로그램 (또는 명령어 세트)입니다. 소스 코드를 변환하려는 가장 일반적인 이유는 실행 가능한 프로그램을 만드는 것입니다.

컴파일러는 기본 하드웨어를 사용하여 고급 언어로 소스 프로그램을 브릿지합니다. 컴파일러에는 다음이 필요합니다.

  1. 프로그램 구문의 정확성 결정
  2. 정확하고 효율적인 객체 코드 생성
  3. 런타임 조직
  4. 어셈블러 및 / 또는 링커 규칙에 따라 출력 형식화
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.