Stirbt GCC ohne Thread-Unterstützung unter Windows? [geschlossen]

31

Ich brauche eine Meinung. GCC war immer ein sehr guter Compiler, aber in letzter Zeit verliert es an "Anziehungskraft". Ich habe gerade festgestellt, dass GCC unter Windows keine std::threadUnterstützung bietet, sodass Windows-Benutzer einen anderen Compiler verwenden müssen, da die aufregendste Funktion immer noch fehlt.

Aber warum unterstützt GCC unter Windows wirklich noch keine Threads? Lizenzprobleme? ABI-Inkompatibilitäten? (Nun, es gibt bereits mehrere plattformübergreifende Bibliotheken, die Multithreading verwenden: boost, POCO, SDL, wxwidgets usw. Wäre es nicht einfach, bereits vorhandenen und mit MIT / libpng-Lizenz versehenen Code zu verwenden, um diese Lücke zu schließen, anstatt GCC-Releases zu versenden ohne Thread-Unterstützung?)

Kürzlich hat GCC im Vergleich zu Compilern die umfassendste Unterstützung für C ++ 11-Funktionen im Vergleich zu anderen Compilern, mit Ausnahme der Tatsache, dass dies unter Windows nicht zutrifft, da uns immer noch Atomics, Mutexes und Threads fehlen: /

Ich würde gerne mehr über dieses Thema erfahren, aber das einzige, was ich finden kann, sind Leute, die um Hilfe bitten, weil:

"thread" existiert nicht im std Namespace

Mit Blick auf Ticketverfolgung und Mail-Diskussionen von GCC / TDM-GCC gab es seit 2009 Anfragen nach Thread-Support. Ist das nach 4 Jahren noch keine Lösung? Was ist wirklich los?

Spielentwickler
quelle
8
gcc ist immer noch gut, egal was du kürzlich herausgefunden hast.
ott--
1
Ich mochte gerade std :: thread. Das war nicht so schwer zu implementieren. Nehmen Sie einfach Variadics-Vorlagen und zum Beispiel SDL-Thread und Sie können eine Klasse
erstellen
12
Ich würde fast argumentieren, angesichts der Unfähigkeit von durchschnittlichen Programmierern, zuverlässige Multithread-Apps zu schreiben, ist keine Thread-Unterstützung ein Bonus .....
Mattnz
3
Sie beschweren sich über Bibliotheken, nicht speziell über den Compiler.
wirrbel
2
GCC ist beliebt, das stimmt. Aber ich würde nicht sagen, dass es "immer ein sehr guter Compiler" war. Vor langer Zeit experimentierten die Leute mit ICC unter Linux, weil GCC langsame und aufgeblähte Binärdateien produzierte. OTOH, alle großen Open-Source-Projekte, verwenden VS, um die Windows-Version ihres Codes zu kompilieren, da GCC im Vergleich dazu langsames Aufblähen erzeugt.
Vartec

Antworten:

23

Ich habe verstanden, dass GCC in Ungnade fällt, weil die Leute, die es pflegen, etwas arrogant geworden sind, und jetzt, wo LLVM hier ist (und sehr gut ist), stimmen die Leute mit den Füßen ab.

Slashdot diskutierte über die neue Unterstützung von LLVM für C ++ 11 . _merlin sagt:

Oh, ich glaube nicht, dass irgendjemand denkt, dass es böse ist, nur dass es eher Eigennutz als Großzügigkeit ist. Die phänomenale Popularität von GCC hat dazu geführt, dass seine Erhalter ein massives Ego aufgebaut haben und sich wie total [ * *** ] verhalten . Bugs werden schneller eingeführt, als Red Hat und Apple Patches für sie akzeptieren können, und sie haben die üble Angewohnheit, Fehlerberichte nicht zu prüfen und sie dann aufgrund von Inaktivität zu schließen, ohne sie tatsächlich zu beheben

das stimmt mit Ihrer Beobachtung über die 4-Jahres-Verzögerung überein.

gbjbaanb
quelle
Sie können auch developers.slashdot.org/… (ebenfalls von _merlin) finden, um auf andere Probleme beim Kompilieren für Nicht-Linux mit gcc hinzuweisen.
3
Es ist nicht nur LLVM, Visual Studio Express Editions sind eine weitere praktikable, kostenlose Alternative (wenn man bedenkt, dass es sich speziell um std::threadWindows handelt, das in VS2012 EE unterstützt wird)
MSalters
1
schade, VS2012 hat keine volle Unterstützung für std :: thread (z. B. keine thread_localVariablen)
Alrikai
Hat sich dies in der heutigen Zeit überhaupt geändert?
Hashim
29

Die Popularität und Benutzerfreundlichkeit von GCC ist nicht fraglich.

Unter https://stackoverflow.com/questions/12210102/does-gcc-4-7-1-support-threads unterstützt mingw unter http://code.google.com/p/mingw-builds/downloads/list Threads .

Ein wichtiger Gesichtspunkt ist jedoch die Lizenz.

FreeBSD hat eine unangenehme Beziehung zur GPL. Befürworter der BSD-Lizenz glauben, dass wirklich freie Software keine Nutzungsbeschränkungen hat. Die Befürworter der GPL sind der Ansicht, dass Einschränkungen erforderlich sind, um die Softwarefreiheit zu schützen, und insbesondere, dass die Fähigkeit, unfreie Software aus freier Software zu erstellen, eher eine ungerechte Form der Macht als eine Freiheit ist. Das FreeBSD - Projekt, wo möglich, versucht die Verwendung der GPL zu vermeiden (Einzelheiten https://unix.stackexchange.com/questions/49906/why-is-freebsd-deprecating-gcc-in-favor-of-clang- llvm )

Andere wichtige Überlegungen

Von http://clang.llvm.org/comparison.html#gcc

  • Die Clang ASTs und das Design sollen für jeden leicht verständlich sein, der mit den beteiligten Sprachen vertraut ist und über ein grundlegendes Verständnis der Funktionsweise eines Compilers verfügt. GCC hat eine sehr alte Codebasis, die neuen Entwicklern eine steile Lernkurve bietet.
  • Clang wurde von Anfang an als API entwickelt, sodass es von Quelltextanalyse-Tools, Refactoring, IDEs (usw.) sowie zur Codegenerierung wiederverwendet werden kann. GCC ist als monolithischer statischer Compiler aufgebaut, was die Verwendung als API und die Integration in andere Tools äußerst schwierig macht. Darüber hinaus ist es aufgrund seines historischen Designs und der aktuellen Richtlinien schwierig, das Front-End vom Rest des Compilers zu entkoppeln.
  • Verschiedene GCC-Entwurfsentscheidungen erschweren die Wiederverwendung: Das Build-System lässt sich nur schwer ändern, Sie können nicht mehrere Ziele zu einer Binärdatei verknüpfen, Sie können nicht mehrere Front-Ends zu einer Binärdatei verknüpfen. Es wird ein benutzerdefinierter Garbage Collector verwendet. verwendet umfangreiche globale Variablen, ist nicht wiedereintrittsfähig ("reentrant") oder multi-threadbar ("multi-threadable") usw. Clang hat keines dieser Probleme.
  • Clang verfolgt für jedes Token Informationen darüber, wo es geschrieben und wo es letztendlich erweitert wurde, wenn es in ein Makro eingebunden war. GCC verfolgt keine Informationen zu Makro-Instantiierungen, wenn der Quellcode analysiert wird. Dies macht es für Tools zum Umschreiben von Quellen (z. B. für das Refactoring) sehr schwierig, in Gegenwart von (auch einfachen) Makros zu arbeiten.
  • Clang vereinfacht Code nicht implizit, da es ihn wie GCC analysiert. Dies verursacht viele Probleme für die Tools zur Quellenanalyse: Wenn Sie beispielsweise "xx" in Ihren Quellcode schreiben, enthält der GCC AST "0", ohne dass 'x' erwähnt wird. Dies ist extrem schlecht für ein Refactoring-Tool, das 'x' umbenennen möchte.
  • Clang kann seinen AST auf Festplatte serialisieren und in ein anderes Programm zurücklesen, was für die Analyse des gesamten Programms nützlich ist. GCC hat das nicht. Der PCH-Mechanismus von GCC (bei dem es sich lediglich um einen Speicherauszug des Compiler-Speicherabbilds handelt) ist verwandt, kann den Speicherauszug jedoch architektonisch nur in genau dieselbe ausführbare Datei zurücklesen, die ihn erstellt hat (es handelt sich nicht um ein strukturiertes Format).
  • Clang ist viel schneller und benötigt viel weniger Speicher als GCC.
  • Clang ist bestrebt, äußerst klare und präzise Diagnosen (Fehler- und Warnmeldungen) bereitzustellen und unterstützt aussagekräftige Diagnosen. Die Warnungen von GCC sind manchmal akzeptabel, aber oft verwirrend und unterstützen keine aussagekräftige Diagnose. Clang behält auch Typedefs in der Diagnose konsistent bei und zeigt Makroerweiterungen und viele andere Funktionen an.
  • Clang übernimmt eine Reihe von Funktionen aus der Verwendung von LLVM als Backend, darunter die Unterstützung einer Bytecode-Darstellung für Zwischencode, steckbare Optimierer, Unterstützung für die Optimierung der Verknüpfungszeit, Just-In-Time-Kompilierung, die Möglichkeit, mehrere Codegeneratoren einzubinden usw .
  • Clangs Unterstützung für C ++ ist in vielerlei Hinsicht konformer als die von GCC (z. B. konforme Suche nach zweiphasigen Namen).

Von http://www.linuxquestions.org/questions/slackware-14/gcc-vs-llvm-931034/

  • Der Vorteil von llvm / clang ist sein modularer Aufbau, so dass es als
    Schnittstelle verwendet werden kann, um beispielsweise statische Code-Analysewerkzeuge zu erstellen, was immer wichtiger wird ()

Von http://clang.debian.net/

  • clang ist jetzt bereit, Software für die Produktion zu erstellen (entweder für C, C ++ oder Objective-C). Dieser Compiler bietet viel mehr Warnungen und interessante Fehler als die gcc-Suite, obwohl er nicht das gleiche Erbe wie gcc enthält.
Md Mahbubur Rahman
quelle
2
Beste Antwort aller Zeiten!
Vorac
3
Nur um auf dem neuesten Stand zu sein: GCC verfolgt die Erweiterung von Makros seit 4.8, mit der Option -ftrack-macro-expansion, die jetzt standardmäßig aktiviert ist :)
Morwenn
Ein weiteres Problem bei dem Versuch, den Quellbaum zum Zeitpunkt des Parsens zu vereinfachen, besteht darin, dass in vielen Situationen ein bisschen Syntax keinen Code generieren sollte, sondern sich darauf auswirken sollte, welche Optimierungen zulässig sind. Wenn foound mooZeiger auf verschiedene Strukturtypen sind, die beide ein Feld barals Teil ihrer Anfangssequenz haben, sollte das Schreiben *&foo->barund Lesen dazu *&moo->barführen, dass das Lesen das Schreiben sieht, da der einzige effektive Typ, der bei beiden Zugriffen verwendet wird, der Typ von ist bar. GCC scheint jedoch herauszufiltern *&und versickert so die Arten von foound moo...
Supercat
... über die Adresse des Betreibers, die durch nichts, was ich im Standard finden kann, gerechtfertigt ist.
Supercat
11

Der Grund, warum es viel Zeit kostet, ist, dass es viel Arbeit kostet, ein solides Fundament zu schaffen, auf dem die Header erstellt werden. Die Art und Weise, wie mingw-w64 zu funktionieren scheint, besteht darin, eine solide, pthread-ähnliche Bibliothek unter Windows zu erstellen. Darüber herrscht weniger Empörung als die Einführung einer Abhängigkeit vom systemeigenen Threading der Windows-API.

mingw-w64 implementiert <thread>und die anderen C ++ 11-Header über ihre eigene winpthreadsBibliothek. Dies sollte zum Testen sowohl in Mingw-Builds als auch in Rubenvbs Distributionen der Mingw-W64-Toolchain verfügbar sein. Ich würde empfehlen, den Mailinglisten von mingw-w64 zu folgen, wenn Sie nachverfolgen möchten, wo die meisten Arbeiten an nativen Windows-GCC-Anwendungen ausgeführt werden.

Das Qt Project verfügt über eine Wiki-Seite mit einer detaillierten Beschreibung der aktuellen Empfehlungen und einer Übersicht der GCC-Toolchains unter Windows. Weitere Informationen finden Sie auf dieser Wiki-Seite zu Qt Project .

Lars Viklund
quelle