มีคอมไพเลอร์ใดที่พยายามแก้ไขข้อผิดพลาดทางไวยากรณ์ด้วยตนเองหรือไม่? [ปิด]


15

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

คอมไพเลอร์ดังกล่าวมีอยู่จริงหรือไม่? เห็นได้ชัดว่ามันมีคุณค่าในทางปฏิบัติน้อย แต่จะน่าสนใจมากที่จะเล่นกับและเรียนรู้จาก


3
IntelliSense อยู่ในหมวดหมู่นี้หรือไม่ คอมไพเลอร์จำนวนมากมีข้อผิดพลาดคล้ายกับ [เซมิโคลอน] ที่คาดไว้
Robert Harvey

1
@ Robert: ไม่ แต่นั่นเป็นประเด็นที่ดี
Nathan Osman

1
เพื่อนของฉันทำการแฮ็คข้อมูลบน C preprocessor ค่อนข้างน้อยเช่น 'inlcude -> include' และบางงานพยายามที่จะหาว่าควรปิดเงื่อนไขเปิดแบบใด มันเป็นวิทยานิพนธ์ของอาจารย์ของเขาซึ่งเขาทิ้งอย่างรวดเร็วเพื่อบางสิ่งที่ง่ายขึ้น ยังค่อนข้างคำถามที่น่าสนใจ!
ทิมโพสต์

3
คอมไพเลอร์ AC # ล้มเหลวพร้อมข้อความแสดงข้อผิดพลาดที่มีประโยชน์มาก ที่รวมกับเอกสารที่ดีแบบออนไลน์พร้อมใช้งานสำหรับรหัสข้อผิดพลาดทุกงานค่อนข้างดี เป็นความคิดที่ไม่ดีที่จะแก้ไขไวยากรณ์ให้ถูกต้องโดยอัตโนมัติแม้ว่าล่าม HTML (เช่นเบราว์เซอร์) มักจะทำอยู่ดี
งาน

1
คอมไพเลอร์ที่คุณอ้างถึงคือ PL / I ดั้งเดิม มันคิดว่าสิ่งที่โปรแกรมเมอร์เขียนต้องมีความหมายอะไรบางอย่างและพยายามที่จะเดาว่ามันอาจจะเป็นอะไร จากประสบการณ์ของฉันมันเดาได้แย่มากจริง ๆ !
david.pfx

คำตอบ:


28

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

ดังนั้นไม่ไม่มีคอมไพเลอร์ดังกล่าวจริงๆเพราะคำถามไม่สมเหตุสมผล การคาดเดาว่าข้อผิดพลาดทางไวยากรณ์หมายถึงอะไรที่จะทำตามกฏบางชุดก็กลายเป็นส่วนหนึ่งของไวยากรณ์

ในแง่นั้นมีตัวอย่างที่ดีของคอมไพเลอร์ที่ทำสิ่งนี้: คอมไพเลอร์ C ใด ๆ พวกเขามักจะพิมพ์คำเตือนของสิ่งที่ไม่ควรจะเป็นและจากนั้นสมมติว่าคุณหมายถึง X และดำเนินการต่อไป นี่คือความจริง "การคาดเดา" ของรหัสที่ไม่ชัดเจน (แม้ว่าส่วนใหญ่จะไม่ใช่ไวยากรณ์ต่อ se) สิ่งที่อาจจะหยุดการคอมไพล์ด้วยข้อผิดพลาดและดังนั้นจึงถือว่าเป็นข้อผิดพลาด


4
นี่คือคำตอบที่ถูกต้อง เมื่อคอมไพเลอร์สามารถกู้คืนจากข้อผิดพลาดได้ก็ไม่ใช่ข้อผิดพลาดอีกต่อไป Perl มีชื่อเสียงในพฤติกรรม "ทำในสิ่งที่ฉันหมายถึง" เลือกสิ่งที่โปรแกรมเมอร์น่าจะหมายถึงแหล่งที่มาที่ไม่ชัดเจน
Jon Purdy

Perl เสียสละฟุ่มเฟื่อยขนาดซอร์สโค้ด
Nathan Osman

@ George Edison: นั่นเป็นทั้งความซ้ำซากหรือความขัดแย้ง
Jon Purdy

หรือมีความเข้าใจลึกซึ้ง :)
Lennart Regebro

23

ฟังดูอันตรายจริงๆ หากคอมไพเลอร์พยายามที่จะอนุมานความตั้งใจของคุณ infers ผิดแก้ไขรหัสแล้วจะไม่บอกคุณ (หรือบอกคุณในการเตือนว่าคุณเช่นทุกคนไม่สนใจ) แล้วคุณกำลังจะเรียกใช้รหัสที่อาจ ทำเสียหายอย่างจริงจัง

คอมไพเลอร์เช่นนี้อาจเป็นสิ่งที่ไม่ได้สร้างขึ้นโดยเจตนา


5
ฉันรู้แล้ว. คอมไพเลอร์ดังกล่าวจะไม่มีประโยชน์ในการรวบรวม แต่แนวคิดนี้ค่อนข้างน่าสนใจและมีศักยภาพในการเรียนรู้
นาธานออสมัน

2
IDE ล่าสุดเกือบทั้งหมดให้คำแนะนำเกี่ยวกับไวยากรณ์และเป็นประโยชน์จริง ๆ และสำหรับส่วนที่เหลือเห็นด้วยกับ nganju
Jigar Joshi

ฉันจะไม่ใช้คอมไพเลอร์เช่นนั้น ภายใต้หัวข้อ 'มนต์ดำ'
Michael K

อืมคุณจะให้คะแนนอนุมานประเภทของสกาล่าในระดับนี้ที่ไหน ต้องลองมันก็บอกว่ามันเป็นส่วนสำคัญในการกระชับรหัส ในทางกลับกันบางครั้งมันก็ยิงฉันที่เท้า (เช่นเพราะฉันคิดว่าฉันกำลังเผชิญกับรายการ แต่จริงๆแล้วก็ยังคงเกี่ยวข้องกับฉาก)
timday

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

12

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

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

ที่น่าสนใจคือเราได้สร้างคุณลักษณะนั้นลงในคอมไพเลอร์ JScript.NET โดยพื้นฐานแล้วมันเป็นไปได้ที่จะนำคอมไพเลอร์เข้าสู่โหมดที่เราอนุญาตให้คอมไพเลอร์ดำเนินการต่อแม้ว่าจะพบข้อผิดพลาดถ้า IDE จะกู้คืนจากมัน คุณสามารถพิมพ์รหัสVisual Basicในเรียกใช้คอมไพเลอร์ JScript.NET กับมันและมีโอกาสที่เหมาะสมของโปรแกรมที่ทำงานออกมาอีกปลาย!

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

ปีเตอร์ Torr ที่ PM'd กลับคุณลักษณะในวันที่กล่าวถึงมันสั้นในบล็อกโพสต์นี้จาก 2003

แม้ว่าเราจะเปิดเผยคุณสมบัตินี้ผ่านสคริปต์การโฮสต์ API ของเครื่องมือ JScript .NET แต่ฉันไม่ทราบว่ามีลูกค้าจริง ๆ ที่เคยใช้งาน


ฉันหวังว่านายจ้างของฉันมีทรัพยากรที่จะทดลองเช่นนั้น เราไม่ได้เรียกใช้การทดสอบหน่วยในเวลากลางคืนเพราะมีคุณสมบัติมากมายที่จะเพิ่มและข้อบกพร่องในการแก้ไข :(
งาน

1
นี่คือคำตอบที่ฉันคาดหวังไว้ ... ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ - แน่นอนว่าคุณลักษณะดังกล่าวมีการใช้งานได้จริงเพียงเล็กน้อย แต่จะเป็นวิธีที่ดีในการเรียนรู้เทคนิคที่สามารถนำไปใช้กับสิ่งอื่นได้ (การแยกวิเคราะห์ภาษา ฯลฯ )
Nathan Osman

1
@Job: ภูมิปัญญาทั่วไปคือว่าถ้าคุณไม่สม่ำเสมอเรียกใช้การทดสอบหน่วยที่คุณจะมีข้อบกพร่องมากขึ้นเพื่อแก้ไข
Eric Lippert

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

10

สิ่งแรกที่อยู่ในใจของฉันคือ Javascript ของอัตโนมัติแทรกลำไส้ใหญ่กึ่ง คุณลักษณะที่น่ากลัวและน่ากลัวซึ่งไม่ควรนำมาใช้กับภาษา

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


1
ฉันเห็นด้วยอย่างเต็มที่กับคุณสมบัติการแทรกกึ่งโคลอน JavaScript - ไร้ประโยชน์อย่างสมบูรณ์
Nathan Osman

7

มันฟังฉันว่าถ้าคอมไพเลอร์สามารถแก้ไขไวยากรณ์ที่ไม่ถูกต้องแล้วไวยากรณ์นั้นควรบันทึกไว้ในภาษา

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

int x = 5 6;

ควรจะเป็น:

int x = 5 + 6;

56มันอาจจะได้อย่างง่ายดายเพียงใดต่อไปนี้: 5 - 6, 5 & 6, ไม่มีวิธีใดที่คอมไพเลอร์จะรู้

เทคโนโลยีนั้นยังไม่มี


1
เทคโนโลยีดังกล่าวไม่สามารถดำรงอยู่ได้ ไม่อนุญาตให้อ่านใจ คำแนะนำทั้งหมดต้องมาจากโค้ดอย่างไม่น่าสงสัย
งาน

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

6

แม้ว่าจะไม่ใช่สิ่งเดียวกัน แต่นี่เป็นเหตุผลว่าทำไม HTML จึงกลายเป็นความหายนะ เบราว์เซอร์ยอมรับมาร์กอัปที่ไม่ดีและสิ่งต่อไปที่คุณรู้เบราว์เซอร์ A ไม่สามารถแสดงแบบเดียวกับที่เบราว์เซอร์ B ทำ (ใช่มีเหตุผลอื่น แต่นี่เป็นหนึ่งในไม่กี่อันดับแรกโดยประมาณ 10 ปีที่ผ่านมา )

ในฐานะที่เป็น Eric Lippert infers หลายสิ่งเหล่านี้ได้รับการจัดการที่ดีที่สุดโดย IDE ไม่ใช่คอมไพเลอร์ ให้คุณดูว่าบิตอัตโนมัติกำลังพยายามทำให้คุณล้มเหลว

กลยุทธ์ที่ฉันคิดว่าเด่นตอนนี้คือการปรับแต่งภาษาอย่างต่อเนื่องแทนการคลายตัวแปล: ถ้ามันเป็นสิ่งที่ผู้แปลสามารถคิดออกโดยอัตโนมัติแล้วแนะนำภาษาสร้างที่กำหนดไว้รอบ ๆ

ตัวอย่างทันทีที่นึกถึงคือคุณสมบัติอัตโนมัติใน C # (ไม่ใช่ภาษาเดียวที่มีบางสิ่งที่คล้ายกัน): เนื่องจากส่วนใหญ่ของ getters / setters ในแอปใด ๆ เป็นเพียงแค่ล้อมรอบฟิลด์เพียงอนุญาตให้นักพัฒนาระบุ ความตั้งใจและให้คอมไพเลอร์ฉีดส่วนที่เหลือ

ซึ่งทำให้ฉันคิด: ภาษาสไตล์ C ส่วนใหญ่ทำสิ่งนี้ไปบ้างแล้ว สำหรับสิ่งที่สามารถคำนวณได้โดยอัตโนมัติเพียงปรับแต่งไวยากรณ์:

 if (true == x)
 {
    dothis();
 }
 else
 {
    dothat();
 }

สามารถลดเป็น:

if (true == x)
    dothis();
else
    dothat();

ในท้ายที่สุดฉันคิดว่ามันมาจากสิ่งนี้: แนวโน้มคือคุณไม่ได้ทำให้คอมไพเลอร์ "ฉลาดขึ้น" หรือ "คลาย" มันเป็นภาษาที่ทำให้ฉลาดขึ้น

นอกจากนี้ "ความช่วยเหลือ" มากเกินไปอาจเป็นอันตรายเช่นข้อผิดพลาด "คลาสสิค" ถ้า:

if (true == x)
    if (true == y)
       dothis();
else
    dothat();

ควรสังเกตว่า XHTML จัดเตรียมโซลูชันสำหรับระเบียบที่สร้างข้อกำหนดที่ไม่ดีของ HTML
Nathan Osman

2
if (x && y) dothis(); else dothat();จะดูดีขึ้นเล็กน้อย
งาน

1
แมวตายทุกครั้งที่มีคนเปรียบเทียบกับหรือtrue false
JensG

2

เมื่อฉันเขียนโปรแกรม FORTRAN และ PL / ฉันกลับมาในช่วงปลายยุค 80 และต้นยุค 90 ในระบบ DEC และ IBM minicomputer และเมนเฟรมของ IBM ฉันดูเหมือนจะจำได้ว่าคอมไพเลอร์จะออกจากระบบข้อความเช่น "blah blah error; . " ย้อนกลับไปนี่เป็นมรดกของการประมวลผลแบบกลุ่ม (ก่อนหน้านี้ก่อนหน้าของฉัน) วันที่มีการรอคอยอย่างมากระหว่างการส่งรหัสของคุณเพื่อเรียกใช้และรับผลลัพธ์กลับมา ดังนั้นจึงเป็นเรื่องที่สมเหตุสมผลสำหรับคอมไพเลอร์ที่จะพยายามคาดเดาโปรแกรมเมอร์และดำเนินการต่อไปมากกว่าจะยกเลิกในข้อผิดพลาดแรกที่พบ ในใจคุณฉันจำไม่ได้ว่า "การแก้ไข" มีความซับซ้อนเป็นพิเศษ ในที่สุดเมื่อฉันย้ายไปยังเวิร์กสเตชัน Unix แบบโต้ตอบ (Sun, SGI ฯลฯ )


2
คอมไพเลอร์เหล่านั้นจะดำเนินการต่อ แต่จะดำเนินการต่อเพื่อจุดประสงค์ในการพยายามหาข้อผิดพลาดเพิ่มเติมเท่านั้นดังนั้นคุณสามารถแก้ไขสิ่งต่าง ๆ ก่อนที่จะส่งอีกครั้ง พีซีสมัยใหม่นั้นเร็วพอที่จะเป็นไปได้ทั้งหมดสำหรับคอมไพเลอร์ "แบบโต้ตอบ" เพื่อหยุดที่ข้อผิดพลาดทางไวยากรณ์ครั้งแรกและวางคุณลงในโปรแกรมแก้ไข (และในความเป็นจริง Turbo Pascal ดั้งเดิมในต้นทศวรรษ 1980 ทำงานอย่างถูกต้องมันดีมาก)
John R. Strohm

1
ใช่ฉันจำได้ว่าการเพิ่มประสิทธิภาพของ IBM PL / I คอมไพเลอร์จะให้คำสั่ง BEGIN และ END ที่ขาดหายไปเป็นครั้งคราว ISTR จะให้เซมิโคลอนที่ขาดหายไปด้วย
TMN

1

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

โดยทั่วไปภาษาควรได้รับการออกแบบเพื่อให้รหัสที่แสดงความตั้งใจอย่างชัดเจนนั้นถูกต้องตามกฎหมายและห้ามมิให้ใช้รหัสที่ไม่ได้แสดงเจตนาอย่างชัดเจน แต่ไม่ได้หมายความว่าเป็นภาษานั้น พิจารณารหัสต่อไปนี้ [Java หรือ C #]

const double oneTenth = 0.1;
const float  oneTenthF = 0.1f;
...
float f1 = oneTenth;
double d1 = oneTenthF;

การมีคอมไพเลอร์เพิ่ม typecast โดยปริยายสำหรับการมอบหมายให้f1เป็นประโยชน์เนื่องจากมีเพียงสิ่งเดียวเท่านั้นที่โปรแกรมเมอร์อาจต้องการf1เก็บไว้ ( floatค่าใกล้เคียงกับ 1/10) แทนที่จะส่งเสริมให้คอมไพเลอร์ยอมรับโปรแกรมที่ไม่เหมาะสม แต่จะเป็นการดีกว่าสำหรับข้อมูลจำเพาะที่จะอนุญาตให้มีการแปลงแบบสองต่อหนึ่งโดยปริยายในบริบทบางอย่าง ในทางกลับกันการมอบหมายให้ทำd1อาจจะใช่หรือไม่ใช่สิ่งที่โปรแกรมเมอร์ตั้งใจจริง แต่ไม่มีกฎภาษาที่ห้ามใช้

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


0

ข้อผิดพลาดทางไวยากรณ์โดยเฉพาะอย่างยิ่งยากที่จะแก้ไข พิจารณากรณีที่ขาดหายไปทางขวา): เรารู้ว่าเราสามารถซ่อมแซมรหัสได้ด้วยการแทรกรหัส แต่มีหลาย ๆ ที่ที่เราสามารถแทรกได้และรับโปรแกรมที่ถูกต้องทางซินแทคติค

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


-1

ผู้เรียบเรียงดังกล่าวจะเป็นการใช้งานที่ไม่ได้มาตรฐานและไม่ได้มาตรฐานสำหรับภาษาใดก็ตามที่กำลังรวบรวม


-2

มีการทดลองหลายครั้ง แต่บ่อยครั้งที่มันไม่ได้ผลตามที่ต้องการ: คิดว่า HAL 9000 หรือ GlaDOS


-3

ใน C คุณไม่สามารถผ่านอาร์เรย์ตามค่าได้ แต่คอมไพเลอร์อนุญาตให้คุณเขียน:

void foo(int array[10]);

ซึ่งจะถูกเขียนใหม่อย่างเงียบ ๆ เมื่อ:

void foo(int* array);

มันช่างโง่เหลือเกิน ฉันต้องการข้อผิดพลาดอย่างหนักที่นี่แทนที่จะเขียนใหม่แบบเงียบ ๆ เนื่องจากกฎพิเศษนี้ทำให้โปรแกรมเมอร์หลายคนเชื่อว่าอาร์เรย์และตัวชี้เป็นสิ่งเดียวกัน พวกเขาจะไม่.

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