it-swarm.com.de

Stirbt GCC ohne Thread-Unterstützung unter Windows?

Ich brauche eine Meinung. GCC war immer ein sehr guter Compiler, aber in letzter Zeit verliert es an Attraktivität. Ich habe gerade festgestellt, dass GCC unter Windows keine std::thread - Unterstützung bietet, wodurch Windows-Benutzer gezwungen werden, einen anderen Compiler zu verwenden, da die aufregendste Funktion 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/libpng-lizenzierten Code zu verwenden, um diese Lücke zu schließen, anstatt GCC-Versionen zu versenden ohne Thread-Unterstützung?)

In Bezug auf Compiler-Vergleiche hat GCC kürzlich die größte Unterstützung für C++ 11-Funktionen in Bezug auf andere Compiler, mit Ausnahme der Tatsache, dass dies unter Windows nicht der Fall ist, 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 Standard-Namespace

In Bezug auf die Ticketverfolgung und E-Mail-Diskussionen von GCC/TDM-GCC gab es seit 2009 Anfragen nach Thread-Unterstützung. Möglicherweise nach 4 Jahren immer noch keine Lösung? Was ist wirklich los?

31
CoffeDeveloper

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 hatte eine Diskussion über LLVMs neue Unterstützung für C++ 11_merlin sagt:

Oh, ich glaube nicht, dass irgendjemand es für böse hält, nur dass es eher reines Eigeninteresse als Großzügigkeit ist. Die phänomenale Popularität von GCC hat dazu geführt, dass seine Betreuer ein massives Ego entwickeln und sich wie total [ * *** ] verhalten. Fehler werden schneller als Red Hat eingeführt und Apple kann Patches für sie akzeptieren lassen, und sie haben die böse Angewohnheit, Fehlerberichte nicht anzusehen und sie dann aufgrund von Inaktivität zu schließen, ohne sie tatsächlich zu beheben

was mit Ihrer Beobachtung über die 4-jährige Verzögerung übereinstimmt.

23
gbjbaanb

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

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

Wichtige Überlegung ist jedoch die Lizenz.

FreeBSD hat eine unangenehme Beziehung zur GPL. Befürworter von BSD-Lizenzen glauben, dass wirklich freie Software keine Nutzungsbeschränkungen hat. GPL-Befürworter glauben, dass Einschränkungen notwendig sind, um die Softwarefreiheit zu schützen, und insbesondere, dass die Fähigkeit, nicht freie Software aus freier Software zu erstellen, eher eine ungerechte Form der Macht als eine Freiheit ist. Das FreeBSD-Projekt versucht nach Möglichkeit, 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 ein grundlegendes Verständnis für die Funktionsweise eines Compilers hat. GCC hat eine sehr alte Codebasis, die neuen Entwicklern eine steile Lernkurve bietet.
  • Clang wurde von Anfang an als API konzipiert, sodass es von Quellenanalysetools, 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 macht es das historische Design und die aktuelle Politik schwierig, das Front-End vom Rest des Compilers zu entkoppeln.
  • Verschiedene GCC-Entwurfsentscheidungen machen die Wiederverwendung sehr schwierig: Das Build-System ist schwer zu ändern, Sie können nicht mehrere Ziele zu einer Binärdatei verknüpfen, Sie können nicht mehrere Frontends zu einer Binärdatei verknüpfen, es wird ein benutzerdefinierter Garbage Collector verwendet. Verwendet globale Variablen in großem Umfang, ist nicht wiedereintrittsfähig oder multithreadfähig usw. Clang hat keines dieser Probleme.
  • Für jedes Token verfolgt clang Informationen darüber, wo es geschrieben wurde und wo es letztendlich erweitert wurde, wenn es an einem Makro beteiligt war. GCC verfolgt beim Parsen des Quellcodes keine Informationen zu Makroinstanziierungen. Dies macht es für Tools zum Umschreiben von Quellen (z. B. zum Umgestalten) sehr schwierig, in Gegenwart von (sogar einfachen) Makros zu arbeiten.
  • Clang vereinfacht den Code nicht implizit, da er wie GCC analysiert wird. Dies verursacht viele Probleme für Tools zur Quellanalyse: Wenn Sie als einfaches Beispiel "xx" in Ihren Quellcode schreiben, enthält der GCC AST "" 0 ", ohne dass 'x' erwähnt wird Dies ist äußerst schlecht für ein Refactoring-Tool, das 'x' umbenennen möchte.
  • Clang kann sein AST auf die Festplatte ausgeben und es in ein anderes Programm zurücklesen, was für die Analyse des gesamten Programms nützlich ist. GCC hat dies nicht. Der PCH-Mechanismus von GCC (der nur ein Speicherauszug des ist) Compiler-Speicher-Image) ist verwandt, kann den Speicherauszug jedoch architektonisch nur in genau dieselbe ausführbare Datei zurücklesen wie die, 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 zielt darauf ab, eine äußerst klare und präzise Diagnose (Fehler- und Warnmeldungen) bereitzustellen, und bietet Unterstützung für die aussagekräftige Diagnose. 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 erbt 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 Verbindungszeit, Just-In-Time-Kompilierung, die Möglichkeit, mehrere Codegeneratoren zu verknüpfen usw. .
  • Clangs Unterstützung für C++ ist in vielerlei Hinsicht konformer als die von GCC (z. B. konforme zweiphasige Namenssuche).

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

  • Der Vorteil von llvm/clang ist sein modularer Aufbau
    Schnittstelle und verwendet zum Beispiel, um statische Code-Analyse-Tools 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, ohne das gleiche Erbe wie gcc zu haben.
29

Der Grund, warum es viel Zeit kostet, ist, dass es viel Arbeit erfordert, eine solide Grundlage zu schaffen, auf der die Header aufgebaut werden können. Die Art und Weise, wie mingw-w64 zu bo scheint, besteht darin, eine solide pthreads-ähnliche Bibliothek unter Windows zu erstellen. Darüber gibt es weniger Upstream-Grummel als die Einführung einer Abhängigkeit vom nativen Threading der Windows-API.

mingw-w64 implementiert <thread> und die anderen C++ 11-Header über ihrer eigenen winpthreads -Bibliothek. 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-Arbeiten ausgeführt werden.

Das Qt-Projekt verfügt über eine Wiki-Seite mit aktuellen Empfehlungen und einen Überblick über die GCC-Toolchains unter Windows, siehe diese Qt-Projekt-Wiki-Seite .

11
Lars Viklund