การแก้ไขทั่วโลก: พวกขอโทษฉันหมดกำลังใจและเขียนเรื่องไร้สาระมากมาย แค่พูดจาโผงผางแก่คนแก่
ฉันอยากจะเชื่อว่า C นั้นไม่ได้รับการยกเว้น แต่อนิจจาตั้งแต่ C11 มันถูกนำมาเทียบกับ C ++ เห็นได้ชัดว่าการรู้ว่าคอมไพเลอร์จะทำอย่างไรกับผลข้างเคียงในการแสดงออกตอนนี้ต้องแก้ปริศนาคณิตศาสตร์เล็ก ๆ น้อย ๆ ที่เกี่ยวข้องกับการเรียงลำดับของรหัสบางส่วนบนพื้นฐานของ "ตั้งอยู่ก่อนจุดประสาน"
ฉันบังเอิญได้ออกแบบและติดตั้งระบบฝังตัวตามเวลาจริงที่สำคัญสองสามวันในช่วง K&R (รวมถึงตัวควบคุมของรถยนต์ไฟฟ้าที่สามารถส่งคนชนเข้ามาในกำแพงที่ใกล้ที่สุดหากเครื่องยนต์ไม่ได้ถูกเก็บไว้ในอุตสาหกรรม 10 ตัน หุ่นยนต์ที่สามารถสควอชคนไปที่เยื่อกระดาษหากไม่ได้รับคำสั่งอย่างถูกต้องและชั้นของระบบที่ไม่เป็นอันตรายจะมีโปรเซสเซอร์จำนวนไม่กี่โหลที่ดูดบัสข้อมูลของพวกเขาให้แห้งด้วยค่าใช้จ่ายระบบน้อยกว่า 1%)
ฉันอาจแก่เกินไปหรือโง่เกินกว่าที่จะรับความแตกต่างระหว่างที่ไม่ได้กำหนดและไม่ได้ระบุ แต่ฉันคิดว่าฉันยังคงมีความคิดที่ดีเกี่ยวกับการดำเนินการพร้อมกันและการเข้าถึงข้อมูล จากความเห็นที่ได้รับการบอกกล่าวของฉันการครอบงำจิตใจของ C ++ และตอนนี้พวก C กับภาษาสัตว์เลี้ยงของพวกเขาในการแก้ไขปัญหาการซิงโครไนซ์เป็นความฝันที่มีค่าใช้จ่ายสูง ไม่ว่าคุณจะรู้ว่าการดำเนินการพร้อมกันคืออะไรและคุณไม่ต้องการกิซโมเหล่านี้หรือคุณไม่ต้องการและคุณจะทำสิ่งต่าง ๆ บนโลกใบนี้โดยไม่พยายามยุ่งกับมัน
รถบรรทุกที่บรรทุกสิ่งกีดขวางหน่วยความจำที่สะดุดตาทั้งหมดนี้เกิดจากข้อ จำกัด ชั่วคราวของระบบแคชมัลติซีพียูซึ่งทั้งหมดนี้สามารถห่อหุ้มอย่างปลอดภัยในวัตถุซิงโครไนซ์ระบบปฏิบัติการทั่วไปเช่นอินเท็กซ์ mutexes และตัวแปรเงื่อนไข C ++ ข้อเสนอ
ค่าใช้จ่ายในการห่อหุ้มนี้เป็นเพียงการลดลงของประสิทธิภาพหนึ่งนาทีเมื่อเทียบกับสิ่งที่การใช้คำสั่ง CPU เฉพาะที่ละเอียดยิ่งขึ้นสามารถบรรลุผลได้ในบางกรณี คำหลัก (หรือ
volatile
#pragma dont-mess-with-that-variable
สำหรับฉันในฐานะโปรแกรมเมอร์ระบบการดูแล) น่าจะเพียงพอที่จะบอกคอมไพเลอร์ให้หยุดการสั่งการเข้าถึงหน่วยความจำใหม่ รหัสที่เหมาะสมสามารถผลิตได้อย่างง่ายดายด้วย direct asm directives เพื่อโรยไดรเวอร์ระดับต่ำและรหัส OS พร้อมคำแนะนำเฉพาะ ad hoc CPU หากไม่มีความรู้อย่างลึกซึ้งเกี่ยวกับวิธีการทำงานของฮาร์ดแวร์พื้นฐาน (ระบบแคชหรืออินเตอร์เฟสบัส) คุณจะต้องเขียนโค้ดที่ไร้ประโยชน์ไม่มีประสิทธิภาพหรือผิดพลาดอยู่ดี
การปรับvolatile
คำหลักและบ๊อบหนึ่งนาทีเป็นทุกคน แต่ลุงของโปรแกรมเมอร์ระดับต่ำที่ผ่านการฝึกหัดยากที่สุด แทนที่จะเป็นเช่นนั้นกลุ่มปรกติของ C ++ maths ก็มีการออกแบบวันภาคสนาม แต่ก็ยังมีสิ่งที่เป็นนามธรรมที่เข้าใจยากอีกทั้งยังมีแนวโน้มในการแก้ปัญหาการออกแบบโดยมองหาปัญหาที่ไม่มีอยู่จริง
เฉพาะเวลานี้การเปลี่ยนแปลงที่จำเป็นในการกำหนดแง่มุมพื้นฐานของ C เช่นกันเนื่องจาก "อุปสรรค" เหล่านี้จะต้องถูกสร้างขึ้นแม้ในรหัส C ระดับต่ำเพื่อให้ทำงานได้อย่างถูกต้อง เหนือสิ่งอื่นใดความเสียหายที่เกิดขึ้นในความหมายของการแสดงออกโดยไม่มีคำอธิบายหรือเหตุผลใด ๆ
โดยสรุปแล้วความจริงที่ว่าคอมไพเลอร์สามารถสร้างรหัสเครื่องที่สอดคล้องกันจากชิ้นส่วนที่ไร้สาระของ C นี้เป็นเพียงผลที่ตามมาจากวิธีที่พวก C ++ เผชิญกับความไม่สอดคล้องของระบบแคชของปลายปี 2000
มันสร้างความวุ่นวายอย่างมากในแง่มุมพื้นฐานหนึ่งของ C (นิยามนิพจน์) ดังนั้นโปรแกรมเมอร์ C ส่วนใหญ่ - ที่ไม่ให้คำด่าเกี่ยวกับระบบแคชและถูกต้อง - ตอนนี้ถูกบังคับให้พึ่งพาผู้เชี่ยวชาญเพื่ออธิบาย ความแตกต่างระหว่างและa = b() + c()
a = b + c
การพยายามเดาว่าอะไรจะเกิดขึ้นกับอาเรย์ที่โชคร้ายนี้คือการสูญเสียเวลาและความพยายามสุทธิ ไม่ว่าคอมไพเลอร์จะทำอะไรรหัสนี้ผิดพลาดทางพยาธิวิทยา สิ่งเดียวที่รับผิดชอบที่ต้องทำคือส่งไปที่ถังขยะ
แนวคิดผลข้างเคียงสามารถย้ายออกจากการแสดงออกด้วยความพยายามเล็กน้อยของการให้การแก้ไขเกิดขึ้นอย่างชัดเจนก่อนหรือหลังการประเมินในคำสั่งแยกต่างหาก
รหัส shitty ชนิดนี้อาจได้รับการพิสูจน์ในยุค 80 เมื่อคุณไม่สามารถคาดหวังให้คอมไพเลอร์เพิ่มประสิทธิภาพอะไร แต่ตอนนี้คอมไพเลอร์กลายเป็นคนฉลาดกว่าโปรแกรมเมอร์ส่วนใหญ่แล้วสิ่งที่เหลืออยู่ก็คือโค้ดที่น่ารังเกียจ
ฉันไม่เข้าใจความสำคัญของการอภิปรายที่ไม่ได้กำหนด / ไม่ระบุนี้ คุณสามารถพึ่งพาคอมไพเลอร์เพื่อสร้างรหัสที่มีพฤติกรรมที่สอดคล้องกันหรือคุณไม่สามารถ ไม่ว่าคุณจะเรียกว่าไม่ได้กำหนดหรือไม่ได้ระบุดูเหมือนว่าจุดที่สงสัย
ในความเห็นที่ได้รับข้อมูลของฉัน C มีอันตรายอยู่แล้วในสถานะ K&R วิวัฒนาการที่มีประโยชน์คือการเพิ่มมาตรการความปลอดภัยที่ใช้ร่วมกัน ตัวอย่างเช่นการใช้เครื่องมือวิเคราะห์โค้ดขั้นสูงนี้สเป็คบังคับให้คอมไพเลอร์นำไปใช้อย่างน้อยสร้างคำเตือนเกี่ยวกับรหัส bonkers แทนการสร้างรหัสเงียบ ๆ อาจไม่น่าเชื่อถือกับสุดขีด
แต่แทนที่จะเป็นคนตัดสินใจยกตัวอย่างเช่นเพื่อกำหนดลำดับการประเมินผลคงที่ใน C ++ 17 ขณะนี้ซอฟต์แวร์ทุกตัวถูกกระตุ้นอย่างแข็งขันเพื่อวางผลข้างเคียงในรหัสของเขา / เธอตามความเชื่อมั่นในความมั่นใจว่าคอมไพเลอร์ใหม่จะจัดการกับการทำให้งงงวยอย่างกระตือรือร้น
K&R เป็นหนึ่งในสิ่งมหัศจรรย์ของโลกแห่งคอมพิวเตอร์ สำหรับยี่สิบเหรียญคุณมีคุณสมบัติครบถ้วนของภาษา (ฉันเคยเห็นคนคนหนึ่งเขียนคอมไพเลอร์ฉบับสมบูรณ์โดยใช้หนังสือเล่มนี้) คู่มืออ้างอิงที่ยอดเยี่ยม (สารบัญมักจะชี้คุณภายในสองหน้าของคำตอบสำหรับคุณ คำถาม) และหนังสือเรียนที่จะสอนให้คุณใช้ภาษาอย่างสมเหตุสมผล สมบูรณ์ด้วยเหตุผลตัวอย่างและคำเตือนที่ชาญฉลาดเกี่ยวกับวิธีการมากมายที่คุณสามารถใช้ภาษาในการทำสิ่งที่โง่มาก
การทำลายมรดกนั้นเพื่อผลประโยชน์เล็ก ๆ น้อย ๆ ดูเหมือนจะเป็นสิ่งที่โหดร้ายสำหรับฉัน แต่อีกครั้งฉันอาจจะไม่สามารถมองเห็นประเด็นได้อย่างสมบูรณ์ บางทีวิญญาณใจดีอาจชี้ให้ฉันในทิศทางของตัวอย่างของรหัส C ใหม่ที่ใช้ประโยชน์อย่างมากจากผลข้างเคียงเหล่านี้?