컴파일러는 어떻게 스스로 컴파일 할 수 있습니까?


168

웹 사이트 http://coffeescript.org/ 에서 CoffeeScript를 연구 중이며 텍스트가 있습니다.

CoffeeScript 컴파일러 자체는 CoffeeScript로 작성되었습니다

컴파일러는 어떻게 스스로 컴파일 할 수 있습니까? 아니면이 문장은 무엇을 의미합니까?


14
자체 컴파일 할 수있는 컴파일러의 또 다른 용어는 self-hosting컴파일러입니다. programmers.stackexchange.com/q/263651/6221
oɔɯǝɹ

37
왜 컴파일러가 스스로 컴파일 할 수 없어야합니까?
user253751 2016 년

48
관련된 컴파일러 사본이 두 개 이상 있습니다. 기존의 것이 새 사본을 컴파일합니다. 새로운 것은 이전 것과 동일하거나 동일하지 않을 수 있습니다.
bdsl

12
Git에 관심이있을 수도 있습니다. 물론 소스 코드는 물론 Git 리포지토리에서 추적됩니다.
Greg d' Eon

7
이것은 "제록스 프린터가 회로도를 어떻게 스스로 인쇄 할 수 있습니까?" 컴파일러는 텍스트를 바이트 코드로 컴파일합니다. 컴파일러가 사용 가능한 바이트 코드로 컴파일 할 수 있으면 해당 언어로 컴파일러 코드를 작성한 다음 컴파일러를 통해 코드를 전달하여 출력을 생성 할 수 있습니다.
RLH

답변:


219

컴파일러의 첫 번째 버전은 특정 프로그래밍 언어에서 기계로 생성 할 수 없습니다. 당신의 혼란은 이해할 수 있습니다. 더 많은 언어 기능을 가진 최신 버전의 컴파일러 (새 언어의 첫 번째 버전에서 소스가 다시 작성된)는 첫 번째 컴파일러에 의해 빌드 될 수 있습니다. 그런 다음 해당 버전은 다음 컴파일러 등을 컴파일 할 수 있습니다. 예를 들면 다음과 같습니다.

  1. 첫 번째 CoffeeScript 컴파일러는 Ruby로 작성되어 CoffeeScript 버전 1을 생성합니다.
  2. CS 컴파일러의 소스 코드는 CoffeeScript 1로 다시 작성되었습니다.
  3. 원래 CS 컴파일러는 CS 1로 작성된 새 코드를 컴파일러의 버전 2로 컴파일합니다.
  4. 새로운 언어 기능을 추가하기 위해 컴파일러 소스 코드가 변경되었습니다.
  5. 두 번째 CS 컴파일러 (CS로 작성된 첫 번째)는 수정 된 새 소스 코드를 컴파일러의 버전 3으로 컴파일합니다.
  6. 각 반복에 대해 4 단계와 5 단계를 반복하십시오.

참고 : CoffeeScript 버전의 번호가 정확히 어떻게 사용되는지 잘 모르겠습니다. 이는 단지 예일뿐입니다.

이 과정을 일반적으로 부트 스트랩 이라고 합니다. 부트 스트랩 컴파일러의 또 다른 예 rustcRust 언어 의 컴파일러입니다 .


5
컴파일러를 부트 스트랩하는 다른 방법은 귀하의 언어에 대한 인터프리터를 작성하는 것입니다.
Aron

다른 언어로 작성된 컴파일러 또는 인터프리터로 부트 스트랩하는 또 다른 대안으로, 구식 경로는 컴파일러 소스를 직접 조립하는 것입니다. 척 무어 (Chuck Moore)는 문제 지향적 언어 프로그래밍 ( web.archive.org/web/20160327044521/www.colorforth.com/POL) 의 끝에서 9 장 "부트 스트랩 프로그램"의 Forth 인터프리터를위한 방법을 설명합니다. .htm ) (손으로 두 번 수행 한 경우) 여기서 코드 입력은 비트의 토글 스위치로 제어되는 메모리 주소에 값을 직접 저장할 수있는 전면 패널을 통해 수행됩니다.
Jeremy W. Sherman

59

신뢰 신뢰에 관한 논문 에서 유닉스의 창시자 중 하나 인 켄 톰슨 (Ken Thompson)은 C 컴파일러가 어떻게 자신을 컴파일하는지에 대한 흥미롭고 읽기 쉬운 개요를 작성합니다. CoffeeScript 또는 다른 언어에도 비슷한 개념을 적용 할 수 있습니다.

자체 코드를 컴파일하는 컴파일러의 아이디어 는 원본 소스 코드를 출력으로 생성 하는 quine : 소스 코드 와 모호 합니다. 다음은 CoffeeScript quine의 입니다. 톰슨은 다음과 같은 C 퀴인 예제를 제공했습니다.

char s[] = {
    '\t',
    '0',
    '\n',
    '}',
    ';',
    '\n',
    '\n',
    '/',
    '*',
    '\n',
    … 213 lines omitted …
    0
};

/*
 * The string s is a representation of the body
 * of this program from '0'
 * to the end.
 */

main()
{
    int i;

    printf("char\ts[] = {\n");
    for(i = 0; s[i]; i++)
        printf("\t%d,\n", s[i]);
    printf("%s", s);
}

다음으로, 이스케이프 시퀀스와 같은 이스케이프 시퀀스가 '\n'ASCII 코드 10을 나타내는 것으로 컴파일러에게 어떻게 배울 지 궁금 할 것입니다 . 답은 C 컴파일러 어딘가에 문자 리터럴을 해석하는 루틴이 있으며, 이와 같은 조건을 포함하여 백 슬래시 시퀀스를 인식합니다.

…
c = next();
if (c != '\\') return c;        /* A normal character */
c = next();
if (c == '\\') return '\\';     /* Two backslashes in the code means one backslash */
if (c == 'r')  return '\r';     /* '\r' is a carriage return */
…

위 코드에 하나의 조건을 추가 할 수 있습니다.

if (c == 'n')  return 10;       /* '\n' is a newline */

'\n'ASCII 10 을 나타내는 것을 알고있는 컴파일러를 만드는 것 . 흥미롭게도, 그 컴파일러 와 그에 의해 컴파일 된 모든 후속 컴파일러는 그 매핑을 "알고"있으므로 다음 세대의 소스 코드에서 마지막 행을 다음과 같이 변경할 수 있습니다.

if (c == 'n')  return '\n';

… 그리고 옳은 일을 할 것입니다! 는 10컴파일러에서 온다, 더 이상 명시 적으로 컴파일러의 소스 코드에 정의 될 필요가있다. 1

이것이 C 코드로 구현 된 C 언어 기능의 한 예입니다. 이제 모든 단일 언어 기능에 대해이 프로세스를 반복하면 "셀프 호스팅"컴파일러 (C로 작성된 C 컴파일러)가 있습니다.


1 이 논문에서 묘사 한 플롯 트위스트는 컴파일러가 이와 같은 사실을 "학습"할 수 있기 때문에 탐지하기 어려운 방식으로 트로이 목마 실행 파일을 생성하는 실수를 범할 수 있으며, 이러한 방해 행위는 지속될 수 있습니다. 오염 된 컴파일러가 생성 한 모든 컴파일러에서


7
이것은 흥미로운 정보이지만 질문에 대한 답은 아닙니다. 여러분의 예제는 이미 부트 스트랩 된 컴파일러를 가지고 있거나 다른 언어로 C 컴파일러를 작성했다고 가정합니다.
Arturo Torres Sánchez 2016 년

9
@ ArturoTorresSánchez 다른 설명은 다른 사람들에게 잘 작동합니다. 나는 다른 답변에서 말한 것을 반복하려고하지 않습니다. 오히려 다른 답변이 내가 생각하는 방식보다 더 높은 수준에서 말하는 것을 발견했습니다. 저는 개인적으로 하나의 단일 기능이 추가되는 방식에 대한 구체적인 그림을 선호하며 독자가 얕은 개요 대신 그로부터 추정 할 수 있도록합니다.
200_suc.

5
좋아, 당신의 관점을 이해합니다. 문제는 "컴파일러를 컴파일 할 컴파일러가 존재하지 않는 경우 어떻게 컴파일러가 스스로 컴파일 할 수 있는가"와 "부트 스트래핑 된 컴파일러에 새로운 기능을 추가하는 방법"이 아니라는 것입니다.
Arturo Torres Sánchez 2016 년

17
질문 자체는 모호하고 개방적입니다. 일부 사람들은 "CoffeeScript 컴파일러가 어떻게 스스로 컴파일 할 수 있습니까?"라는 의미로 해석하는 것 같습니다. 의견에 주어진 플립 팬트 응답은 "코드를 컴파일하는 것처럼 자체 컴파일 할 수없는 이유는 무엇입니까?" 나는 "자기 호스팅 컴파일러가 어떻게 존재할 수 있는가?"를 의미하는 것으로 해석하고, 컴파일러가 자신의 언어 기능 중 하나에 대해 배울 수있는 방법을 설명했습니다. 구현 방법에 대한 저수준 설명을 제공하여 질문에 다른 방식으로 답변합니다.
200_success 2016 년

1
@ ArturoTorresSánchez : "[C 컴파일러는 어떤 언어로 작성 되었습니까?" 오래 전에 나는 이전 K & R 부록 (IBM 360 용 컴파일러)에서 언급 한 원래 C 컴파일러를 유지 관리했습니다. 많은 사람들이 먼저 BCPL이 있고 B가 있고 C가 B의 개선 된 버전이라는 것을 알고 있습니다. B로 작성되었지만 C로 다시 작성된 적이없는 이전 컴파일러의 일부입니다. 변수는 단일 문자 / 숫자 형식이며 포인터 산술은 자동으로 스케일링되는 것으로 가정되지 않았습니다. 최초의 "C"컴파일러는 B로 작성되었습니다.
Eliyahu Skoczylas 2016 년

29

당신은 이미 매우 좋은 대답을 얻었지만, 나는 당신에게 다른 관점을 제공하고 싶습니다. 먼저 두 가지 모두에 동의 할 수있는 두 가지 사실을 설정합시다.

  1. CoffeeScript 컴파일러는 CoffeeScript로 작성된 프로그램을 컴파일 할 수있는 프로그램입니다.
  2. CoffeeScript 컴파일러는 CoffeeScript로 작성된 프로그램입니다.

# 1과 # 2가 모두 사실임을 동의 할 수 있습니다. 이제 두 진술을보십시오. CoffeeScript 컴파일러가 CoffeeScript 컴파일러를 컴파일 할 수있는 것은 완전히 정상적인 것입니까?

컴파일러는 상관하지 않는다 어떤 것이 컴파일합니다. CoffeeScript로 작성된 프로그램이라면 컴파일 할 수 있습니다. 그리고 CoffeeScript 컴파일러 자체는 그러한 프로그램입니다. CoffeeScript 컴파일러는 자신이 컴파일하고있는 CoffeeScript 컴파일러 자체에 신경 쓰지 않습니다. 보이는 것은 일부 CoffeeScript 코드입니다. 기간.

컴파일러는 어떻게 스스로 컴파일 할 수 있습니까? 아니면이 문장은 무엇을 의미합니까?

그렇습니다. 그것이 바로 그 진술이 의미하는 바이며, 이제 그 진술이 어떻게 진실인지 알 수 있기를 바랍니다.


2
나는 커피 스크립트에 대해 많이 알지 못하지만 커피 스크립트로 작성되었지만 컴파일 된 다음 기계 코드라고 말함으로써 포인트 2를 명확히 할 수 있습니다. 어쨌든 닭고기와 계란 문제를 설명해 주시겠습니까? 컴파일러가 아직 작성되지 않은 언어로 작성된 경우 어떻게 컴파일러를 실행하거나 컴파일 할 수 있습니까?
barlop

6
귀하의 진술 2는 불완전하고 부정확하며 오도의 소지가 있습니다. 첫 번째 대답에서 알 수 있듯이 첫 번째는 커피 스크립트로 작성되지 않았습니다. 그것은 그의 질문과 관련이 있습니다. 그리고 "컴파일러는 어떻게 스스로 컴파일 할 수 있습니까? 아니면이 문장은 무엇을 의미합니까?" 당신은 "예"라고 말합니다. (내 마음이 조금 작지만), 나는 그 자체가 아니라 이전 버전의 자체를 컴파일하는 데 사용되는 것을 봅니다. 그러나 자체 컴파일에도 사용됩니까? 나는 그것이 무의미하다고 생각했다.
barlop 2016 년

2
@barlop : 명령문 2를 " 오늘 , CoffeeScript 컴파일러는 CoffeeScript로 작성된 프로그램입니다 "로 변경하십시오 . 그것이 당신이 그것을 더 잘 이해하는 데 도움이됩니까? 컴파일러는 입력 (코드)을 출력 (프로그램)으로 변환하는 프로그램입니다. 따라서 Foo 언어의 컴파일러가있는 경우 Foo 언어로 Foo 컴파일러의 소스 코드를 작성하고 해당 소스를 첫 번째 Foo 컴파일러에 공급하면 두 번째 Foo 컴파일러가 출력됩니다. 이것은 많은 언어에 의해 수행됩니다 (예를 들어, 내가 아는 모든 C 컴파일러는 ... C로 작성되었습니다).
DarkDust 2016 년

3
컴파일러는 스스로 컴파일 할 수 없습니다. 출력 파일은 출력 파일을 생성하는 컴파일러와 동일한 인스턴스가 아닙니다. 그 진술이 어떻게 거짓인지 지금 알 수 있기를 바랍니다.
pabrams 2016 년

3
@pabrams 왜 그렇게 가정하십니까? 출력은이를 생성하는 데 사용 된 컴파일러와 동일 할 수 있습니다. 예를 들어 GCC 6.1로 GCC 6.1을 컴파일하면 GCC 6.1로 컴파일 된 GCC 6.1 버전이 제공됩니다. 그런 다음 GCC 6.1을 컴파일하는 데 사용하면 GCC 6.1로 컴파일 된 GCC 6.1 버전도 얻습니다. 타임 스탬프와 같은 것을 무시하십시오.
user253751

9

컴파일러는 어떻게 스스로 컴파일 할 수 있습니까? 아니면이 문장은 무엇을 의미합니까?

그것은 정확히 의미합니다. 우선, 고려해야 할 사항이 있습니다. 살펴 봐야 할 네 가지 객체가 있습니다.

  • 임의의 CoffeScript 프로그램의 소스 코드
  • 임의의 CoffeScript 프로그램의 (생성 된) 어셈블리
  • CoffeScript 컴파일러의 소스 코드
  • CoffeScript 컴파일러의 (생성 된) 어셈블리

이제 CoffeScript 컴파일러의 생성 된 어셈블리 (실행 파일)를 사용하여 임의의 CoffeScript 프로그램을 컴파일하고 해당 프로그램에 대한 어셈블리를 생성 할 수 있습니다.

이제 CoffeScript 컴파일러 자체는 임의의 CoffeScript 프로그램이므로 CoffeScript 컴파일러로 컴파일 할 수 있습니다.

당신의 혼란은 당신이 당신의 자신의 새로운 언어를 만들 때, 당신은하지 않는 것이 사실에서 비롯된 것으로 보인다 가지고 컴파일러를 아직 당신이 당신의 컴파일러를 컴파일하는 데 사용할 수 있습니다. 이것은 분명히 닭 계란 문제 처럼 보입니다 .

bootstrapping 이라는 프로세스를 소개하십시오 .

  1. 새로운 언어의 일부를 컴파일 할 수있는 기존 언어로 컴파일러를 작성합니다 (CoffeScript의 경우 원래 컴파일러가 Ruby로 작성 됨).
  2. 새 언어 자체에서 새 언어의 하위 집합을 컴파일 할 수있는 컴파일러를 작성합니다. 위 단계에서 컴파일러가 컴파일 할 수있는 언어 기능 만 사용할 수 있습니다.
  3. 1 단계의 컴파일러를 사용하여 2 단계의 컴파일러를 컴파일합니다. 그러면 원래 새 언어의 하위 집합으로 작성되고 새 언어의 하위 집합을 컴파일 할 수있는 어셈블리가 남게됩니다.

이제 새로운 기능을 추가해야합니다. while-loops 만 구현 했지만 for-loops 를 원한다고 가정하십시오. for-loop와 같은 방식으로 -loop를 다시 작성할 수 있으므로 이것은 문제가되지 않습니다 while. 즉, 사용 while중인 어셈블리는 컴파일 만 할 수 있으므로 컴파일러의 소스 코드에는 -loops 만 사용할 수 있습니다. 그러나 컴파일러 내에서 for루프를 실행 하고 컴파일 할 수있는 함수를 작성할 수 있습니다 . 그런 다음 이미 가지고있는 어셈블리를 사용하고 새 컴파일러 버전을 컴파일하십시오. 그리고 이제 for루프를 구문 분석하고 컴파일 할 수있는 컴파일러 어셈블리가 있습니다 ! 이제 컴파일러의 소스 파일 whilefor돌아가서 원하지 않는 -loops를 -loops에 다시 쓸 수 있습니다 .

원하는 모든 언어 기능을 컴파일러로 컴파일 할 수있을 때까지 헹구고 반복하십시오.

while그리고 for분명히 단지 예시했지만, 이것은 당신이 원하는 새로운 언어 기능이 작동합니다. 그런 다음 CoffeScript가 현재 상황에 있습니다. 컴파일러가 자체 컴파일됩니다.

거기에 많은 문헌이 있습니다. 신뢰에 대한 고찰 신뢰 는 그 주제에 관심이있는 모든 사람들이 최소한 한 번은 읽어야하는 고전입니다.


5
( "CoffeeScript 컴파일러 자체는 CoffeeScript로 작성되었습니다"라는 문장은 사실이지만 "컴파일러는 스스로 컴파일 할 수 있습니다"는 거짓입니다.
pabrams

4
아니요, 완전히 사실입니다. 컴파일러 스스로 컴파일 할 수 있습니다. 이해가되지 않습니다. 언어의 버전 X를 컴파일 할 수있는 실행 파일이 있다고 가정하십시오. 버전 X + 1을 컴파일 할 수있는 컴파일러를 작성하고 보유한 컴파일러 (버전 X)로 컴파일하십시오. 언어의 X + 1 버전을 컴파일 할 수있는 실행 파일이 생깁니다. 이제 새로운 실행 파일을 사용하여 컴파일러를 다시 컴파일 할 수 있습니다. 그러나 끝까지? 원하는 것을 수행하는 실행 파일이 이미 있습니다 . 컴파일러는 컴파일 할 수 있는 유효한 프로그램을, 그래서 완전히 자신을 컴파일 할 수 있습니다!
Polygnome

1
실제로 iirc 현대 freepascal은 컴파일러를 총 5 번 빌드하는 것은 거의 들지 않았습니다.
plugwash

1
@pabrams "만지지 마십시오"및 "뜨거운 물건. 만지지 마십시오."라고 쓰면 문구의 의도 된 메시지와 차이가 없습니다. 메시지 (프로그래머)의 의도 된 대상이 작성 방법에 관계없이 문구의 의도 된 메시지 (컴파일러 빌드가 소스를 컴파일 할 수 있음)를 이해하는 한,이 논의는 의미가 없습니다. 지금처럼, 당신의 주장은 유효하지 않습니다. 메시지의 대상이 프로그래머가 아닌 것을 보여줄 수 없다면, 당신은 맞습니다.
DarkDestry 2016 년

2
@pabrams 'Good english'는 의도 한 청중과 작가 또는 발표자가 의도 한 방식으로 아이디어를 명확하게 전달하는 영어입니다. 의도 한 청중이 프로그래머이고, 프로그래머가 그것을 이해한다면 좋은 영어입니다. "빛은 입자와 파동으로 존재한다"는 것은 "광은 광자와 전자파로 존재한다"와 기본적으로 같다. 물리학 자에게는 문자 그대로 같은 의미입니다. 그것은 우리가 항상 더 길고 선명한 문장을 사용해야한다는 것을 의미합니까? 아니! 의도 된 대상에게 의미가 이미 명확 할 때 읽기가 복잡하기 때문입니다.
DarkDestry 2016 년

7

작지만 중요한 설명

여기서 컴파일러 라는 용어 는 두 개의 파일이 관련되어 있다는 사실을 강조 합니다. 하나는 CoffeScript로 작성된 입력 파일로 사용하고 다른 실행 파일, 링크 가능한 객체 파일 또는 공유 라이브러리를 출력 파일로 생성하는 실행 파일입니다. 다른 하나는 CoffeeScript 컴파일 절차를 설명하는 CoffeeScript 소스 파일입니다.

첫 번째 파일을 두 번째 파일에 적용하여 첫 번째 파일을 첫 번째 파일과 동일한 컴파일 동작을 수행 할 수있는 세 번째 파일을 생성합니다 (두 번째 파일이 첫 번째 파일에 의해 구현되지 않은 기능을 정의하는 경우 더 많을 수 있음). 욕망.


4
  1. CoffeeScript 컴파일러는 Ruby로 처음 작성되었습니다.
  2. CoffeeScript 컴파일러는 CoffeeScript로 다시 작성되었습니다.

CoffeeScript 컴파일러의 Ruby 버전이 이미 존재하기 때문에 CoffeeScript 컴파일러의 CoffeeScript 버전을 작성하는 데 사용되었습니다.

여기에 이미지 설명을 입력하십시오 이를 자체 호스팅 컴파일러라고 합니다.

매우 흔하며 일반적으로 언어의 성장을 유지하기 위해 자신의 언어를 사용하려는 저자의 소망에서 비롯됩니다.


3

컴파일러는 특정 언어로 작성된 프로그램이기 때문에 컴파일러의 문제가 아니라 표현력의 문제입니다.

"언어가 작성 / 구현된다"고 할 때 실제로는 해당 언어에 대한 컴파일러 또는 인터프리터가 구현됨을 의미합니다. 언어를 구현하는 프로그램을 작성할 수있는 프로그래밍 언어가 있습니다 (동일한 언어의 컴파일러 / 통역사). 이 언어를 보편적 언어 라고 합니다 .

이것을 이해하려면 금속 선반에 대해 생각하십시오. 금속을 성형하는 데 사용되는 도구입니다. 해당 도구 만 사용하여 부품을 작성하여 동일한 동일한 다른 도구를 작성할 수 있습니다. 따라서이 도구는 범용 기계입니다. 물론 첫 번째 방법은 다른 방법 (다른 도구)을 사용하여 만들어졌으며 아마도 품질이 떨어졌을 수 있습니다. 그러나 첫 번째 것은 더 높은 정밀도로 새로운 것을 만드는 데 사용되었습니다.

3D 프린터는 거의 보편적 인 기계입니다. 3D 프린터를 사용하여 전체 3D 프린터를 인쇄 할 수 있습니다 (플라스틱을 녹이는 팁을 만들 수 없음).


나는 선반 비유를 좋아합니다. 그러나 선반 비유와 달리 첫 번째 컴파일러 반복의 결함은 모든 후속 컴파일러에 전달됩니다. 예를 들어, 위의 답변은 원래 컴파일러가 while 루프 만 사용하는 for-loop 기능을 추가하는 것을 언급합니다. 출력은 for 루프를 이해하지만 구현은 while 루프를 사용합니다. 원래 while 루프 구현에 결함이 있거나 비효율적이라면 항상 그럴 것입니다!

@ Physics-Compute는 단순히 잘못되었습니다. 악의적 결함이없는 경우 컴파일러를 컴파일 할 때 일반적으로 전파되지 않습니다.
plugwash

어셈블리 변환은 어셈블리 변환이 수정 될 때까지 반복에서 반복으로 전달됩니다. 이전 기능을 구축하는 새로운 기능은 기본 구현을 변경하지 않습니다. 잠시 생각해보십시오.

@plugwash Ken Thompson의 "신뢰 신뢰에 대한 반영"참조 -ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf

3

유도에 의한 증거

유도 단계

컴파일러의 n + 1 버전은 X로 작성됩니다.

따라서 n 번째 버전의 컴파일러 (X로 작성)로 컴파일 할 수 있습니다.

기본 케이스

그러나 X로 작성된 컴파일러의 첫 번째 버전은 X 이외의 언어로 작성된 X 용 컴파일러에 의해 컴파일되어야합니다.이 단계를 컴파일러 부트 스트래핑이라고합니다.


1
언어 X를위한 최초의 컴파일러 컴파일러는 X로 쉽게 작성할 수 있습니다. 가능한 첫 번째 컴파일러를 해석 할 수 있습니다 . (X 이외의 언어로 작성된 X 인터프리터).
Kaz

0

컴파일러는 높은 수준의 사양을 사용하여 하드웨어에서 실행될 수있는 것과 같은 낮은 수준의 구현으로 변환합니다. 따라서 대상 언어의 시맨틱 외에 사양 형식과 실제 실행 간에는 관계가 없습니다.

크로스 컴파일러는 한 시스템에서 다른 시스템으로 이동하고, 언어 간 컴파일러는 한 언어 사양을 다른 언어 사양으로 컴파일합니다.

기본적으로 컴파일은 단순한 번역이며 수준은 일반적으로 언어 수준이 높을수록 언어 수준이 낮지 만 여러 변형이 있습니다.

부트 스트랩 컴파일러는 물론 가장 혼란 스럽습니다. 그들이 작성하는 언어를 컴파일하기 때문입니다. 부트 스트랩의 초기 단계는 실행 가능한 최소한의 기존 버전이 필요하다는 것을 잊지 마십시오. 많은 부트 스트랩 컴파일러는 프로그래밍 언어의 최소 기능을 먼저 작동하고 이전 기능을 사용하여 새 기능을 표현할 수있는 한 복잡한 언어 기능을 추가합니다. 그렇지 않은 경우 "컴파일러"의 해당 부분을 미리 다른 언어로 개발해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.