โปรแกรมเมอร์สามเณรผิดหวังเพราะไม่มีคำศัพท์ในคอมไพเลอร์ผิดพลาด


66

เพื่อนในครอบครัวของฉันขอความช่วยเหลือจากเขาเมื่อเขาเรียนรู้การเขียนโปรแกรม (ในภาษา C) ในขณะที่เรากำลังพูดถึงเขาแสดงความไม่พอใจเกี่ยวกับการมีเวลาที่ยากลำบากในการทำความเข้าใจข้อความแสดงข้อผิดพลาดที่คอมไพเลอร์ของเขา (GCC) ให้เขาเมื่อเขาทำผิด เขาไม่เข้าใจคำศัพท์ทั้งหมดที่ใช้และบางครั้งเป็นการรวมกันของพวกเขาซึ่งอยู่นอกเหนือความเข้าใจของเขา เขาถามฉันว่า "ทำไมคอมไพเลอร์ของเอกสารถึงไม่รวมคำอธิบายข้อความผิดพลาดอีกต่อไปแล้ว?" - และฉันไม่มีคำตอบที่ดีสำหรับเขา

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

ดังนั้นโปรแกรมเมอร์มือใหม่ควรเข้าหาความท้าทายในการทำความเข้าใจข้อความแสดงข้อผิดพลาดของคอมไพเลอร์อย่างไร? โดยเฉพาะกับการรวมกันของ C และ GCC?


7
"ดังนั้นโปรแกรมเมอร์มือใหม่ควรเข้าหาความท้าทายในการทำความเข้าใจข้อความแสดงข้อผิดพลาดของคอมไพเลอร์อย่างไร" / sarcasm ความสามารถอันดับหนึ่งที่จำเป็นคือการสามารถอ่านทุก ๆ ส่วนจากข้อความคอมไพเลอร์รวมถึงการเชื่อมโยงกับบริบทมาก / ถากถาง มันไม่ค่อยจะเป็นข้อบกพร่องหรือบั๊กในคอมไพเลอร์
πάνταῥεῖ

10
@MasonWheeler: สามเณรมักจะไม่เลือกคอมไพเลอร์ที่จะใช้เมื่อเข้ารับการฝึก และ GCC เป็นตัวหารร่วมของหลายระบบจำนวนมาก ...
einpoklum

24
เมื่อพูดถึงข้อผิดพลาดของแม่แบบ GCC C ++ ฉันพบว่าฉันหยุดอ่านหลังจาก "Error <file: line>" และศึกษาไฟล์ต้นฉบับฉันพบข้อผิดพลาดได้เร็วขึ้นโดยมีผลข้างเคียงเพิ่มเติมจากการรักษาสติ ถ้าฉันอ่านข้อผิดพลาดจริงที่ได้รับจาก GCC .....
mattnz

18
วิธีแก้ปัญหาชัดเจน: ใช้คอมไพเลอร์ที่มีเอาต์พุตที่สับสนน้อยกว่า ผมขอแนะนำให้RMCC มันพิมพ์Yes.หรือNo.ขึ้นอยู่กับว่ารหัสของคุณรวบรวมหรือไม่ กำจัดความยุ่งยากจากการไม่เข้าใจข้อความที่ยาวและไร้จุดหมายทันที!
ท่อ

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

คำตอบ:


164

เทคนิคที่มีประโยชน์บางประการ:

  • เปิดและ-Wall -Werrorมันอาจดูเหมือน counterintuitive เมื่อคุณดิ้นรนกับการถอดรหัสข้อความผิดพลาดเพื่อสร้างข้อความแสดงข้อผิดพลาดมากขึ้นแต่โดยทั่วไปคำเตือนนั้นจะเข้าใจได้ง่ายขึ้นและใกล้ชิดกับแหล่งที่มาของปัญหาจริงมากขึ้นและการเพิกเฉยต่อข้อความเหล่านั้น .
  • เพียงลองแก้ไขข้อผิดพลาดแรกในรายการ ข้อผิดพลาดมักจะรวมตัวกันนำไปสู่ข้อความแสดงข้อผิดพลาดในภายหลังไม่ใช่ข้อผิดพลาดจริง แก้ไขหนึ่งและคอมไพล์ใหม่ คุณจะแก้ไขข้อผิดพลาดหลายข้อความได้ดีขึ้นเมื่อคุณมีประสบการณ์มากขึ้น
  • ใช้คอมไพเลอร์รุ่นใหม่ล่าสุดที่เป็นไปได้ C เป็นภาษาที่เสถียรที่สุด ดังนั้นส่วนใหญ่ของการปรับปรุงในคอมไพเลอร์รุ่นใหม่ไม่ได้เพิ่มคุณสมบัติภาษา แต่เพื่อปรับปรุงประสบการณ์ของนักพัฒนารวมถึงข้อความผิดพลาดที่ดีขึ้น การแจกแจงลินุกซ์ที่ใช้กันอย่างแพร่หลายส่วนใหญ่มีgcc รุ่นเก่ามากโดยค่าเริ่มต้น
  • โปรแกรมทีละน้อย อย่าพยายามเขียนโค้ดจำนวนมากก่อนที่จะรวบรวม เขียนจำนวนที่สั้นที่สุดเท่าที่จะเป็นไปได้ซึ่งจะรวบรวม หากคุณเปลี่ยนเพียงหนึ่งบรรทัดตั้งแต่ครั้งสุดท้ายที่รวบรวมอย่างหมดจดจะง่ายกว่ามากในการพิจารณาว่าบรรทัดใดมีปัญหาจริง
  • เขียนการทดสอบหน่วย มันทำให้คุณมีความมั่นใจมากขึ้นในการทำให้การเปลี่ยนแปลงการเปลี่ยนสถานะใหม่ชัดเจนขึ้นเมื่อแก้ไขข้อผิดพลาดในการคอมไพล์

23
IDE ที่ดีสามารถช่วยประสบการณ์ได้เช่นกัน ขีดเส้นใต้ข้อผิดพลาดเป็นสีแดง
BlueRaja - Danny Pflughoeft

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

4
@einpoklum: อย่าประมาทตัวเลือกที่สาม ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์ได้รับการปรับปรุงอย่างมาก ในหลอดเลือดดำที่คล้ายกันใช้คอมไพเลอร์หลายตัว (เช่น gcc และเสียงดังกราว) - จับข้อผิดพลาด / คำเตือนเพิ่มเติมและหนึ่งในนั้นอาจมีการวินิจฉัยที่ดีขึ้นสำหรับปัญหาที่เฉพาะเจาะจงกว่าอีก
Mat

19
@ einpoklum: การเขียนสิ่งต่าง ๆ ที่เพิ่มขึ้นเป็นเรื่องที่มากขึ้นโดยเฉพาะอย่างยิ่งสำหรับผู้เริ่มต้น Heck ถ้าคุณเชื่อว่า "การกำหนดโปรแกรมแบบสั้น" ไม่สามารถทำได้แบบเพิ่มหน่วยโดยแบ่งพวกมันออกเป็นฟังก์ชั่นเล็ก ๆ และนำไปใช้และคอมไพล์พวกมันทีละตัวคุณควรพยายามพัฒนาทักษะนั้นด้วยตัวเอง ..
Doc Brown

4
เคล็ดลับที่ช่วยฉัน: หากข้อความแสดงข้อผิดพลาดระบุว่า Line N ให้ตรวจสอบ Line N-1 ตัวอย่างเช่นหากคุณไม่มีเครื่องหมายอัฒภาคบนบรรทัดที่ 17 ข้อความแสดงข้อผิดพลาดจะบอกว่ามีบางอย่างผิดปกติกับบรรทัดที่ 18 นี่เป็นเพราะคอมไพเลอร์คาดว่าจะมีเครื่องหมายอัฒภาค แต่มีอย่างอื่นในบรรทัดถัดไปแทน
user2023861

56

เพื่อนของคุณไม่จำเป็นต้องใช้อภิธานศัพท์ อภิธานศัพท์จะไม่ช่วยเขา สิ่งที่เขาต้องการคือสัญชาตญาณที่ดีกว่าเกี่ยวกับสิ่งที่ต้องทำเมื่อเกิดข้อผิดพลาดของคอมไพเลอร์

ข้อผิดพลาดของคอมไพเลอร์ C ไม่ง่ายเหมือนพูดข้อผิดพลาดของคอมไพเลอร์ C # ด้วยเหตุผลหลายประการส่วนใหญ่เกี่ยวข้องกับธรรมชาติ "ใกล้กับโลหะ" ของ C. การแก้ไขข้อผิดพลาดของคอมไพเลอร์ใน C ไม่ใช่แบบฝึกหัดจับคู่รูปแบบ ได้รับอาจไม่มีอะไรเกี่ยวข้องกับปัญหาจริง ซึ่งแตกต่างจาก C # หรือ Java ซึ่งข้อความแสดงข้อผิดพลาดมักจะแมปไปยังตำแหน่งรหัสที่แม่นยำและปัญหาข้อผิดพลาดใน C มีแนวโน้มที่จะเป็นจำนวนมากและไกล

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

กลยุทธ์ของเพื่อนของคุณไม่ควรใช้รูปแบบการจับคู่นี้กับรายการข้อผิดพลาดและการแก้ไข; มันควรจะเข้าใจไวยากรณ์และสเปคของภาษา C ดีพอที่จะเข้าใจว่าปัญหาที่แท้จริงคืออะไร


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

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

36
อีกวิธีหนึ่งการขอศัพท์เพื่อทำความเข้าใจข้อผิดพลาดของคอมไพเลอร์เป็นเพียงเล็กน้อยเช่นการอ่านพจนานุกรมเพื่อทำความเข้าใจภาษาอังกฤษ นั่นไม่ใช่วิธีการทำงาน คุณเรียนรู้และเข้าใจภาษาอังกฤษโดยการอ่านและเขียนไม่ใช่อ่านพจนานุกรม
Robert Harvey

14
[ยัก] ถ้าคุณไม่ได้ใช้พจนานุกรมเพื่อเสริมความรู้ภาษาอังกฤษที่คุณมีอยู่แล้วฉันขอแนะนำให้คุณทำผิด สิ่งสุดท้ายที่ฉันอยากจะแนะนำก็คือทุกสิ่งที่ทำให้โปรแกรมเมอร์สามเณรสามารถแขวนคำศัพท์ได้มากกว่าที่เป็นอยู่ โปรแกรมเมอร์ไม่ต้องการคำมากกว่านี้ พวกเขาต้องการทักษะ
Robert Harvey

13
@ einpoklum อภิธานศัพท์จะไม่ช่วยอะไรที่นี่ คำอธิบายของคำว่า 'lvalue' น่าจะเป็นเทคนิคเกินไปสำหรับผู้เริ่มต้นหรือตามแนวของ 'ว่าสิ่งที่สามารถอยู่ทางด้านซ้ายมือของการมอบหมาย' ซึ่งเป็นเพียงช่วยเหลือ
Bart van Ingen Schenau

26

เทคนิคที่เกี่ยวข้องมูลค่าการกล่าวขวัญคือการใช้คอมไพเลอร์ที่สอง เสียงดังดังกังวานลงทุนในข้อความแสดงข้อผิดพลาดที่ดีกว่าเช่น แต่วิธีอื่นใดในการวลีข้อผิดพลาดสามารถ enlightening

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


13

มีคนลองใช้อภิธานศัพท์ข้อผิดพลาดของ GCC ใน Wikibook มาระยะหนึ่งแล้ว แต่ดูเหมือนว่ามันจะไม่เคยถูกถอดออกและยังไม่ได้รับการอัปเดต

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


12

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

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

นอกเหนือจากนั้นเวลาและความคุ้นเคยกับภาษาและคอมไพเลอร์เป็นสิ่งที่คุณต้องการ นั้นและคำแนะนำที่ดีที่กำหนดโดยคาร์ล Bielefeldt


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

6
@einpoklum คุณเคยเห็นเอกสาร PHP ไหม? นั่นคือสิ่งที่เกิดขึ้นเมื่อคุณให้ชุมชนดูแลสิ่งนั้น
Kevin

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

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

2
ในวิทยาลัยฉันเคยได้รับข้อผิดพลาดของคอมไพเลอร์ "เดฟไม่คิดว่ามันจะเกิดขึ้นได้โปรดส่งอีเมลถึงเขาที่ <dave@example.com>" ฉันส่งอีเมลถึงเขาและอันที่จริงฉันเป็นคนแรกที่ได้รับข้อผิดพลาดนั้น!
user1118321

6

C Standard ใช้คำศัพท์จำนวนหนึ่งเช่น "lvalue" และ "object" ในรูปแบบที่แตกต่างจากภาษาการเขียนโปรแกรมอื่น ๆ และข้อความคอมไพเลอร์มักเขียนในเงื่อนไขเช่นนี้ การใช้คำศัพท์ไม่สอดคล้องกันในบางส่วนของมาตรฐาน แต่ใครก็ตามที่ต้องการเรียนรู้ C ควรดูที่ร่างของมาตรฐาน C89, C99 และ / หรือ C11 รวมถึงเอกสารเหตุผลสำหรับพวกเขา การค้นหาเช่น "C99 ฉบับร่าง" หรือ "เหตุผล C89" ควรใช้งานได้ดีแม้ว่าคุณอาจต้องตรวจสอบให้แน่ใจว่าคุณได้รับเอกสารที่คุณคาดหวัง ถึงแม้ว่าคอมไพเลอร์ส่วนใหญ่จะรองรับมาตรฐาน C99 แต่ก็มีประโยชน์ที่จะทราบว่ามันแตกต่างจากมาตรฐาน C89 อย่างไรและเหตุผลของ C89 อาจเสนอภูมิหลังทางประวัติศาสตร์บางอย่างที่รุ่นหลังไม่มี


11
มาตรฐาน C เป็นข้อความที่หนาแน่นและหนักมาก ผู้เริ่มต้นไม่มีโอกาสเข้าใจ
NieDzejkob

4
@NieDzejkob: คำศัพท์ที่ใช้โดยคอมไพเลอร์ - ซึ่งดูเหมือนจะเป็นคำถามที่เกี่ยวกับ - ได้มาจากมาตรฐาน ในขณะที่คุณถูกต้องว่าบางส่วนของมาตรฐานไม่สามารถเข้าใจได้ (ส่วนหนึ่งเป็นเพราะมันถูกออกแบบโดยคณะกรรมการและผู้เขียนดูเหมือนจะไม่เข้าใจในสิ่งที่ส่วนของมันควรจะหมายถึง) แต่ใครก็ตามที่ต้องการเข้าใจสิ่งที่ คำเช่น "lvalue" หมายถึงควรระวังว่ามาจากไหน ต่อไปหากใครต้องการที่จะเข้าใจว่าทำไมสิ่งที่ต้องการx=0x1e-xอัตราผลตอบแทนที่มีข้อผิดพลาดผมไม่ทราบอะไรอื่น ๆ กว่ามาตรฐาน ...
SuperCat

3
ฉันเห็นด้วยกับ @NieDzejkob: มาตรฐาน C ไม่ใช่ข้อความที่คุณต้องการเผชิญหน้ากับมือใหม่ มือใหม่ต้องมือบนประสบการณ์ในเชิงบวกอย่างรวดเร็ว และพวกเขาจำเป็นต้องเรียนรู้สิ่งใหม่ทีละอย่างเมื่อปรากฏขึ้น การอ่านมาตรฐานหรือเหตุผลต้องใช้เวลามากเกินไปในขณะที่มีข้อมูลมากเกินไป
cmaster

2
@cmaster: ฉันเริ่มต้นด้วยยุคมาตรฐาน C89 ที่ผ่านมาและมันก็ไม่ได้เลวร้ายแม้กระทั่งก่อนหน้าเบราว์เซอร์ที่มีคุณสมบัติ 'ค้นหาข้อความ' ที่มีประโยชน์ ฉันจะให้ที่มาตรฐานในภายหลังได้แย่ลงและแย่ลง ในขณะที่ไม่มีใครควรใช้มาตรฐานเป็นข้อมูลอ้างอิงเพียงอย่างเดียวสิ่งสำคัญคือต้องตระหนักถึงความแตกต่างระหว่างภูมิปัญญาพื้นบ้านเกี่ยวกับการทำงานของคอมไพเลอร์ไมโครคอมพิวเตอร์และวิธีการที่มาตรฐานอนุญาตให้มีพฤติกรรมที่มีคุณภาพต่ำในการทำงาน เพื่อจัดการกับหลัง
supercat

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

5

ฉันประหลาดใจที่ไม่มีใครให้คำตอบที่ชัดเจนและฉันสงสัยว่าเป็นคำที่ใช้บ่อยที่สุดในทางปฏิบัติ: อย่าเพิ่งอ่านข้อความแสดงข้อผิดพลาด

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

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

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

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

1ภาษาสองสามภาษาเช่น Elm และ Dhall (และอาจเป็นแร็กเก็ต) เช่นเดียวกับการใช้ภาษา "เริ่มต้นที่มุ่งเน้น" จำนวนน้อยพยายามที่จะทำสิ่งนี้ ในหลอดเลือดดำนี้คำแนะนำของ MSalters ในการใช้การดำเนินการที่แตกต่างนั้นมีความเกี่ยวข้องโดยตรง โดยส่วนตัวแล้วฉันพบว่าสิ่งต่าง ๆ ไม่น่าสนใจและไม่ได้มีจุดมุ่งหมายเพื่อแก้ไขปัญหาที่เหมาะสม นี่ไม่ใช่การบอกว่าไม่มีวิธีที่จะทำให้เกิดข้อความแสดงข้อผิดพลาดได้ดีขึ้น แต่สำหรับพวกเขาพวกเขามีแนวโน้มที่จะหมุนไปรอบ ๆ เพื่อทำให้ความเชื่อของผู้แปลและพื้นฐานของความเชื่อเหล่านั้นชัดเจนขึ้น


4

ดังนั้นโปรแกรมเมอร์มือใหม่ควรเข้าหาความท้าทายในการทำความเข้าใจข้อความแสดงข้อผิดพลาดของคอมไพเลอร์อย่างไร? โดยเฉพาะกับการรวมกันของ C และ GCC?

บอกเพื่อนของคุณให้ทำสิ่งต่อไปนี้เมื่อพบข้อผิดพลาดที่ไม่เข้าใจ:

  • ลบ / แสดงความคิดเห็นรหัสที่เพิ่มตั้งแต่การสร้างสำเร็จครั้งล่าสุด
  • นำชิ้นส่วนเล็ก ๆ ของมันกลับมาแล้วรวบรวม
  • ทำซ้ำจนกระทั่งเกิดข้อผิดพลาด

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

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

สุดท้ายบอกให้พวกเขาทำงานในแต่ละครั้งอย่าทำงานในหลาย ๆ ไฟล์โดยไม่ต้องคอมไพล์ระหว่างกันอย่าแนะนำการพึ่งพาหลาย ๆ อย่างพร้อมกัน ฯลฯ


4

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

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


1
เอกสารนี้มีประโยชน์ด้านที่สำคัญอย่างมากที่สามารถนำมาออนไลน์ (แม้ว่าจะมีเพียง 5-10 รายการ) และจะเป็นความแตกต่างที่ดีเมื่อสมัครเข้าฝึกงาน
Josh Rumbut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.