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_x86
C로 작성된 C 컴파일러인 (Macro Platform Neutral Transpiler)를 구축한다.M2-Planet은 자체 호스팅으로 자체 구축이 가능하다.그런 다음 M2-Planet을 사용하여 작은 계획 통역사인 GNU Mes를 구축할 수 있다.
메스는 메스와 같은 저장소에 살고 있고 계획으로 쓰여진 C 컴파일러인 메스코를 실행하는데 사용될 수 있다.
메스cc는 메스를 재건하고 또한 메스 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 또는 기타 자체 호스팅 컴파일러를 컴파일할 때 빌딩의 전체 순서는 다음과 같다.
- 기존 C 컴파일러로 GCC의 새 버전 구축
- 방금 만든 GCC로 새 버전의 GCC를 다시 빌드
- (선택사항) 확인을 위해 2단계를 반복하십시오.
이 과정을 부트스트래핑이라고 한다.컴파일러 자체 컴파일러의 컴파일러 기능을 테스트하고 컴파일러 자체에서 구현하는 모든 최적화로 컴파일러가 구축되었는지 확인한다.
편집: 드류 도만, 논평에서, 비야른 스트루스트럽의 C++의 가장 초기 구현에 대한 계정을 가리키고 있다.그것은 C++로 구현되었지만 스트루스트럽이 말하는 "프리프로세서"를 C++에서 C로 번역했다; 그의 정의에 의해 완전한 컴파일러가 아니라, 여전히 C++가 C에서 부트스트랩되었다.
참조URL: https://stackoverflow.com/questions/9429491/how-are-gcc-and-g-bootstrapped
'programing' 카테고리의 다른 글
시간에 따라 여러 VueJS, @vue/cli 종속 애플리케이션을 유지 관리하는 규정된 방법은 무엇인가? (0) | 2022.04.27 |
---|---|
API에서 ChartJS가 포함된 VueJs 채우기 (0) | 2022.04.27 |
마우스 오른쪽 버튼을 클릭하고 '새로 만들기'를 선택하면 IntelliJ가 '클래스'를 표시하지 않음 (0) | 2022.04.27 |
Vue: 루트 요소 컨텐츠 및 컨텐츠 배포 슬롯 (0) | 2022.04.27 |
하위 프로세스를 종료하는 방법 - _hostname vs. exit (0) | 2022.04.27 |