GCC, Windows'ta iş parçacığı olmadan ölüyor mu? [kapalı]


31

Bir fikre ihtiyacım var. GCC her zaman çok iyi bir derleyiciydi, fakat son zamanlarda “temyiz” kaybediyor. Windows GCC'nin std::threaddesteklemediğini, Windows kullanıcılarını başka bir derleyiciyi kullanmaya zorladığını, çünkü en heyecan verici özelliğin hala eksik olduğunu buldum .

Peki neden GCC'nin hala Windows'ta iş parçacığı desteği yok? Lisans problemleri? ABI uyumsuzluğu? (Pek çok okuyucuyu kullanan birçok çapraz platform kütüphanesi zaten var: boost, POCO, SDL, wxwidgets, vb. GCC sürümlerini göndermek yerine zaten mevcut olan ve MIT / libpng lisanslı kodların kullanımı bu kadar basit olmaz mıydı? iş parçacığı desteği ile?)

Son zamanlarda, derleyici karşılaştırmalarına baktığımızda, GCC, Windows'ta bunun doğru olmadığı, çünkü hala atom, muteks ve konu başlıklarından yoksun olduğumuz için C ++ 11 özellikleri için en geniş desteğe sahip: /

Bu konu hakkında daha fazla bilgi edinmek istiyorum, ancak bulabildiğim tek şey yardım isteyen insanlar.

"thread" std ad alanında mevcut değil

GCC / TDM-GCC'nin bilet takibi ve posta tartışmalarına baktığımızda, 2009'dan beri iş parçacığı desteği talepleri vardı. 4 yıl sonra hala çözüm yok mu? Gerçekten neler oluyor?


8
Son zamanlarda ne öğrendiyseniz sorun gcc hala iyidir.
ott--

1
Sadece std :: thread'ı sevdim. uygulamak zor bir özellik değildi. Sadece variadics şablonlarını ve örneğin SDL iş parçacığını alın; std :: thread: /
GameDeveloper

12
Neredeyse tartışıyordum ortalama programcıların güvenilir çoklu iş parçacıklı uygulamalar yazamaması nedeniyle, hiçbir iplik desteği bir bonus değil .....
mattnz

3
Özellikle derleyiciden değil, kütüphanelerden şikayet ediyorsun.
wirrbel

2
GCC popüler, bu doğru. Ancak, "her zaman çok iyi bir derleyici" olduğunu söyleyemem. Yıllar önce insanlar GCC'nin ürettiği yavaş ve şişirilmiş ikili dosyalardan dolayı Linux'ta ICC'yi deniyorlardı. Tüm büyük açık kaynaklı proje OTOH, kodlarının Windows sürümünü derlemek için VS'yi kullanıyor, çünkü GCC kıyaslandığında yavaş bir şişkinlik üretiyor.
vartec

Yanıtlar:


23

GCC'nin lehine düştüğünü anladım, çünkü onu koruyan insanlar biraz kibirli hale geldi ve şimdi LLVM burada (ve çok iyi) insanlar ayaklarıyla oy veriyor.

Slashdot, LLVM'nin C ++ 11 için yeni desteği hakkında bir tartışma yaptı . _merlin diyor ki:

Oh, kimsenin kötü olmadığını düşündüğünü sanmıyorum, sadece cömertlikten ziyade saf bir çıkar olduğunu. GCC'nin olağanüstü popülaritesi, koruyucularında büyük egoları büyütmeye ve toplam gibi davranmalarına neden oldu [ * *** ]. Hatalar, Red Hat ve Apple’ın kabul ettikleri için yamalar alabilmesinden daha hızlı bir şekilde tanıtıldı ve hata raporlarına bakmama, daha sonra fiilen düzeltmeden hareketsizlik nedeniyle kapanma alışkanlıklarına sahipler.

Hangi 4 yıllık gecikme ile ilgili gözleminizi yerine getirir.


Ayrıca gcc ile linux olmayanların derlenmesiyle ilgili diğer problemleri belirtmek için developers.slashdot.org/… (_merlin tarafından da) bulabilirsiniz .

3
Bu sadece LLVM, Visual Studio Express Edition başka yaşayabilir değil, alternatif (soru dikkate özellikle hakkındadır Gratis std::threadVS2012 EE yerleşik olduğu Windows üzerinde)
MSalters

1
Çok kötü VS2012 std :: thread için tam desteğe sahip değil (örn. thread_localdeğişken yok )
alrikai

Modern günde bu hiç değişti mi?
Hashim

29

GCC'nin popülaritesi ve kullanılabilirliği sorgulanamaz.

Gönderen https://stackoverflow.com/questions/12210102/does-gcc-4-7-1-support-threads mingw vücutluydu http://code.google.com/p/mingw-builds/downloads/list konuları destekler .

Ancak önemli husus Lisans.

FreeBSD'nin GPL ile tedirgin bir ilişkisi var. BSD lisans savunucuları, gerçekten özgür yazılımın kullanım kısıtlaması bulunmadığını düşünüyor. GPL savunucuları, yazılım özgürlüğünü korumak için kısıtlamaların gerekli olduğuna ve özellikle de özgür olmayan yazılımın özgür yazılımdan yaratılmasının bir özgürlük değil, haksız bir güç biçimi olduğuna inanmaktadır. FreeBSD projesi, mümkün olduğunda, GPL'nin kullanılmasından kaçınmaya çalışır (Ayrıntılar için https://unix.stackexchange.com/questions/49906/why-is-freebsd-deprecating-gcc-in-favor-of-clang- llvm )

Diğer önemli hususlar

Gönderen http://clang.llvm.org/comparison.html#gcc

  • Clang AST'ler ve tasarım, ilgili dilleri bilen ve bir derleyicinin nasıl çalıştığı hakkında temel bir anlayışa sahip olan herkes tarafından kolayca anlaşılabilir olması amaçlanmıştır. GCC, yeni geliştiricilere dik bir öğrenme eğrisi sunan çok eski bir kod tabanına sahiptir.
  • Clang, kaynak analiz araçları, yeniden düzenleme, IDE'ler (vb.) İle kod oluşturma işlemlerinde yeniden kullanılmasına olanak tanıyan başlangıcından itibaren bir API olarak tasarlanmıştır. GCC, monolitik statik bir derleyici olarak oluşturulmuştur; bu, API olarak kullanılmasını ve diğer araçlara entegre edilmesini oldukça zorlaştırır. Ayrıca, tarihi tasarımı ve mevcut politikası, ön ucu derleyicinin geri kalanından ayırmayı zorlaştırır.
  • Çeşitli GCC tasarım kararları yeniden kullanılmasını çok zorlaştırır: yapı sisteminin değiştirilmesi zordur, birden fazla hedefi bir ikili dosyaya bağlayamazsınız, birden fazla ön ucu bir ikili dosyaya bağlayamazsınız, özel bir çöp toplayıcı kullanır, Genel değişkenleri yoğun olarak kullanır, rötarsız ya da çok iş parçacıklı değildir, vb.
  • Her belirteç için, clang nerede yazıldığı ve nihayetinde bir makroya dahil olmuşsa nereye genişletildiği hakkındaki bilgileri izler. GCC, kaynak kodu ayrıştırırken makro başlatmalarıyla ilgili bilgileri izlemez. Bu, kaynak yeniden yazma araçlarının (örneğin yeniden düzenleme için) makroların (hatta basit) makroların varlığında çalışmasını çok zorlaştırır.
  • Clang, GCC'nin yaptığı gibi ayrıştırdığı için kodu dolaylı olarak basitleştirmez. Bunu yapmak kaynak analiz araçları için birçok soruna neden olur: basit bir örnek olarak, kaynak kodunuza "xx" yazarsanız, GCC AST "x" ifadesini içermeyen "0" içerecektir. 'X' adını değiştirmek isteyen bir yeniden düzenleme aracı için bu son derece kötü.
  • Clang, AST'sini diske seri hale getirebilir ve tüm program analizi için yararlı olan başka bir programa geri okuyabilir. GCC'de buna sahip değil. GCC'nin PCH mekanizması (sadece derleyici hafızası görüntüsünün bir dökümüdür) ilişkilidir, ancak mimari olarak yalnızca dökümü, ürettiği ile tamamen aynı yürütülebilir dosyaya geri okuyabilir (yapısal bir format değildir).
  • Clang çok daha hızlı ve GCC'den çok daha az bellek kullanıyor.
  • Clang, son derece net ve özlü teşhis (hata ve uyarı mesajları) sunmayı amaçlar ve etkileyici teşhis için destek içerir. GCC'nin uyarıları bazen kabul edilebilir, ancak çoğu zaman kafa karıştırıcıdır ve etkileyici tanılamayı desteklemez. Clang ayrıca, makro genişlemelerini ve diğer birçok özelliği gösteren, tanılamalardaki yazım tanımlarını tutarlı bir şekilde korur.
  • Clang, arka kod olarak LLVM kullanımından, ara kod için bir byte kod gösterimi için destek, takılabilir optimize ediciler, bağlantı zamanı optimizasyon desteği, Just-In-Time derlemesi, birden fazla kod üretecinde bağlantı yeteneği, vb. Gibi çeşitli özellikleri devralır. .
  • Clang'ın C ++ desteği birçok yönden GCC'lerden daha uyumludur (örneğin, iki fazlı isim araması gibi).

Gönderen http://www.linuxquestions.org/questions/slackware-14/gcc-vs-llvm-931034/

  • Llvm / clang’ın avantajı modüler tasarımıdır, bu nedenle daha da önem kazanacak olan
    statik kod analiz araçları oluşturmak için arayüzlenebilir ve kullanılabilir ()

Gönderen http://clang.debian.net/

  • clang şimdi üretim için yazılım oluşturmaya hazırdır (C, C ++ veya Objective-C için). Bu derleyici, gcc ile aynı mirasa sahip olmamakla birlikte, gcc paketinden çok daha fazla uyarı ve ilginç hata sunar.

2
Şimdiye kadar en iyi cevap!
Vorac

3
Sadece güncel olmak için: GCC -ftrack-macro-expansion,
4.8'ten

Kaynak ağacı ayrıştırma zamanında basitleştirmeye çalışmakla ilgili başka bir sorun, bir miktar sözdiziminin herhangi bir kod üretmemesi, ancak hangi optimizasyonlara izin verildiğini etkilemesi gereken birçok durum olmasıdır . Her ikisi de ilk sıralarının bir parçası olarak alanı olan farklı yapı tiplerine işaret eden foove mooişaret eden kişiler barise, yazma *&foo->barve okuma *&moo->bar, her iki erişimde de kullanılan tek etkili türün türü olduğu için, okuma yazma ile sonuçlanmalıdır bar. GCC Ancak filtrelemek gibi görünüyor *&ve böylece türlerini percolates foove moo...
SuperCat

... standartta bulabildiğim herhangi bir şey tarafından gerekçelendirilmeyen operatör adresi üzerinden.
supercat,

11

Çok zaman almasının nedeni, üstbilgileri oluşturmak için sağlam bir temel oluşturmak için çok çalışılmasıdır. Mingw-w64, bo gibi görünüyor, Windows'ta sağlam bir pthreads benzeri kütüphane oluşturmak. Bunun üzerine, Windows API'nin yerel iş parçacığına bir bağımlılık getirmekten daha az tersine bir hile var.

mingw-w64 uygular <thread>ve diğer C ++ 11 başlıkları kendi winpthreadskütüphanelerinin üstüne gelir . Bu, hem Mingw-yapılarında hem de rubenvb'nin mingw-w64 takım zincirinin dağıtımlarında test için uygun olmalıdır. Yerel Windows GCC çalışmasının çoğunun nerede yapıldığını izlemek istiyorsanız, mingw-w64 posta listelerini izlemenizi tavsiye ederim.

Qt Project'in şu anki önerilerini ayrıntılandıran bir wiki sayfası ve pencerelerdeki GCC araç zincirinin genel bir görünümü için bu Qt Project wiki sayfasına bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.