เมื่อใดที่โครงการ C ใหม่ควรตั้งเป้าหมายมาตรฐาน C ที่เก่ามาก (> 20 ปีเช่น C89)


12

บางครั้งฉันเห็นโครงการ C โอเพ่นซอร์สที่สำคัญและค่อนข้างใหม่ซึ่งมีเป้าหมายมาตรฐาน C ที่เก่ามากโดยทั่วไปคือ C89 ตัวอย่างคือ systemd โครงการเหล่านี้มีคนฉลาดอยู่ที่หางเสือดังนั้นพวกเขาอาจมีเหตุผลที่ดีหลังการตัดสินใจครั้งนี้ซึ่งฉันไม่รู้ ประโยชน์ที่ได้จากข้อสงสัยนั้นดูเหมือนว่าเหตุผลก็คือ "เก่ากว่าและมาตรฐานมักพกพาได้ดีกว่าและดีกว่า" ซึ่งไร้สาระเพราะข้อสรุปเชิงตรรกะคือ FORTRAN ดีกว่า C และ COBOL ดีกว่า FORTRAN

เมื่อใดและเพราะเหตุใดโครงการ C ใหม่จึงกำหนดเป้าหมายมาตรฐาน C ที่เก่ามาก

ฉันไม่สามารถจินตนาการถึงสถานการณ์ที่ระบบของผู้ใช้ต้องไม่อัปเดต C คอมไพเลอร์ แต่ไม่สามารถติดตั้งซอฟต์แวร์ใหม่ได้ ตัวอย่างเช่นเวอร์ชัน LTS ของ Debian มีแพ็กเกจ gcc 4.6 ซึ่งรองรับ C99 และ C11 บางส่วน ฉันเดาว่าต้องมีสถานการณ์แปลก ๆ และโปรแกรมเช่น systemd กำลังกำหนดเป้าหมายผู้ใช้เหล่านั้น

ส่วนใหญ่กรณีการใช้งานที่เหมาะสมฉันสามารถจินตนาการเป็นที่ที่ผู้ใช้คาดว่าจะมีสถาปัตยกรรมที่แปลกใหม่ที่มีเพียงเรียบเรียง C89 ใช้ได้ แต่พวกเขาอย่างเต็มที่เต็มใจที่จะติดตั้งซอฟต์แวร์ใหม่ เนื่องจากความหลากหลายของสถาปัตยกรรมชุดการเรียนการสอนลดลงซึ่งดูเหมือนว่าเป็นสถานการณ์สมมุติมากเกินไป แต่ฉันไม่แน่ใจ


10
"ฉันนึกภาพไม่ออกว่าสถานการณ์ใดที่ระบบของผู้ใช้ต้องไม่อัปเดต C คอมไพเลอร์ แต่จะติดตั้งซอฟต์แวร์ใหม่ได้ฟรี" คุณยังทำงานฝังตัวไม่เพียงพอ ;-)
Philip Kendall

2
@PhilipKendall ฉันยังไม่ได้ทำงานฝังตัวใด ๆ ฉันขอแนะนำให้คุณสอนฉันด้วยคำตอบ!
Praxeolitic

2
เมื่อมีการสร้างมาตรฐานแล้วมันจะคงอยู่ตลอดไป บางครั้งนานกว่า 2000 ปี
Doc Brown

1
@DocBrown แต่โปรดทราบว่าหน้านั้นอธิบายว่าการอ้างสิทธิ์นี้เป็นมาตรฐาน 2000 ปีนั้นเป็นเท็จ
Jesper

1
เมื่อคุณเห็นอะไรเช่นนี้คำถามแรกที่คุณควรถามคือ "มีแพลตฟอร์มใดที่ต้องการกำหนดเป้าหมาย" ตามด้วย "รุ่นใดของ C ที่สามารถรวบรวมได้บน / สำหรับแพลตฟอร์มดังกล่าว )?" จากนั้นมา "เวอร์ชัน C ใดที่มีความเข้ากันได้มากที่สุดกับข้อกำหนดของโครงการ" และต่อไปอาจจะเป็น "รุ่น C ส่วนใหญ่ของโครงการใดที่คุ้นเคยมากที่สุด"
Justin Time - Reinstate Monica

คำตอบ:


14

... "รุ่นเก่าและมาตรฐานมักพกพาสะดวกและดีกว่า" ซึ่งไร้สาระ ...

คำสั่งนั้นถึงไร้สาระเมื่อมันได้ดีขึ้นซึ่งเป็นอัตนัยอย่างสมบูรณ์ คุณไม่ได้เลือกภาษาและมาตรฐานสำหรับโปรเจคเนื่องจากคนครึ่งหนึ่งในการพบปะครั้งสุดท้ายที่คุณเคยใช้ คุณเลือกเพราะคุณได้ศึกษาและทำความเข้าใจกับปัญหาที่คุณแก้ไขและพิจารณาว่าเป็นเครื่องมือที่เหมาะสมสำหรับงาน

สำหรับมาตรฐานโดยทั่วไปมีกรณีที่ต้องทำในบางโครงการเพื่อความสะดวกในการพกพาและนั่นคือสิ่งที่การเลือกรุ่นที่เก่ากว่านั้นมีประโยชน์บางอย่าง นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งเมื่อคุณพัฒนาห้องสมุดเป็นผลิตภัณฑ์ซึ่งมีความหมายต่อการสิ้นสุดของคนอื่น สิ่งสุดท้ายที่คุณต้องการทำคือเขียนสิ่งที่คุณไม่สามารถขายได้เพราะต้องการคอมไพเลอร์ที่ลูกค้าที่คุณยังไม่เคยเจออาจยังไม่พร้อมใช้งาน ความคิดเห็นของฟิลิปเคนดอลเกี่ยวกับโลกที่ฝังอยู่นั้นเป็นจุดสนใจ มีหลายสิ่งที่เกิดขึ้นเพราะคนยังต้องเขียนโค้ดใหม่สำหรับแพลตฟอร์มเก่าที่เสถียรหรือที่ไม่ได้รับประโยชน์จากคุณสมบัติพิเศษและไม่ได้รับคอมไพเลอร์ที่ทันสมัย เมื่อคุณสามารถควบคุมทุกแง่มุมของโครงการได้อย่างสมบูรณ์

สำหรับ C โดยเฉพาะมีคำถามว่าคุณได้รับอะไรบ้างเพื่อแลกกับการยึดมั่นในมาตรฐานล่าสุด การเปลี่ยน K & R-to-C89 เป็นการเปลี่ยนแปลงครั้งใหญ่ที่ต้องใช้ความพยายามอย่างมากในการล้างรหัสเก่า แต่ในที่สุดก็ทำได้ดีมาก การเปลี่ยนแปลงใน C99และC11มีการเปรียบเทียบน้อยและการพบ CI ส่วนใหญ่ที่พัฒนาล่าสุดจะยังคงผ่าน C89 เพราะไม่ได้ใช้คุณสมบัติใหม่ เป็นการยากที่จะยืนยันว่าการมอบอำนาจให้ C99 เหนือ C89 นั้นเป็นสิ่งที่ถูกต้องเพราะสนับสนุนความคิดเห็นหนึ่งบรรทัดมีประเภทข้อมูลบูลีนดั้งเดิมและสามารถทำอาร์เรย์ที่มีความยาวผันแปรได้ ความคิดเห็นและ Booleans มีวิธีแก้ไขปัญหาที่ไม่น่าเกลียดและ VLAs สามารถจัดการในวิธีอื่น ๆ ที่มีประสิทธิภาพน้อยกว่าเล็กน้อย C11 ลดระดับ VLA ไปเป็นทางเลือกและนั่นอาจเป็นเหตุผลที่เลือก C99 ที่เก่ากว่าหากพวกเขาคิดอย่างชัดเจนในการใช้งานของคุณ


3
การผสมการประกาศตัวแปรและข้อความต่าง ๆ ค่อนข้างดีสำหรับความเข้าใจ ฟังก์ชั่นแบบอินไลน์สนับสนุนยูนิโค้ด จำกัด และlong longยังดีที่มี
Deduplicator

นอกจากนี้บางครั้งการมัลติเธรดก็ดีที่มี ...
Deduplicator

@Dupuplicator ฉันไม่เห็นด้วยกับสิ่งที่อยู่ใน C99 และ C11 คือการปรับปรุง คุณสามารถเขียน C11 ทั้งหมดที่คุณต้องการหากคุณสามารถสร้างเคสธุรกิจสำหรับค่าของนิสัยดีที่เกินความสามารถในการพกพาไปยังสภาพแวดล้อมแบบเก่า ไฟล์ที่อยู่ภายใต้ "ศึกษาปัญหาและค้นหาเครื่องมือที่เหมาะสมสำหรับงาน"
Blrfl

2
ประเด็นก็คือคุณไม่ได้พูดถึงการปรับปรุงที่สำคัญ
Deduplicator

@Deduplicator: ฉันกำลังเขียนโค้ดหลายเธรดในปี 1990 รหัสที่อาศัยคุณสมบัติการทำเกลียวในภาษาอาจใช้ไม่ได้กับการใช้งานอิสระที่ไม่สามารถรองรับทุกสิ่งที่ต้องการตามมาตรฐานในขณะที่ผู้ที่ใช้ไลบรารีเพื่อห่อฟังก์ชั่นแพลตฟอร์มที่รองรับฟังก์ชั่นที่ต้องการจะสามารถปรับใช้กับแพลตฟอร์มใด ๆ .
supercat

10

เมื่อการพกพาข้ามแพลตฟอร์มที่หลากหลายเป็นสิ่งสำคัญ ซึ่งอาจรวมถึงแพลตฟอร์มที่ล้าสมัยและตัวประมวลผลแบบฝังหลายตัวที่มีคอมไพเลอร์แบบมินิมัลลิสต์ให้บริการเท่านั้น

นอกจากนี้ยังมีความรู้สึกที่ C89 เป็น "ตัวหารร่วมที่ต่ำที่สุด" มันเป็นรุ่นมาตรฐานที่ถูกต้องเป็นครั้งแรกและคอมไพเลอร์ที่ใช้อยู่ในปัจจุบันสามารถสันนิษฐานได้ว่าจะใช้ C89 บางส่วน

นอกจากนี้ยังมีปัญหาที่ Microsoft Visual C ++ ในขณะที่มันค่อนข้างดีในการรักษาตามมาตรฐาน C ++ ติดอยู่ที่ C89 เป็นเวลานานเมื่ออยู่ในโหมด C ดังนั้นทุกคนที่ไม่ได้ใช้ Visual Studio ล่าสุดอาจถูก จำกัด ไว้ที่ C89


ใช่ข้อโต้แย้งที่เห็นได้ชัดคือความสะดวกในการพกพา แต่คำถามก็คือหากมีระบบที่ไม่ใช่สมมุติฐานซึ่งสามารถใช้คอมไพเลอร์ C89 เท่านั้น แต่กำลังรวบรวมการกระจายตัวของซอฟต์แวร์ใหม่ เช่นถ้าฉันเริ่มโครงการ C ใหม่ฉันจะตัดสินใจได้อย่างไรว่าการปฏิบัติตาม C89 สามารถเพิ่มจำนวนผู้ใช้ที่มีศักยภาพได้อย่างไร จุด MSVC นั้นดี
Praxeolitic

1
@Praxeolitic เป็นคำถามจริง ๆ ว่าคุณกำลังสร้างรหัสที่จะใช้คนหลากหลายแบบหรือไม่ เพราะจะมีคนจำนวนมากออกมาใช้คอมไพเลอร์ตัวเก่าเพราะพวกเขาไม่สามารถอัพเกรดได้หรือเพราะพวกเขาคิดว่ามันมีความเสี่ยงและความพยายามในการอัพเกรดมากเกินไป
Simon B

3

ฉันต้องยอมรับว่าฉันยังคงเขียนโค้ดหลอก -89 (ไม่ตรงตามมาตรฐาน C99 ทั้งหมด) ส่วนใหญ่เป็นเพราะ Microsoft ฉันพึ่งพา MSVC อย่างมากสำหรับฝั่ง Windows และพวกเขายังไม่ได้มาตรฐาน C99 อย่างสมบูรณ์แทนที่จะวางโฟกัสจำนวนมากใน C ++ 17 ขึ้นไป

นอกจากนี้ฉันกำลังทำงานกับ C SDKs ซึ่งนักพัฒนาปลั๊กอินจำนวนมากใช้ MSVC สำหรับการพัฒนาปลั๊กอินและบางส่วนยังคงเป็น MSVC 2010 ดังนั้นยังมีคอมไพเลอร์ยอดนิยมที่ใช้กันอย่างแพร่หลายบนแพลตฟอร์มที่ไม่แปลกใหม่ (เว้นแต่คุณจะพิจารณา Windows แปลกใหม่) ที่ยังไม่ได้ติดตั้ง C99 อย่างสมบูรณ์ เมื่อคุณกำหนดเป้าหมายความเข้ากันได้อย่างกว้าง ๆ กับคอมไพเลอร์ที่ใหญ่ที่สุด (ซึ่งเป็นหนึ่งในเหตุผลหลักที่ SDK เขียนใน C และไม่ใช่ C ++) ยังคงมีการใช้งานกันอย่างแพร่หลาย (อย่างน้อย MSVC) ซึ่งล้าหลัง เมื่อมันมาถึงการสนับสนุน C เกือบสองทศวรรษแล้วตั้งแต่ C99 และเรายังไม่มี VLA เช่นใน MSVC AFAIK (ยังไม่ได้ตรวจสอบใน MSVC 2017 แต่ด้วยท่าทางของ Microsoft ใน C ฉันสงสัยว่ามันสอดคล้องกับ C99 มากขึ้น) .

น่าเสียดายที่มีคอมไพเลอร์ตัวใหม่ที่ค่อนข้างดีกับตัวเพิ่มประสิทธิภาพและตัวดีบั๊กที่ยังไม่เข้ากับ C99 แน่นอนถ้าไม่ใช่สำหรับสิ่งนี้ฉันจะกระโดดข้าม C11

นอกจากความเข้ากันได้ของแหล่งที่มากับปลั๊กอินและ MSVC แล้วยังมีการทำงานร่วมกันกับภาษาอื่น ๆ ภาษาอื่นบางภาษาใช้ SDK ผ่าน FFI และ FFIs บางรายการนั้นเข้าใจ C89 เท่านั้น พวกเขาอาจจะไม่เข้าใจboolหรือ_Boolเป็นตัวอย่างง่ายๆเมื่อนำเข้าจากฟังก์ชั่น dylib intและมีเพียงเข้าใจพูด

ใช่ข้อโต้แย้งที่เห็นได้ชัดคือความสะดวกในการพกพา แต่คำถามก็คือถ้ามีระบบที่ไม่ใช่สมมุติฐานซึ่งสามารถใช้คอมไพเลอร์ C89 เท่านั้น แต่กำลังรวบรวมการกระจายตัวของซอฟต์แวร์ใหม่ เช่นถ้าฉันเริ่มโครงการ C ใหม่ฉันจะตัดสินใจได้อย่างไรว่าการปฏิบัติตาม C89 สามารถเพิ่มจำนวนผู้ใช้ที่มีศักยภาพได้อย่างไร

เพิ่งสังเกตเห็นสิ่งนี้ แต่ชนิดของการสะท้อนBlrflการเพิ่มผลิตภาพโดยใช้ C99 และ C11 ไม่ใหญ่หลวงในกรณีของฉันในขณะที่สูญเสียความสามารถในการอนุญาตให้ผู้คนเขียนปลั๊กอินของพวกเขาใน MSVC อาจมีค่าใช้จ่ายสูงมาก บนมีส่วนแบ่งการตลาดที่ใหญ่ที่สุดโดยทางด้าน Windows และผู้ใช้โดยเฉลี่ยมักจะซื้อและดาวน์โหลดปลั๊กอินบุคคลที่สามจำนวนมาก) ผลิตภัณฑ์ที่ฉันทำงานอยู่เกือบครึ่งทางระหว่างสภาพแวดล้อมการพัฒนาสำหรับโปรแกรมเมอร์ / สแครปเตอร์และผลิตภัณฑ์ผู้ใช้สำหรับศิลปินเนื่องจากผู้คนจำนวนมากต้องการที่จะพัฒนาสิ่งใหม่ ๆ เพื่อให้ความสามารถใหม่และบรรลุผลพิเศษของ คนใจดียังไม่เห็น ดังนั้นในกรณีของฉันมันค่อนข้างง่ายที่จะตัดสินใจเลือก C89 อย่างน้อยสำหรับ SDK

ฉันคิดว่าคุณต้องดูคอมไพเลอร์รอบ ๆ ตัวคุณและพยายามหากลุ่มประชากรเป้าหมายของคุณ หากคุณไม่ได้พัฒนาสถาปัตยกรรมปลั๊กอินสำหรับ Windows หรือทำการเขียนโปรแกรมแบบฝังตัวใด ๆ หรือพยายามสร้างชุดพัฒนาซอฟต์แวร์ที่สามารถใช้งานได้โดยคอมไพเลอร์และภาษาที่หลากหลายที่สุดนั่นก็จะทำให้เข้าถึง C99 + ได้ง่ายขึ้นแน่นอน ไป นอกจากนี้ยังอาจพิจารณาจำนวนการเพิ่มประสิทธิภาพที่คุณได้รับในรูปแบบ C99 เป็นต้นไป ฉันไม่ได้รับประโยชน์อะไรมากมายจากสิ่งต่าง ๆ เช่น VLAs เนื่องจากฉันใช้วิธีที่ง่ายพอในการใช้สแต็กเมื่อข้อมูลเหมาะสมและเป็นอย่างอื่น

แต่มีหลายสิ่งหลายอย่างที่ล้าหลังจากคอมไพเลอร์ยอดนิยมเช่น MSVC ถึง FFI ในภาษาอื่นซึ่งมีความเท่ห์ในแง่ที่ว่าพวกเขาสามารถนำเข้าและเรียกใช้ฟังก์ชั่น C โดยตรงจาก dylib แต่อาจเป็นบิตอยู่เบื้องหลัง ครั้ง ดังนั้นจึงมีสิ่งที่ต้องพิจารณาในเชิงธุรกิจขึ้นอยู่กับโดเมนของคุณมากกว่าแค่ให้ความแก่กว่าและเป็นมาตรฐานสำหรับสุนทรียศาสตร์บางประเภท

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