เหตุใดอาร์เรย์ความยาวผันแปรจึงเป็นทางเลือกใน C 2011


12

เมื่อ VLA เปิดตัวในปี 1999 ฉันคิดว่ามันเป็นนวัตกรรมที่ยอดเยี่ยมสำหรับภาษา อย่างไรก็ตามหลังจากที่ได้เรียนรู้ว่ามันเป็นตัวเลือกใน C 2011 ฉันสงสัยว่าสิ่งใดที่นำไปสู่การเปลี่ยนแปลงสถานะและถ้ามันหมายความว่าฟีเจอร์นั้นมุ่งไปที่ความล้าสมัย ถ้าเป็นเช่นนั้นมีความคิดเทียบเท่ากับการจัดการอัตโนมัติของข้อมูลที่มีขนาดแบบไดนามิกที่กำลังพิจารณาที่จะแทนที่หรือไม่?

ฉันพยายามค้นหาเอกสารเหตุผล C 2011 แต่ดูเหมือนยังไม่ได้เผยแพร่


ขาดการยอมรับ?
Ryan Reich

@ RyanReich: อาจเป็นไปได้ แต่ทำไมความต้านทานจากผู้ขาย?
jxh

คำตอบ:


8

ฉันเคยได้ยินตำนานที่แตกต่างจาก "ควรเป็นทางเลือกเนื่องจากคอมไพเลอร์ขนาดเล็กบางตัวควรสามารถเข้ากันได้กับ C11 ที่ไม่มี VLA" ถึง "มันเป็นความผิดพลาดตั้งแต่แรก" ฉันไม่เคยได้รับคำตอบที่แน่นอนและชัดเจนสำหรับเรื่องนี้มาก่อน ในที่สุดฉันไม่เชื่อว่าใครก็ตามมีเหตุผลอย่างแท้จริง (สมมติว่า - และหวังว่า - มี) ก็ไม่เคยเปิดเผย (เท่าที่การสืบค้นเก่า ๆ ของฉันดำเนินไป)


จากบทที่ 4 (หน้า 13) ของเหตุผลสำหรับมาตรฐานสากล - ภาษาโปรแกรม - C 5.10 (2003)

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

เน้นการขุด โปรดสังเกตว่าการตัดสินใจครั้งนี้ขัดกับเหตุผลของพวกเขาเอง กระนั้นก็มีอีกเรื่องที่เลือกทำ ตอนนี้คุณจะได้รับ__STDC_NO_VLA__หรือรองรับ VLA มันเป็นการตัดสินใจที่แปลกมาก


@jxh ไม่เห็นด้วยซ้ำ ขอบคุณที่ชี้ให้เห็นมันได้เปลี่ยนเป็นถ้อยคำที่ชัดเจนและคลุมเครือน้อยลง ฉันเคยเห็นแรงจูงใจเป็นคำพ้องความหมายของแรงจูงใจและเป้าหมายในบริบทบางอย่าง แต่ฉันเชื่อว่ามันเป็นเรื่องธรรมดาในสถานการณ์ทางศิลปะเท่านั้น
Bernardo Sulzbach

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

... โปรแกรมจะทำงานร่วมกับการติดตั้งเฉพาะใด ๆ การกำหนดคุณสมบัติเสริมที่หลากหลายและรับประกันว่าการใช้งานที่สามารถรองรับหรือปฏิเสธ (โดยการปฏิเสธการรวบรวม) จะทำให้มีวิธีมาตรฐานที่ง่ายในการทดสอบว่าโปรแกรมที่ระบุความต้องการของมันจะทำงานอย่างถูกต้องบนแพลตฟอร์มหรือไม่: ลอง เพื่อสร้างมัน ถ้ามันสร้างมันจะทำงาน ถ้าไม่อย่างชัดเจนมันจะไม่ การเพิ่มส่วนของโปรแกรมที่มันจะเป็นไปได้ที่จะรับประกันได้ว่าประสบความสำเร็จในการสร้างจะรับประกันการดำเนินงานที่ประสบความสำเร็จ ...
SuperCat

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

4

เท่าที่ฉันสามารถหาได้จากเอกสารของคณะกรรมการสาธารณะ (โดยเฉพาะอย่างยิ่งN1395 ) หนึ่งในเหตุผลสำคัญที่ทำให้ VLA (รวมถึงเลขคณิตและเธรดที่ซับซ้อน) เป็นทางเลือกก็เพื่อให้สามารถสร้างคอมไพเลอร์แบบ C สำหรับโปรเซสเซอร์แบบฝังตัวขนาดเล็ก

แนวโน้มคือผู้จำหน่ายคอมไพเลอร์ที่กำหนดเป้าหมายระบบฝังตัวยังคงอยู่ในมาตรฐาน C90 เนื่องจากมีการเปิดตัวฟีเจอร์ขนาดใหญ่ที่ลูกค้าไม่ต้องการ


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

1
@JerryCoffin: ใช่ แต่รหัสจะถูกสร้างขึ้นเฉพาะเมื่อ sizeof () ถูกใช้จริงในอาร์เรย์ คอมไพเลอร์จำเป็นต้องติดตามข้อมูลเพื่อให้สามารถสร้างรหัสที่ถูกต้องได้ แต่ข้อมูลนั้นไม่จำเป็นต้องฝังลงในหน่วยความจำที่เป็นตัวแทนของ VLA
jxh

2
@jxh: ในตอนแรกการคาดการณ์การใช้งานอิสระและโฮสต์ใช้ภาษาหลักเดียวกัน ความแตกต่างถูก จำกัด ไว้ที่ห้องสมุด ในกรณีของ VLA มีความแตกต่างในภาษาของตัวเอง (อย่างน้อยผู้ขายบางรายรู้สึกว่า) ไม่เหมาะกับระบบฝังตัวที่มีขนาดเล็กลง เท่าที่ฝังขนาดไป: ไม่ก็อาจไม่จำเป็นอย่างแน่นอน แต่อาจเป็นวิธีที่ง่ายที่สุด (เช่นที่เก็บข้อมูลไม่กี่ไบต์สำหรับขนาดอาจหลีกเลี่ยงรหัสไบต์จำนวนมากเพื่อคำนวณ)
Jerry Coffin

1
@supercat: ฉันสามารถดูตรรกะของเชอร์รี่หยิบฟังก์ชั่นห้องสมุด C แต่คุณสมบัติภาษา "ตัวเลือก" ดูเหมือนจะไม่เป็นประโยชน์กับคนที่พยายามเขียนโค้ด C หลายแพลตฟอร์ม มันเคยเป็นสิ่งที่ C เป็นตัวเลือกที่ชัดเจนสำหรับการเขียนโปรแกรมระบบโลหะที่สามารถกำหนดเป้าหมายใหม่ให้กับคอมไพเลอร์และแพลตฟอร์มฮาร์ดแวร์ที่แตกต่างกันได้อย่างง่ายดาย ตอนนี้มันไม่ชัดเจนนัก
jxh

1
@supercat: การทิ้งระเบิดสแต็กนั้นไม่ซ้ำกับ VLA วัตถุอัตโนมัติที่มีขนาดใหญ่ผิดปกติหรือสแตกการเรียกฟังก์ชันที่ไม่ถูก จำกัด จะมีปัญหาที่คล้ายกัน หากมาตรฐานกำหนดวิธีการในการตรวจสอบความล้มเหลวสำหรับกรณีเหล่านั้นก็อาจเป็นไปได้สำหรับ VLA เช่นกัน ในแง่ของตัวเลือกมันแค่ทำให้ยากที่จะโต้แย้งการใช้คุณลักษณะ C ใหม่ในรหัส C ใหม่ในโครงการใหม่ที่จำเป็นต้องทำงานบนหลายแพลตฟอร์มโดยใช้คอมไพเลอร์จากผู้ขายหลายราย
jxh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.