นอกจากคำตอบที่ยอดเยี่ยมทั้งหมด:
คุณมี "อคติผู้สังเกตการณ์" คุณไม่ได้สังเกตข้อผิดพลาดและดังนั้นคุณคิดว่าไม่มี
ฉันเคยคิดเหมือนคุณ จากนั้นฉันก็เริ่มเขียนคอมไพเลอร์อย่างมืออาชีพและให้ฉันบอกคุณว่ามีข้อบกพร่องมากมายอยู่ในนั้น!
คุณไม่เห็นข้อบกพร่องเนื่องจากคุณเขียนโค้ดที่เหมือนกับ 99.999% ของรหัสที่เหลือทั้งหมดที่ผู้คนเขียน คุณอาจเขียนโค้ดปกติอย่างตรงไปตรงมาชัดเจนว่าถูกต้องที่เรียกวิธีการและเรียกใช้ลูปและไม่ได้ทำอะไรแฟนซีหรือแปลกเพราะคุณเป็นนักพัฒนาปกติแก้ปัญหาธุรกิจปกติ
คุณไม่เห็นข้อผิดพลาดของคอมไพเลอร์เนื่องจากข้อผิดพลาดของคอมไพเลอร์ไม่ได้อยู่ในสถานการณ์ของรหัสปกติที่ง่ายต่อการวิเคราะห์ ข้อบกพร่องอยู่ในการวิเคราะห์ของรหัสแปลก ๆ ที่คุณไม่ได้เขียน
ในทางกลับกันมีอคติผู้สังเกตการณ์ตรงกันข้าม ฉันเห็นรหัสบ้าทุกวันทุกวันและสำหรับฉันคอมไพเลอร์ดูเหมือนว่าจะเต็มไปด้วยข้อบกพร่อง
หากคุณนั่งลงกับข้อกำหนดภาษาของภาษาใด ๆ และใช้งานคอมไพเลอร์สำหรับภาษานั้นและพยายามอย่างหนักเพื่อตรวจสอบว่าคอมไพเลอร์ใช้ข้อมูลจำเพาะหรือไม่โดยเน้นไปที่กรณีมุมที่คลุมเครือในไม่ช้าคุณจะพบว่า รวบรวมข้อบกพร่องค่อนข้างบ่อย ขอยกตัวอย่างให้หน่อยนี่คือบั๊กคอมไพเลอร์ C # ที่ฉันพบเมื่อห้านาทีก่อน
static void N(ref int x){}
...
N(ref 123);
คอมไพเลอร์ให้สามข้อผิดพลาด
- อาร์กิวเมนต์ ref หรือ out ต้องเป็นตัวแปรที่กำหนดได้
- คู่ที่ดีที่สุดสำหรับ N (การอ้างอิง int x) มีอาร์กิวเมนต์ที่ไม่ถูกต้อง
- ไม่มี "ref" ในอาร์กิวเมนต์ 1
เห็นได้ชัดว่าข้อความแสดงข้อผิดพลาดแรกนั้นถูกต้องและข้อที่สามเป็นจุดบกพร่อง อัลกอริธึมการสร้างข้อผิดพลาดพยายามหาสาเหตุที่อาร์กิวเมนต์แรกนั้นไม่ถูกต้องดูที่มันเห็นว่ามันคงที่และไม่กลับไปที่ซอร์สโค้ดเพื่อตรวจสอบว่ามันถูกทำเครื่องหมายเป็น "ref" หรือไม่ ค่อนข้างจะถือว่าไม่มีใครโง่พอที่จะทำเครื่องหมายค่าคงที่เป็นอ้างอิงและตัดสินใจว่าการอ้างอิงนั้นจะต้องหายไป
ยังไม่ชัดเจนว่าข้อความข้อผิดพลาดที่สามที่ถูกต้องคืออะไร แต่นี่ไม่ใช่ ในความเป็นจริงมันไม่ชัดเจนหากข้อความแสดงข้อผิดพลาดที่สองนั้นถูกต้องเช่นกัน หากการแก้ปัญหาเกินพิกัดล้มเหลวหรือควรถือว่า "ref 123" เป็นอาร์กิวเมนต์สำหรับประเภทที่ถูกต้อง? ตอนนี้ฉันจะต้องให้ความคิดและพูดคุยกับทีม triage เพื่อที่เราจะได้ทราบว่าพฤติกรรมที่ถูกต้องคืออะไร
คุณไม่เคยเห็นข้อผิดพลาดนี้เพราะคุณอาจจะไม่ทำอะไรโง่ ๆ เพื่อพยายามส่ง 123 โดยอ้างอิง และถ้าคุณทำคุณอาจจะไม่ได้สังเกตว่าข้อความแสดงข้อผิดพลาดที่สามนั้นไร้สาระเนื่องจากข้อความแรกนั้นถูกต้องและเพียงพอที่จะวินิจฉัยปัญหา แต่ฉันพยายามทำสิ่งนี้เพราะฉันพยายามที่จะทำลายคอมไพเลอร์ หากคุณลองคุณจะเห็นข้อบกพร่องด้วย