programing

GCC와 g+++는 어떻게 포장되는가?

prostudy 2022. 4. 27. 21:37
반응형

GCC와 g+++는 어떻게 포장되는가?

이 일은 한동안 나를 귀찮게 했다.GCC와 g++는 어떻게 스스로를 컴파일하는가?

내 생각엔 모든 개정판은 이전에 만들어진 개정판과 함께 편집될 것 같아.이게 사실이야?그리고 만약 그렇다면, 가장 오래된 g++와 GCC 버전이 조립으로 쓰여졌다는 뜻일까?

현대 환경(x86 Linux)에서 GCC의 부트스트랩 프로세스를 복제하려면 bootstraplap 프로젝트에서 개발한 도구를 사용하십시오.

  • 다음 두 명령이 수행하는 대략적인 작업을 수행하는 조립자(x86에서는 357바이트 바이너리)로 시작할 수 있다.

    sed 's/[;#].*$//g' hex0_x86.hex0 | xxd -r -p > hex0
    chmod +x hex0
    

    즉, 바이너리 프로그램에 상당하는 ASCII를 바이너리 코드로 번역하지만, 그 자체로 16진법으로 표기한다.

    기본적으로, 16진수는 그것의 이진 코드에 1:1로 대응되는 동등한 소스 코드를 가지고 있다.

  • hex0몇 가지 더 많은 특징(한 문자 라벨 및 계산 오프셋)을 지원하는 훨씬 더 강력한 조립체를 구축하는 데 사용할 수 있다.헥스1은 헥스0 어셈블리로 쓰여 있다.

  • hex1제작에 사용될 수 있다(다중 문자 레이블을 지원하는 훨씬 더 진보된 조립자).

  • hex2그런 다음 매크로 어셈블러(육각 opcode 대신 매크로를 사용하는 프로그램)를 구축하는 데 사용할 수 있다.

  • 그런 다음 이 마크로 조립체를 사용하여 조립체로 작성된 "C 컴파일러"인 조립체를 만들 수 있다. cc_x86은 C의 작은 부분집합만 지원하지만 그것은 충동적인 시작이다.

  • 사용할 수 있다cc_x86C로 작성된 C 컴파일러인 (Macro Platform Neutral Transpiler)를 구축한다.M2-Planet은 자체 호스팅으로 자체 구축이 가능하다.

  • 그런 다음 M2-Planet을 사용하여 작은 계획 통역사인 GNU Mes를 구축할 수 있다.

  • 메스는 메스와 같은 저장소에 살고 있고 계획으로 쓰여진 C 컴파일러인 메스코를 실행하는데 사용될 수 있다.

  • 메스cc는 메스를 재건하고 또한 메스 C 라이브러리를 짓는데 사용될 수 있다.

  • 그리고 나서 메스cc는 잘게 패치가 된 Tiny C 컴파일러를 만드는 데 사용될 수 있다.

  • 그런 다음 TCC 0.9.27의 새로운 버전을 만드는 데 사용할 수 있다.

  • GCC 4.0.4와 musl C 라이브러리는 TCC 0.9.27로 구축할 수 있다.

  • 그러면 당신은 구형 GCC를 사용하여 새로운 GCC를 구축할 수 있다. 예: GCC 4.0.4 -> GCC 4.7.4 -> 현대 GCC.

TL;DR:

헥스0 -> 헥스1 -> 헥스2 -> M0 -> M2-Planet -> 메스cc -> TCC -> GCC.

GCC의 가장 오래된 버전은 다른 C 컴파일러를 사용하여 컴파일러로 컴파일이 작성되었다.사상 최초의 C 컴파일러(ca. 1973, IIRC)는 PDP-11 조립체 또는 그 이전의 B 프로그래밍 언어로 구현되었지만, 어떤 경우에도 B 컴파일러는 조립체로 작성되었다.마찬가지로, 최초의 C++ 컴파일러(CPre/Crfront, 1979-1983)는 아마도 C에서 처음 구현되었다가 C++로 다시 작성되었을 것이다.

GCC 또는 기타 자체 호스팅 컴파일러를 컴파일할 때 빌딩의 전체 순서는 다음과 같다.

  1. 기존 C 컴파일러로 GCC의 새 버전 구축
  2. 방금 만든 GCC로 새 버전의 GCC를 다시 빌드
  3. (선택사항) 확인을 위해 2단계를 반복하십시오.

이 과정을 부트스트래핑이라고 한다.컴파일러 자체 컴파일러의 컴파일러 기능을 테스트하고 컴파일러 자체에서 구현하는 모든 최적화로 컴파일러가 구축되었는지 확인한다.

편집: 드류 도만, 논평에서, 비야른 스트루스트럽의 C++의 가장 초기 구현에 대한 계정을 가리키고 있다.그것은 C++로 구현되었지만 스트루스트럽이 말하는 "프리프로세서"를 C++에서 C로 번역했다; 그의 정의에 의해 완전한 컴파일러가 아니라, 여전히 C++가 C에서 부트스트랩되었다.

참조URL: https://stackoverflow.com/questions/9429491/how-are-gcc-and-g-bootstrapped

반응형