GCC กำลังจะตายโดยไม่มีเธรดรองรับบน Windows หรือไม่ [ปิด]


31

ฉันต้องการความคิดเห็น GCC เป็นคอมไพเลอร์ที่ดีอยู่เสมอ ฉันเพิ่งพบว่าบน Windows GCC ไม่มีstd::threadการสนับสนุนบังคับให้ผู้ใช้ Windows ใช้คอมไพเลอร์อื่นเพราะคุณสมบัติที่น่าตื่นเต้นที่สุดยังคงหายไป

แต่ทำไม GCC ถึงยังไม่มีการรองรับเธรดใน Windows ปัญหาใบอนุญาต? ABI เข้ากันไม่ได้? (มีห้องสมุดข้ามแพลตฟอร์มหลายแห่งที่ใช้มัลติเธรด: บูสต์, POCO, SDL, wxwidgets เป็นต้นมันไม่ง่ายเลยที่จะใช้ที่มีอยู่แล้วและ MIT / libpng ที่ได้รับอนุญาตรหัสเพื่อให้พอดีกับหลุมนี้แทนที่จะส่ง GCC ไม่มีการสนับสนุนเธรด?)

เมื่อเร็ว ๆ นี้เมื่อดูการเปรียบเทียบคอมไพเลอร์ GCC มีการรองรับคุณสมบัติ C ++ 11 ที่กว้างที่สุดในส่วนที่เกี่ยวกับคอมไพเลอร์อื่น ๆ ยกเว้นความจริงที่ว่าใน Windows นี้ไม่เป็นความจริงเพราะเรายังขาดอะตอมมิก mutexes และเธรด:

ฉันต้องการทราบเพิ่มเติมเกี่ยวกับหัวข้อนี้ แต่สิ่งเดียวที่ฉันสามารถหาได้คือคนที่ขอความช่วยเหลือเพราะ:

"thread" ไม่มีอยู่ใน std namespace

ดูการติดตามตั๋วและการสนทนาทางไปรษณีย์ของ GCC / TDM-GCC มีการร้องขอการสนับสนุนเธรดตั้งแต่ปี 2009 เป็นไปได้ไหมว่าหลังจาก 4 ปียังไม่มีวิธีแก้ปัญหา? เกิดอะไรขึ้นจริงเหรอ?


8
gcc ยังดีอยู่ไม่ว่าคุณจะพบอะไรเมื่อเร็ว ๆ นี้
ott--

1
ฉันชอบ std :: thread นั่นไม่ใช่คุณสมบัติที่ยากที่จะนำมาใช้ เพียงแค่ใช้เทมเพลต variadics และตัวอย่างเช่นเธรด SDL และคุณสามารถสร้างคลาสที่เทียบเท่ากับ std :: thread: /
GameDeveloper

12
ฉันเกือบจะเถียงกันว่าการที่โปรแกรมเมอร์ไม่สามารถเขียนแอพแบบมัลติเธรดที่เชื่อถือได้โดยที่ไม่มีการสนับสนุนเธรดเป็นโบนัส .....
mattnz

3
คุณกำลังบ่นเกี่ยวกับ libaries ไม่ใช่เฉพาะคอมไพเลอร์
wirrbel

2
GCC เป็นที่นิยมนั่นคือความจริง แต่ฉันจะไม่บอกว่ามันเป็น "คอมไพเลอร์ที่ดีเสมอ" สมัยก่อนผู้คนกำลังทดลองกับ ICC บนลีนุกซ์เนื่องจากไบนารีที่ช้าและอ้วนซึ่ง GCC สร้างขึ้น OTOH โครงการโอเพ่นซอร์สรายใหญ่ทั้งหมดใช้ VS เพื่อรวบรวมรหัส Windows ของพวกเขาอีกครั้งเนื่องจาก GCC สร้างการขยายตัวช้าในการเปรียบเทียบ
vartec

คำตอบ:


23

ฉันเข้าใจว่า GCC ไม่ได้รับความนิยมเพราะคนที่รักษามันค่อนข้างหยิ่งและตอนนี้ LLVM อยู่ที่นี่ (และดีมาก) ผู้คนโหวตด้วยเท้า

Slashdot มีการอภิปรายเกี่ยวกับการสนับสนุนใหม่ LLVM สำหรับ C _merlinพูดว่า:

โอ้ฉันไม่คิดว่าจะมีใครคิดว่ามันชั่วร้ายเพียงเพราะมันเป็นผลประโยชน์ส่วนตัวที่บริสุทธิ์มากกว่าความเอื้ออาทร ความนิยมในปรากฏการณ์ของ GCC ทำให้ผู้ดูแลระบบเติบโตอย่างมหาศาลและทำตัวเหมือนทั้งหมด [ * *** ] มีการแนะนำบั๊กเร็วกว่า Red Hat และ Apple สามารถรับ patch สำหรับพวกเขาได้รับการยอมรับและพวกเขามีนิสัยที่น่ารังเกียจที่จะไม่ดูรายงานบั๊กจากนั้นจึงปิดพวกมันเนื่องจากไม่มีการใช้งาน

สิ่งที่คุณสังเกตเห็นเกี่ยวกับความล่าช้า 4 ปี


คุณอาจพบDevelopers.slashdot.org/ (โดย _merlin) เพื่อชี้ปัญหาอื่น ๆ ด้วยการคอมไพล์สำหรับ non-linux ด้วย gcc

3
ไม่ใช่แค่ LLVM, Visual Studio Express Editions เป็นทางเลือกที่ทำงานได้ฟรีอีกทางหนึ่ง (พิจารณาคำถามเกี่ยวstd::threadกับ Windows ซึ่งได้รับการสนับสนุนใน VS2012 EE)
MSalters

1
VS2012 เลวร้ายเกินไปไม่ได้มีการสนับสนุนอย่างเต็มที่สำหรับมาตรฐาน :: ด้าย (เช่นไม่มีthread_localตัวแปร)
alrikai

สิ่งนี้เปลี่ยนไปในยุคปัจจุบันหรือไม่?
Hashim

29

ความนิยมและการใช้งานของ GCC นั้นไม่น่าสงสัย

จาก https://stackoverflow.com/questions/12210102/does-gcc-4-7-1-support-threads mingw build ที่http://code.google.com/p/mingw-builds/downloads/list รองรับชุดข้อความ .

แต่การพิจารณาที่สำคัญคือใบอนุญาต

FreeBSD มีความสัมพันธ์ที่ไม่สบายใจกับ GPL ผู้สนับสนุนใบอนุญาต BSD เชื่อว่าซอฟต์แวร์ที่แท้จริงฟรีไม่มีข้อ จำกัด การใช้งาน ผู้สนับสนุนของ GPL เชื่อว่าข้อ จำกัด มีความจำเป็นเพื่อปกป้องเสรีภาพของซอฟต์แวร์และโดยเฉพาะอย่างยิ่งความสามารถในการสร้างซอฟต์แวร์ที่ไม่ใช่ฟรีจากซอฟต์แวร์เสรีนั้นเป็นรูปแบบพลังงานที่ไม่ยุติธรรมแทนที่จะเป็นอิสระ โครงการ FreeBSD ที่เป็นไปได้พยายามหลีกเลี่ยงการใช้ GPL (สำหรับรายละเอียด https://unix.stackexchange.com/questions/49906/why-is-freebsd-deprecating-gcc-in-favor-of-clang-) llvm )

ข้อควรพิจารณาที่สำคัญอื่น ๆ

จากhttp://clang.llvm.org/comparison.html#gcc

  • Clang AST และการออกแบบนั้นมีวัตถุประสงค์เพื่อให้เข้าใจได้ง่ายโดยทุกคนที่คุ้นเคยกับภาษาที่เกี่ยวข้องและผู้ที่มีความเข้าใจพื้นฐานว่าคอมไพเลอร์ทำงานอย่างไร GCC มี codebase ที่เก่ามากซึ่งนำเสนอช่วงการเรียนรู้ที่สูงชันแก่นักพัฒนาใหม่
  • เสียงดังกราวถูกออกแบบมาเป็น API จากจุดเริ่มต้นของมันช่วยให้มันสามารถนำมาใช้ใหม่โดยเครื่องมือการวิเคราะห์แหล่งที่มาการปรับโครงสร้าง IDEs (ฯลฯ ) รวมทั้งการสร้างรหัส GCC ถูกสร้างขึ้นเป็นคอมไพเลอร์สแตติกเสาหินซึ่งทำให้ยากมากที่จะใช้เป็น API และรวมเข้ากับเครื่องมืออื่น ๆ นอกจากนี้การออกแบบในอดีตและนโยบายปัจจุบันทำให้ยากต่อการแยกส่วนหน้าจากส่วนที่เหลือของคอมไพเลอร์
  • การตัดสินใจออกแบบ GCC ต่างๆทำให้ยากต่อการนำกลับมาใช้ใหม่: ระบบการสร้างของมันยากที่จะแก้ไขคุณไม่สามารถเชื่อมโยงหลาย ๆ เป้าหมายกับหนึ่งไบนารี่ได้ แต่คุณไม่สามารถเชื่อมโยงหลาย ๆ หน้าเข้ากับหนึ่งไบนารี่ได้ ใช้ตัวแปรทั่วโลกอย่างกว้างขวางไม่ใช่ reentrant หรือหลายเธรด ฯลฯ เสียงดังกราวไม่มีปัญหาเหล่านี้
  • สำหรับทุกโทเค็นเสียงดังกราวจะติดตามข้อมูลเกี่ยวกับตำแหน่งที่มันถูกเขียนและที่ที่มันถูกขยายเข้าไปในท้ายที่สุด GCC ไม่ติดตามข้อมูลเกี่ยวกับการสร้างอินสแตนซ์ของแมโครเมื่อแยกวิเคราะห์ซอร์สโค้ด สิ่งนี้ทำให้เป็นเรื่องยากมากสำหรับเครื่องมือการเขียนซอร์สใหม่ (เช่นสำหรับการปรับโครงสร้างใหม่) เพื่อทำงานต่อหน้าแมโคร (แม้แต่ง่าย)
  • เสียงดังกังวานไม่ได้ทำให้รหัสง่ายขึ้นโดยง่ายเพราะมันแยกวิเคราะห์เหมือนกับ GCC การทำเช่นนี้ทำให้เกิดปัญหามากมายสำหรับเครื่องมือวิเคราะห์แหล่งที่มา: เป็นตัวอย่างง่ายๆอย่างหนึ่งถ้าคุณเขียน "xx" ในซอร์สโค้ดของคุณ GCC AST จะมี "0" โดยไม่มีการกล่าวถึง 'x' สิ่งนี้ไม่ดีอย่างยิ่งสำหรับเครื่องมือการเปลี่ยนโครงสร้างที่ต้องการเปลี่ยนชื่อ 'x'
  • เสียงดังกังวานสามารถเรียงลำดับ AST ออกไปยังดิสก์และอ่านกลับเข้าไปในโปรแกรมอื่นซึ่งเป็นประโยชน์สำหรับการวิเคราะห์โปรแกรมทั้งหมด GCC ไม่มีสิ่งนี้ กลไก PCH ของ GCC (ซึ่งเป็นเพียงดัมพ์ของอิมเมจหน่วยความจำคอมไพเลอร์) นั้นมีความสัมพันธ์กัน แต่เป็นสถาปัตยกรรมที่สามารถอ่านดัมพ์กลับไปสู่การปฏิบัติการที่แน่นอนเหมือนกับที่สร้างขึ้นมา (ไม่ใช่รูปแบบที่มีโครงสร้าง)
  • เสียงดังกราวนั้นเร็วกว่ามากและใช้หน่วยความจำน้อยกว่า GCC
  • เสียงดังกราวมีวัตถุประสงค์เพื่อให้การวินิจฉัยที่ชัดเจนและรัดกุมมาก (ข้อผิดพลาดและข้อความเตือน) และรวมถึงการสนับสนุนสำหรับการวินิจฉัยที่แสดงออก คำเตือนของ GCC บางครั้งเป็นที่ยอมรับได้ แต่มักทำให้เกิดความสับสนและไม่สนับสนุนการวินิจฉัยที่ชัดเจน เสียงดังกังวานยังคงรักษา typedefs ในการวินิจฉัยอย่างต่อเนื่องแสดงการขยายมาโครและคุณสมบัติอื่น ๆ อีกมากมาย
  • เสียงดังกังวานสืบทอดคุณสมบัติหลายประการจากการใช้ LLVM เป็นแบ็คเอนด์รวมถึงการสนับสนุนการเป็นตัวแทน bytecode สำหรับรหัสกลาง, เครื่องมือเพิ่มประสิทธิภาพแบบเสียบได้, การสนับสนุนการเพิ่มประสิทธิภาพเวลาเชื่อมโยง, การคอมไพล์ Just-In-Time, ความสามารถในการเชื่อมโยง .
  • การสนับสนุนของ Clang สำหรับ C ++ นั้นสอดคล้องกับมาตรฐานมากกว่า GCC ในหลาย ๆ ด้าน (เช่นเป็นไปตามการค้นหาชื่อสองเฟส)

จาก http://www.linuxquestions.org/questions/slackware-14/gcc-vs-llvm-931034/

  • ข้อได้เปรียบของ llvm / clang คือการออกแบบแบบแยกส่วนดังนั้นจึงสามารถ
    เชื่อมต่อและใช้เป็นตัวอย่างในการสร้างเครื่องมือวิเคราะห์รหัสแบบคงที่สิ่งที่มีความสำคัญมากขึ้นเรื่อย ๆ ()

จากhttp://clang.debian.net/

  • clang พร้อมที่จะสร้างซอฟต์แวร์สำหรับการผลิตแล้ว (สำหรับ C, C ++ หรือ Objective-C) คอมไพเลอร์นี้ให้คำเตือนและข้อผิดพลาดที่น่าสนใจมากกว่า gcc suite ในขณะที่ไม่ได้รับมรดกเช่นเดียวกับ gcc

2
คำตอบที่ดีที่สุด!
Vorac

3
เพิ่งจะเป็นปัจจุบัน: GCC ติดตามการขยายตัวของมาโครตั้งแต่ 4.8 ด้วยตัวเลือก-ftrack-macro-expansionตอนนี้เปิดใช้งานตามค่าเริ่มต้นแล้ว :)
Morwenn

ปัญหาอีกประการหนึ่งกับการพยายามทำให้แผนภูมิแหล่งที่มาง่ายขึ้นในเวลาการแยกวิเคราะห์คือมีหลายสถานการณ์ที่บิตของไวยากรณ์ไม่ควรสร้างรหัสใด ๆแต่ควรมีผลต่อการเพิ่มประสิทธิภาพที่ได้รับอนุญาต ถ้าfooและmooเป็นตัวชี้ประเภทโครงสร้างที่แตกต่างกันซึ่งทั้งสองมีข้อมูลbarเป็นส่วนหนึ่งของลำดับแรกของพวกเขาในการเขียน*&foo->barและการอ่านควรจะส่งผลในการอ่านเขียนที่ได้เห็นตั้งแต่ชนิดที่มีประสิทธิภาพเท่านั้นที่ใช้ในการเข้าถึงอย่างใดอย่างหนึ่งคือประเภทของ*&moo->bar barอย่างไรก็ตาม GCC ดูเหมือนว่าจะกรองออก*&และทำให้ประเภทของfooและpercolates moo...
supercat

... ผ่านทาง address-of operator ซึ่งไม่ได้เป็นสิ่งที่ชอบธรรมที่ฉันสามารถหาได้ใน Standard
supercat

11

เหตุผลที่ต้องใช้เวลามากเพราะมันต้องใช้เวลามากในการสร้างรากฐานที่แข็งแกร่งในการสร้างส่วนหัว ดูเหมือนว่า mingw-w64 จะทำคือการสร้างไลบรารี่ที่เหมือน pthreads บน Windows มีความไม่พอใจอัปสตรีมน้อยกว่าการแนะนำการพึ่งพาการทำเธรดดั้งเดิมของ Windows API

mingw-w64 ดำเนินการ<thread>และส่วนหัว C ++ 11 อื่น ๆ ที่ด้านบนของwinpthreadsห้องสมุดของพวกเขาเอง สิ่งนี้ควรจะพร้อมใช้งานสำหรับการทดสอบในทั้งการกระจายของ Mingw-builds และ rubenvb ของ tooling mingw-w64 ฉันอยากจะแนะนำต่อไปนี้รายชื่อผู้รับจดหมาย mingw-w64 หากคุณต้องการติดตามว่างานส่วนใหญ่ในงาน Windows GCC แบบดั้งเดิมเสร็จสิ้นแล้ว

โครงการ Qt มีหน้าวิกิพีเดียรายละเอียดคำแนะนำปัจจุบันของพวกเขาและมองเห็นวิวของ toolchains GCC หน้าต่างดูหน้านี้วิกิพีเดีย Qt โครงการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.