gcc C 컴파일러는 C 자체로 작성됩니까?


87

gcc C 컴파일러는 C 자체로 작성 되었습니까? 아니면 Assembly로 작성 되었습니까? 컴파일러가 C로 작성된 경우 컴파일러 코드를 컴파일하는 데 사용되는 컴파일러는 무엇입니까?


12
네, 그렇습니다 (대부분). 물론, C를 컴파일하려면 C 컴파일러가 필요합니다. 대부분의 컴파일러와 마찬가지로 일련의 "부트-스트랩"단계가 있습니다. 일반적인 아이디어는 GCC 설치 : GCC-LFS 빌드설치 에서 다룹니다 .

2
1980 년대와 90 년대 초의 다른 브랜드 워크 스테이션은 c 컴파일러, 도구 등을 사용하는 고유 한 유닉스 계열 환경을 가지고 있었는데, 모두 서로 조금씩 다릅니다. GCC 소스를 사용하면 이러한 플랫폼 중 하나에서 gcc의 초기 컴파일을 수행 한 다음 몇 번 자체로 gcc를 컴파일하여 고정 지점을 어느 정도 확인할 수 있습니다.
Paul

답변:


99

gcc에 대한 구체적인 역사는 GCC Wiki에 있습니다. 보다 일반적인 요점은 컴파일러가 자체적으로 컴파일 할 수있을만큼 강력 할 때까지 일반적으로 다른 컴파일러로 컴파일된다는 것입니다. 또는 어셈블러에서 기능의 하위 집합을 처리하고 거기에서 빌드 할 수있는 기본 컴파일러를 작성할 수 있습니다. 그러나 다시 말하지만 이것은 더 이상 필요하지 않습니다. 다양한 언어로 사용 가능한 많은 컴파일러가 있습니다. Stephen Johnson이 pcc (최초의 C 컴파일러 중 하나)를 작성할 때도 B 용 컴파일러와 다른 많은 언어를 사용할 수있었습니다. gcc에는 원래 빌드하기 위해 선택할 컴파일러가 여러 개 있었으며 RMS는 적어도 초기 개발 중에 Pastel 컴파일러를 사용했다고 말합니다.

C 컴파일러를 C로 작성해야 할 필요는 없습니다. 원하는 경우 Perl로 작성할 수 있습니다. 주어진 플랫폼에 대한 컴파일러가 원래 해당 플랫폼에서 작성 될 필요는 없습니다 (임베디드 시스템은 거의 항상 다른 시스템에서 컴파일 됨). 따라서 스스로를 부트 스트랩하는 방법에는 여러 가지가 있습니다.

이 질문에는 컴파일러 부트 스트랩의 첫 번째 인스턴스와 관련된 몇 가지 흥미로운 미묘함이 있습니다. 당신이 매우 영리하다면 그 부트 스트랩을 사용하여 놀랍고 훌륭하며 무서운 일을 할 수 있습니다 .


두 번째로 연결 한 기사는 엄청나게 영리합니다.
Ponkadoodle 2011

1
훌륭한 부트 스트래핑 링크에 감사드립니다. 나는 컴파일러는 항상 간단한 언어에 대한 기계 코드에있는 모든 방법을 다시 기록 된 것으로 가정 한 종류의 이 이유를. (예를 들어, 컴파일러의 바이너리에 실수가 있다는 것을 알고 있다면 어떨까요? 이것은 당연히 훨씬 더 강력한 예를 제공합니다.) 그렇다면 자체 언어 언어로 컴파일러를 작성하면 어떤 이점이 있습니까? 극도로 편집증적인 사람들이 이것에 대해 걱정하고 "자체"부트 스트랩없이 컴파일러를 빌드합니까?
RoG

4
일부 언어 그룹은 스스로 컴파일 할 수있는 것을 영광으로 생각합니다. Go는 최근이 방향으로 큰 추진력을 보였습니다. 반면 Swift는 현재 Swift로 컴파일러를 다시 작성할 계획이 없습니다. 그러나 GCC는 항상 C로 작성되었습니다. 단지 다른 컴파일러로 컴파일되었습니다. 그러나 모든 C 컴파일러가 BCPL로 작성 되었다면 편집증에 관한 어떤 것도 고칠 수 없습니다. 문제를 한 단계 뒤로 이동합니다. (당신은 승 / 연타 GCC를 컴파일하여 동일한 편집증 혜택을받을 것입니다.)
롭 네이피어

gcc에는 gcc 메이저 버전 X가 항상 gcc 메이저 버전 X-1로 컴파일 될 수 있다는 정책이 있으므로 X의 컴파일러에 추가 된 모든 새로운 기능은 X + 1의 gcc 소스 자체에서만 사용할 수 있습니다. 예를 들어 부 버전 번호가 무엇이든 gcc 8을 사용하여 부 버전이 무엇이든 상관없이 gcc 버전 9를 컴파일 할 수 있어야합니다.
Baruch

51

원래는 일부 어셈블리 언어로 작성되었고 개밥 자체가 시작되었습니다.


2
원래 부트 스트랩에 어셈블러를 사용하는 RMS에 대한 참조를 보지 못했습니다. 그 출처는 무엇입니까? 그는 부트 스트랩 할 다른 컴파일러가 여러 개 있었으므로 많은 작업이 수행 된 것 같습니다.
Rob Napier

18
용어는 부트 스트랩이지만.
Martin York

7
hahaha 몇 주 전에 이것을 읽었고 그 표현이 당신이 마음에 들었다고 생각했지만 그것이 표준이라는 것을 깨닫지 못했습니다. 좋은 쇼 선생님! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

이것은 분명히 매우 대략적인 지표 일 뿐이지 만 디렉토리 에있는 이 빠른 목록gcc-5.1.0-src/gcc/흥미 롭다 는 것을 알았습니다 . 이 디렉토리에는 GCC 자체의 주요 소스가 포함되어 있습니다 (런타임 라이브러리 제외).

다음은 C 및 C ++ 파일이 지배하는 확장자 별로 그룹화 상위 파일 수 (100 개 이상) 입니다.

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

요즘 GCC은 GNU C 컴파일러뿐만 아니라 GNU 컴파일러 컬렉션을 참조합니다.

6.3 gcc 하위 디렉토리

gcc 디렉토리에는 GCC의 C 소스의 일부인 많은 파일, 구성 및 빌드 프로세스의 일부로 사용되는 기타 파일, 설명서 및 테스트 모음을 포함한 하위 디렉토리가 포함되어 있습니다.

참조 : https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

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