คอมไพเลอร์และล่ามสามารถมีข้อบกพร่องและเรา (ในฐานะผู้ใช้) ทำอะไรเพื่อจัดการกับพวกเขา? [ปิด]


28

หากงานของคอมไพเลอร์คือการแปลซอร์สโค้ดเป็นรหัสระดับเครื่องจะมีความผิดพลาดใด ๆ ในคอมไพเลอร์หรือแปลผิดพลาดหรือไม่?

เช่นเดียวกันกับล่าม: บางครั้งมันไม่สามารถส่งออกเนื้อหาที่ต้องการได้หรือไม่?

ฉันไม่เคยได้ยินข้อบกพร่องใด ๆ ในคอมไพเลอร์ / ล่าม แต่มีอยู่หรือไม่?


6
ในการพัฒนาพวกเขาจะอยู่อย่างแน่นอนที่สุดเพียงแค่ดูข้อผิดพลาดในคอมไพเลอร์โอเพนซอร์สใด ๆ
ratchet freak

7
ฉันไม่เคยได้ยินข้อบกพร่องใด ๆ ในคอมไพเลอร์ / ล่าม แต่มีอยู่หรือไม่? ฉันพบรายชื่อผู้รับจดหมายเพื่อหาข้อบกพร่องในคอมไพเลอร์ gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
นี่ไม่ใช่คำถามที่ดีจริงๆเพียงแค่ถามบางสิ่งที่มีสามัญสำนึก

12
ไม่มีความคิดเห็นหรือคำตอบในขณะนี้ที่อยู่โอกาสในการพบข้อผิดพลาดของคอมไพเลอร์ อย่าลืมข้อผิดพลาดในรหัสของคุณเองก่อน
Dan Pichelman

6
คำตอบสั้น ๆ : แน่นอน ในขณะที่ IDEs และคอมไพเลอร์มักใช้เวลาอยู่ในชีวิตของพวกเขาก่อนที่พวกเขาจะได้เห็นโลกภายนอก แต่ก็มีบางมุมที่นักพัฒนาที่ฉลาดน้อยเกินไปจะพบ
KeithS

คำตอบ:


51

ใช่

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

โชคดีที่ภาษาเหล่านี้ส่วนใหญ่ (โดยเฉพาะภาษาที่เป็นโอเพ่นซอร์ส) จะมีระบบติดตามบั๊กที่คุณสามารถส่งรายงานได้

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


หวังว่าคุณจะไม่รังเกียจ ฉันเพิ่มย่อหน้าใหม่ (รอการอนุมัติ) ซึ่งฉันคิดว่าอาจเกี่ยวข้อง คอมไพเลอร์อาจมีข้อบกพร่องไม่เพียง แต่อาจมีรหัสที่เป็นอันตราย
Andy

@ ดูเหมือนว่าหนึ่งในผู้ดำเนินรายการปฏิเสธว่าเป็นสิ่งที่ควรเป็นความคิดเห็นหรือคำตอบแยกต่างหาก
KChaloux

ไม่ใช่แค่ "ใช่" แต่ "นรกใช่!" :-)
Hellion

C เป็นทั้งผู้ใหญ่และมีการพัฒนาอย่างแข็งขัน ดังนั้น C ++ ดังนั้นชวาก็คือ ฯลฯ ..
djechlin

100

ในคำพูดของคนธรรมดา:

โปรแกรมทั้งหมดสามารถมีข้อบกพร่อง

คอมไพเลอร์เป็นโปรแกรม

ดังนั้นคอมไพเลอร์สามารถมีข้อบกพร่อง


55
น่าเป็นห่วงมากขึ้น: โปรแกรมดีบั๊กเป็นโปรแกรม ดังนั้นผู้ดีบักจึงมีข้อบกพร่อง
Daniel Gratzer

19
@jozefg: แล้วคุณจะดีบัก debugger อย่างไร? ใครเป็นคนเฝ้าดู
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner ผู้เฝ้าดู, ดู
จิมมี่ฮอฟฟา

9
@JoelFan เนื่องจากฉันเขียนว่า "มี" ข้อยกเว้นนั้นจะครอบคลุม หากคุณพูดว่า "มี" คุณจะต้องระบุว่าคุณกำลังอ้างถึงโปรแกรมที่ไม่สำคัญเท่านั้น ด้วยการพูดว่า "มี" คุณไม่จำเป็นต้องทำ
Tulains Córdova

8
โปรแกรม "Hello world" อาจมีข้อบกพร่องหากเป็นไปตามคอมไพเลอร์ที่บั๊ก
wtsang02

22

มีข้อบกพร่องสามารถแม้ในฮาร์ดแวร์ ตัวอย่างที่มีชื่อเสียงเป็นข้อผิดพลาด Pentium FDIV ไม่ต้องสงสัยเลยว่ามีความเป็นไปได้ที่คอมไพเลอร์จะมีข้อบกพร่อง


2
+1 นี้นำฉันไปที่เรื่องรอยขีดข่วนลิง
luser droog

8

คอมไพเลอร์และล่ามก็เป็นซอฟต์แวร์เช่นกันดังนั้นจึงไม่มีปัญหาใด ๆ ของซอฟต์แวร์อื่น ๆ

นี่คือตัวอย่างจากคอมไพเลอร์เป็นที่ผ่านมาเป็น MSVC 11 (2012) หนึ่งและนี่เป็นบทความเกี่ยวกับวิธีที่พวกเขาทดสอบแบ็กเอนด์



4

แน่นอนเพราะคอมไพเลอร์เป็นซอฟต์แวร์

ในปี 2005 ฉันมีรหัสชิ้นหนึ่งล้มเหลวในซอฟต์แวร์ที่มีความสำคัญอย่างยิ่งซึ่งฉันเขียนให้กับ บริษัท ขนาดใหญ่ เนื่องจากค่าใช้จ่ายของ บริษัท นับล้านดอลลาร์เพื่อแก้ไขแน่นอนพวกเขาเปิดตัวการสืบสวนใหญ่ตูด

โชคดี (จากมุมมองของฉัน) ปัญหากลายเป็นปัญหาคอมไพเลอร์ใน Delphi ในที่สุดการลองบล็อกค่าส่งคืนของฟังก์ชันจะถูกทำลายและทำให้ได้ผลลัพธ์แบบสุ่มกลับไปที่ผู้โทร เอกสารนี้ได้รับการยอมรับและได้รับการยอมรับจาก Borland

.NET เป็นที่รู้จักกันดีว่ามีการรั่วไหลของหน่วยความจำที่แตกต่างกันนับร้อยโดยเฉพาะอย่างยิ่งในการติดตั้งใช้งานครั้งแรก

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


มีซอฟต์แวร์ "ตรวจสอบอย่างเป็นทางการ" มันได้รับการพิสูจน์ทางคณิตศาสตร์ในการทำงาน บางครั้งรหัสที่ตรวจสอบอย่างเป็นทางการมีข้อบกพร่อง การใช้งาน Quicksort ของ IIRC Java นั้นได้รับการตรวจสอบอย่างเป็นทางการแล้ว แต่นั่นก็ไม่ได้มีสาเหตุมาจากการโอเวอร์โฟลว์
David Plumpton

1
ซอฟต์แวร์คืออะไร C'mon :)
Rocklan

2

ไม่เพียง แต่บั๊ก แต่ยังมีเจตนามัลแวร์

โทรจัน "เข้าสู่ระบบ" ดำเนินการโดย Brian Kernighan กับคอมไพเลอร์ Unix C ดั้งเดิมเป็นที่รู้จักกันดีที่สุด บทความhttp://cm.bell-labs.com/who/ken/trust.htmlมีพื้นหลังอยู่บ้าง


1
เห็นได้ชัดว่ามันถูกนำไปใช้จริงหรือไม่?
Keith Thompson

นี่เป็นหัวข้อที่น่าสนใจ แต่ไม่เกี่ยวข้องกับคำถามนี้เลย

@delnan ฉันไม่เห็นด้วย; ที่หัวใจของคำถามดูเหมือนว่า "ฉันจะไว้ใจผู้แปลได้มากแค่ไหน"
Andy

1

ใช่แน่นอนเช่นคอมไพเลอร์ซอฟต์แวร์ใด ๆ มีข้อบกพร่องตัวอย่างเช่นรายการข้อผิดพลาด gcc อยู่ที่นี่


0

ใช่.

นอกจากนี้ไม่เพียง แต่กับคอมไพเลอร์เท่านั้น แต่ยังรวมถึง Interpreors / debuggers และเครื่องมือซอฟต์แวร์บุคคลที่สามใด ๆ

ขณะนี้เรากำลังใช้ซอฟต์แวร์บุคคลที่สามบางส่วนและมีปัญหาบางอย่างแล้ว บางครั้งพวกเขาก็ขอบคุณเราสำหรับการค้นหาและรายงานข้อผิดพลาด :)

บางคนมีหน่วยความจำรั่วด้วยซึ่งนำไปสู่ความผิดพลาด คำถามสำคัญที่นี่อาจเป็นวิธีการตรวจสอบว่าเครื่องมือของบุคคลที่สามหรือคอมไพเลอร์มีข้อบกพร่องสำหรับการสมัครของคุณทำงานอย่างถูกต้อง?


คำถามสำคัญของคุณจะนำกลับไปสู่ปัญหาการหยุดชะงัก
wtsang02

0

คอมไพเลอร์เป็นโปรแกรมที่อ่านโปรแกรมที่เขียนในภาษาหนึ่ง (ภาษาต้นฉบับ) และแปลเป็นโปรแกรมอื่นที่เทียบเท่าในภาษาอื่น (ภาษาเป้าหมาย) ซึ่งส่วนใหญ่เป็นภาษาเครื่อง

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

ขั้นตอนที่ 1: ตัววิเคราะห์คำศัพท์ - อ่านอักขระทั้งหมดในซอร์สโปรแกรมและสร้างการแยกโลจิคัลของโทเค็น (int, char, float, if-else, for, while ฯลฯ )

ขั้นตอนที่ 2: การวิเคราะห์ไวยากรณ์ - วิเคราะห์โครงสร้างของกระแสโทเค็น การแยกวิเคราะห์ลำดับชั้นของการแสดงออกซึ่งรวมถึง postfix / prefix ฯลฯ (a = b + c * d)

ขั้นตอนที่ 3: การวิเคราะห์เชิงความหมาย - การตรวจสอบประเภทของโทเค็น (จำนวนเต็มจริงลอย ฯลฯ ) และสิ่งต่าง ๆ เช่นลำดับความสำคัญของผู้ประกอบการ ฯลฯ

ขั้นตอนที่ 4: ตัวสร้างโค้ดระดับกลาง - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

ขั้นตอนที่ 5: การปรับรหัสให้เหมาะสม - การวิเคราะห์ที่หลากหลาย (การควบคุมการไหลการไหลของข้อมูลการแปลง)
ซึ่งส่งผลให้เกิดรหัสซ้ำซ้อนรหัสค่าคงที่ค่าคงตัวรหัสตายบางส่วน

ขั้นตอนที่ 6: การสร้างรหัส - การสร้างรหัสเป้าหมาย (ภาษาแอสเซมบลีภาษาส่วนใหญ่) นำค่าในการลงทะเบียน

ทุกขั้นตอนเหล่านี้ไม่มีอะไรนอกจากโปรแกรมที่เขียนได้ดีและอาจมีข้อบกพร่องจำนวน N ใน ..


-1

แน่นอนว่าคอมไพเลอร์เป็นเพียงโปรแกรมและผู้เขียนก็เป็นคนงี่เง่าด้วยเช่นกัน :) แม้แต่ข้อกำหนดทางภาษาก็อาจมีข้อบกพร่อง ตัวอย่าง: c # + foreach + lambdaแลมบ์ดา

หรือใน Python ข้อผิดพลาดในล่าม: การรวบรวม ast ast ชั่วร้ายล่มล่ามชั่วร้ายเกิดปัญหาล่าม

ถ้าคุณต้องการดูข้อบกพร่องในคอมไพเลอร์ / interpeter -> ดูที่ php มีข้อบกพร่องที่มีชื่อเสียงที่มีจำนวนเต็มล้น if (size > INT_MAX) return NULL;การแก้ไขครั้งแรกเริ่มต้นจาก ต่อเนื่องของเรื่องราว


ผู้เขียนคอมไพเลอร์ไม่ใช่คนโง่ เนื่องจากคอมไพเลอร์ค่อนข้างซับซ้อนสิ่งกีดขวางในการลงสนามจึงสูงขึ้นอย่างมาก ดังนั้นเราจึงสามารถคาดหวังให้คนที่เขียนพวกเขาไม่ทำผิดพลาดเหมือนคนทั่วไป
jszpilewski

foreach / lambda ไม่ใช่ข้อผิดพลาดมันมาลงในการตัดสินใจที่เฉพาะเจาะจงและการออกแบบมโนธรรมที่ทำขึ้นก่อนที่จะเพิ่ม lambdas
Andy

@Andy อย่างที่ฉันรู้ไม่มีใครรู้ว่าปัญหาการตัดสินใจครั้งนี้จะทำให้เกิด ทำไมไม่มีข้อผิดพลาด?
Viktor Lova

@jszpilewski คุณเห็นรอยยิ้มหลังจากข้อความนั้นหรือไม่
Viktor Lova

1
ฉันแนะนำให้คุณอ่าน OP อีกครั้งเนื่องจากคำถามของเขาไม่เกี่ยวกับว่าข้อมูลจำเพาะสามารถมีข้อบกพร่องหรือไม่เพราะคอมไพเลอร์สามารถมีข้อบกพร่องได้หรือไม่ เนื่องจากคอมไพเลอร์ C # ตรงกับข้อมูลจำเพาะคอมไพเลอร์จึงไม่มีข้อบกพร่อง ฉันขอแนะนำให้คุณอ่านเครื่องหมายคำพูดวิกิพีเดียของคุณเองอีกครั้ง "ข้อผิดพลาดของซอฟต์แวร์คือข้อผิดพลาดข้อบกพร่องหรือความผิดพลาดในโปรแกรมคอมพิวเตอร์"
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.