[compiler-construction] 부트 스트랩에는 여전히 외부 지원이 필요합니다.

나는 언어를 부트 스트랩하는 아이디어, 즉 언어 자체에 대한 컴파일러 / 인터프리터를 작성한다는 생각을 들었습니다. 나는 이것이 어떻게 이루어 질 수 있는지 궁금해하고 약간 둘러 보았고 누군가가 그것을 할 수 있다고 말하는 것을 보았습니다.

  • 다른 언어로 초기 컴파일러 작성.
  • 처음의 특별한 경우처럼 보이는 Assembly에서 초기 컴파일러를 직접 코딩

나에게 이들 중 어느 것도 외부 지원이 필요하다는 의미에서 실제로 언어를 부트 스트랩 하는 것처럼 보이지 않습니다 . 실제로 자체 언어로 컴파일러를 작성하는 방법이 있습니까?



답변

실제로 자체 언어로 컴파일러를 작성하는 방법이 있습니까?

당신 당신의 새로운 컴파일러를 작성하는 몇 가지 기존의 언어를 가지고. 새, 말, C ++ 컴파일러를 작성한다면, 당신은 단지 C ++에 쓰기 먼저 기존 컴파일러로 컴파일합니다. 반면에 새 언어에 대한 컴파일러를 만드는 경우 Yazzleof라고합시다. 먼저 새 컴파일러를 다른 언어로 작성해야합니다. 일반적으로 이것은 또 다른 프로그래밍 언어이지만 반드시 그럴 필요는 없습니다. 어셈블리 일 수도 있고 필요한 경우 기계 코드 일 수도 있습니다.

당신이 경우 Yazzleof위한 컴파일러를 부트 스트랩 것, 당신은 일반적으로 초기에 전체 언어의 컴파일러를 쓸 것입니다. 대신 당신은 Yazzle 라이트의 Yazzleof의 가장 작은 부분 집합 (음,에 대한 컴파일러 작성합니다 아주 작은을 적어도 하위 집합). 그런 다음 Yazzle-lite에서 전체 언어에 대한 컴파일러를 작성합니다. (분명히 이것은 한 번의 점프 대신 반복적으로 발생할 수 있습니다.) Yazzle-lite는 Yazzleof의 적절한 하위 집합이므로 이제 자체적으로 컴파일 할 수있는 컴파일러가 있습니다.

정말 제목 (현대 컴퓨터에 기본적으로 16 진수 편집기입니다) 가능한 한 가장 낮은 수준에서 컴파일러를 부트 스트랩에 대한 좋은 작성자 아무것도에서 간단한 컴파일러 부트 스트랩은 . https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html 에서 찾을 수 있습니다 .


답변

읽은 설명이 정확합니다. Compilers : Principles, Techniques and Tools (the Dragon Book) 에서 이에 대한 논의가 있습니다 .

  • 언어 Y에서 언어 X 용 컴파일러 C1 작성
  • 컴파일러 C1을 사용하여 X 언어로 언어 X 용 컴파일러 C2를 작성합니다.
  • 이제 C2는 완전한 자체 호스팅 환경입니다.


답변

이것에 대한 매우 흥미로운 토론은 Unix 공동 제작자 Ken ThompsonTuring Award 강의입니다.

그는 다음으로 시작합니다.

제가 설명하고자하는 것은 컴파일러가 자신의 언어로 작성 될 때 발생하는 많은 “닭과 계란”문제 중 하나입니다. 이를 위해 C 컴파일러의 특정 예제를 사용하겠습니다.

C 컴파일러가 로그인 프로그램을 인식하고 특수 코드를 추가하기 때문에 항상 암호없이 로그인 할 수있는 Unix C 컴파일러 버전을 어떻게 작성했는지 보여줍니다.

두 번째 패턴은 C 컴파일러를 대상으로합니다. 대체 코드는 두 트로이 목마를 컴파일러에 삽입하는 1 단계 자체 재생 프로그램입니다. 여기에는 2 단계 예에서와 같이 학습 단계가 필요합니다. 먼저 버그가있는 바이너리를 생성하기 위해 수정 된 소스를 일반 C 컴파일러로 컴파일합니다. 이 바이너리를 공식 C로 설치합니다. 이제 컴파일러 소스에서 버그를 제거 할 수 있으며 새 바이너리는 컴파일 될 때마다 버그를 다시 삽입합니다. 물론 로그인 명령은 소스에서 추적없이 버그가 남아 있습니다.


답변

내가 들어 본 방식은 극히 제한된 컴파일러를 다른 언어로 작성한 다음이를 사용하여 새 언어로 작성된 더 복잡한 버전을 컴파일하는 것입니다. 이 두 번째 버전을 사용하여 자체 컴파일하고 다음 버전을 사용할 수 있습니다. 컴파일 될 때마다 마지막 버전이 사용됩니다.

이것이 부트 스트랩 의 정의입니다 .

동일한 목적을 수행하는 더 복잡한 시스템을 활성화하는 단순한 시스템의 프로세스.

편집 : 컴파일러 부트 스트랩에 대한 Wikipedia 기사 는 저보다 개념을 더 잘 다루고 있습니다.


답변

GCC 컴파일러 내부 및 GCC 부트 스트랩 프로세스에 대해 설명 하는 팟 캐스트 소프트웨어 엔지니어링 라디오 에피소드 61 (2007-07-06)을 확인하십시오 .


답변

Donald E. Knuth는 실제로 그 안에 컴파일러를 작성하여 WEB 을 구축 한 다음이를 어셈블리 또는 기계 코드로 직접 컴파일했습니다.


답변

내가 알기로 첫 번째 Lisp 인터프리터는 생성자 함수와 토큰 리더를 직접 컴파일하여 부트 스트랩되었습니다. 나머지 통역사는 소스에서 읽어 들였습니다.

원본 McCarthy 논문, 기호 표현의 재귀 함수 및 기계에 의한 계산, Part I 을 읽고 직접 확인할 수 있습니다 .