Czy nie ma problemu z kurczakiem i jajkiem, ponieważ GCC jest napisane w samym C ++?

10

Od wydania 4.8 kompilator C ++ GCC (część G ++) jest już napisany nie w języku C, ale w samym C ++. Mam hipotetyczne pytanie w tej sprawie.

Zastanawiam się, jak skompilować kod C ++ GCC na nowej platformie, która nie ma jeszcze kompilatora C ++. Oczywiście można użyć wstępnie skompilowanych plików binarnych skompilowanych na innych komputerach. Lub możesz użyć starszej wersji GCC, która została napisana w C i skompilować z nią bieżącą wersję.

Jednak bez gotowych plików binarnych i tylko najnowszej wersji utknąłeś, prawda? Jeśli nie, czy istnieją inne implikacje dla tej sytuacji wynikające z przejścia z C na C ++ projektu GCC?

danijar
źródło
3
Nie jestem pewien, o co tu pytasz, choć możesz przeczytać o kompilacji krzyżowej .
5
Zupełnie nowa platforma nie będzie miała kompilatora C ++ ani kompilatora C. Odpowiedź stanowi kompilacja krzyżowa.
dok.
1
Prawdopodobnie powinieneś przeczytać przejście GCC do C ++ , przejście do C ++ i być może dyskusja GCC będzie teraz potrzebować C ++ do zbudowania na reddicie. Nie jestem pewien, czy gccprzed wersją 4.8 można było zbudować kompilator C spakowany z dowolnym systemem operacyjnym (i to ograniczyłoby cię do C89 na wielu).
2
Nie rozumiem, co jest specjalnego w C ++ w tym pytaniu, problem istnieje z C lub innym językiem, prawda?
RemcoGerlich,

Odpowiedzi:

16

To właściwie dobrze znana koncepcja zwana bootstrapowaniem . Zasadniczo istnieje gdzieś minimalna baza kodu C do zbudowania wersji GCC, która jest w stanie zbudować obecną bazę kodu GCC. Języki samo-hostingu robią takie rzeczy od dziesięcioleci.

Mason Wheeler
źródło
Właściwie nie. Tak już nie jest (i problem z pytaniem). gccnie może być już kompilowany przez kompilator AC. Jedyną gwarancją kompilacji gcc, którą tworzą, jest to, że gcc w wersji N można zbudować za pomocą gcc w wersji N-1.
9
@MichaelT: Ale wcześniejszą wersję GCC można zbudować za pomocą kompilatora C, który może następnie skompilować późniejsze wersje napisane w C ++, co powiedziałem.
Mason Wheeler,
Chciałbym również wskazać na pytania w pytaniu: However, without prebuilt binaries and just the newest version, you were stuck, right? If not, are there other implications on this situation raised by the switch from C to C++ of the GCC project?- zakłada, że nie masz dostępu do poprzednich wersji, ani nie zajmuje się innymi konsekwencjami przejścia z C na C ++ dla bazy kodu.
9

Tworzenie kompilatora napisanego w tym samym języku, który kompiluje, nazywa się ładowaniem początkowym . Artykuł w Wikipedii opisuje wiele sposobów uruchamiania kompilatora.

Biorąc pod uwagę twoje ograniczenie, że masz tylko kod źródłowy G ++ post-4.8 i nie masz gotowych plików binarnych na platformę docelową (brak istniejącego kompilatora C ++), wówczas kompilacja G ++ można uruchomić za pomocą kompilacji krzyżowej .

Podczas ładowania kompilatora za pomocą kompilacji krzyżowej budujesz kilka wersji swojego kompilatora

  1. Na komputerze instalujesz kompilator C ++ (może to być dowolny kompilator C ++, nie musi to być G ++)
  2. Za pomocą tego kompilatora można utworzyć kompilator krzyżowy G ++, który można uruchomić na komputerze PC i wygenerować kod dla platformy docelowej
  3. Za pomocą właśnie skompilowanego kompilatora krzyżowego G ++ tworzysz natywny kompilator G ++, który można uruchomić na platformie docelowej i utworzyć dla niego kod.
  4. Gotowe. Utworzyłeś kompilator C ++ dla nowej platformy.

Jeśli nie masz komputera (lub podobnego) do wykonania początkowych kroków, to rzeczywiście utkniesz, ale szansa na znalezienie się w takiej sytuacji i próbę uruchomienia kompilatora jest znikoma.

Bart van Ingen Schenau
źródło