Pemrogram pemula frustasi karena kurangnya glosarium kesalahan penyusun

66

Seorang teman keluarga saya meminta sedikit bantuan saat dia belajar memprogram (dalam bahasa C). Ketika kami berbicara, dia menyatakan frustrasi tentang kesulitan memahami pesan kesalahan yang diberikan oleh kompilernya (GCC) ketika dia membuat kesalahan. Dia tidak mengerti semua istilah yang digunakan, dan kadang-kadang kombinasi mereka yang di luar pemahamannya. Dia bertanya kepada saya, "Kenapa dokumentasi kompiler tidak menyertakan penjelasan lebih panjang dari pesan kesalahan?" - dan saya tidak punya jawaban yang bagus untuknya.

Saya sendiri - sebagai programmer yang lebih berpengalaman - sangat jarang dalam situasi ini, tetapi kejadian langka itu terjadi - beberapa pesan kesalahan eksotis yang belum pernah saya temui sebelumnya. Saya berhasil bertahan dengan mencari pesan kesalahan di mesin pencari, tetapi ternyata itu tidak selalu berhasil untuknya - terutama karena kesalahan yang ia temui lebih umum dan terjadi dalam beberapa kasus berbeda, yang ia mengalami kesulitan terkait dengan pesannya. sendiri.

Jadi, bagaimana seharusnya seorang programmer pemula mendekati tantangan memahami pesan kesalahan kompiler? Secara khusus, dengan kombinasi C dan GCC?

einpoklum - mengembalikan Monica
sumber
7
"Jadi, bagaimana seharusnya seorang programmer pemula mendekati tantangan untuk memahami pesan kesalahan kompiler?" / sarkasme Keahlian pertama yang dibutuhkan adalah dapat membaca setiap bit dari pesan kompiler, termasuk menghubungkannya dengan konteks yang sebenarnya. Aku sarkasme. Jarang berubah menjadi cacat, atau bug di kompiler.
πάντα ῥεῖ
10
@MasonWheeler: Seorang pemula sering tidak memilih kompiler mana yang akan digunakan saat menjalani pelatihan. Dan GCC adalah penyebut umum dari banyak, banyak sistem ...
einpoklum - mengembalikan Monica
24
Ketika datang ke kesalahan template GCC C ++, saya menemukan jika saya berhenti membaca setelah "Kesalahan <file: baris>" dan mempelajari file sumber, saya menemukan kesalahan lebih cepat, dengan efek samping tambahan menjaga kewarasan saya, daripada jika saya membaca kesalahan aktual yang diberikan oleh GCC .....
mattnz
18
Solusinya sudah jelas: Gunakan kompiler dengan output yang kurang membingungkan. Saya sarankan rmcc . Mencetak Yes.atau No.tergantung pada apakah kode Anda dikompilasi atau tidak. Seketika menghilangkan rasa frustrasi karena tidak memahami pesan yang panjang dan tidak berguna!
pipa
21
C bukan bahasa yang baik untuk pemula - dan Anda telah menemukan salah satu alasannya. Yang sedang berkata, Clang cenderung menawarkan kesalahan yang jauh lebih baik yang mungkin juga lebih menarik bagi pemula.
Theodoros Chatzigiannakis

Jawaban:

164

Beberapa teknik yang bermanfaat:

  • Nyalakan -Walldan -Werror. Ini mungkin tampak berlawanan dengan intuisi ketika Anda berjuang dengan menguraikan pesan kesalahan untuk membuat lebih banyak pesan kesalahan, tetapi peringatan biasanya lebih mudah dipahami dan lebih dekat ke sumber masalah yang sebenarnya, dan mengabaikannya dapat menyebabkan kesalahan yang sulit dipahami .
  • Coba perbaiki kesalahan pertama dalam daftar. Seringkali kesalahan bertambah satu sama lain, yang menyebabkan pesan kesalahan di kemudian hari tidak benar-benar menjadi kesalahan aktual. Perbaiki satu dan kompilasi ulang. Anda akan menjadi lebih baik dalam memperbaiki beberapa pesan kesalahan saat Anda mendapatkan lebih banyak pengalaman.
  • Gunakan versi kompiler terbaru mungkin. C adalah bahasa yang sangat stabil. Oleh karena itu, sebagian besar peningkatan pada kompiler yang lebih baru bukan untuk menambahkan fitur bahasa, tetapi untuk meningkatkan pengalaman pengembang, termasuk pesan kesalahan yang lebih baik. Banyak distribusi linux yang digunakan secara luas memiliki versi gcc yang sangat lama secara default.
  • Program secara bertahap. Jangan mencoba menulis banyak kode sebelum kompilasi. Tulis jumlah sesingkat mungkin yang masih akan dikompilasi. Jika Anda hanya mengubah satu baris sejak terakhir kali dikompilasi dengan bersih, jauh lebih mudah untuk mengetahui baris mana yang berisi masalah aktual.
  • Tulis tes unit. Itu membuat Anda lebih percaya diri untuk melakukan klarifikasi perubahan refactoring ketika memperbaiki kesalahan kompilasi.
Karl Bielefeldt
sumber
23
IDE yang baik juga dapat sangat membantu pengalaman dengan misalnya. menggarisbawahi kesalahan merah.
BlueRaja - Danny Pflughoeft
86
"Program secara bertahap. Jangan mencoba menulis satu ton kode sebelum kompilasi. Tulis jumlah sesingkat mungkin yang masih akan dikompilasi. Jika Anda hanya mengubah satu baris sejak terakhir kali dikompilasi dengan bersih, jauh lebih mudah untuk mencari tahu baris mana yang berisi masalah aktual. " Ini, sangat banyak ini. Juga sebagian besar IDE akan memperingatkan Anda jika Anda menulis kode yang tidak dapat dikompilasi, dan menyorot kesalahan.
Polygnome
4
@einpoklum: jangan meremehkan opsi ketiga; pesan kesalahan kompiler telah meningkat banyak. Dalam nada yang sama, gunakan beberapa kompiler (misalnya gcc dan dentang) - menangkap lebih banyak kesalahan / peringatan dan salah satunya mungkin memiliki diagnostik yang lebih baik untuk masalah tertentu daripada yang lain.
Mat
19
@einpoklum: menulis sesuatu secara lebih bertahap sangat tepat, terutama untuk pemula. Heck, jika Anda yakin "penugasan pemrograman pendek" tidak dapat dilakukan secara bertahap, dengan memecahnya menjadi beberapa fungsi kecil dan mengimplementasikan serta menyusunnya satu per satu, Anda harus mencoba meningkatkan keterampilan itu untuk diri Anda sendiri ..
Doc Brown
4
Trik yang membantu saya: jika pesan kesalahan menyebutkan Line N, centang Line N-1. Misalnya, jika Anda kehilangan tanda titik koma di baris 17, pesan kesalahan akan mengatakan bahwa ada yang salah dengan baris 18. Ini karena kompiler mengharapkan tanda koma tetapi mendapat sesuatu yang lain, di baris berikutnya, sebagai gantinya.
user2023861
56

Teman Anda tidak perlu glosarium. Glosarium tidak akan membantunya. Yang dia butuhkan adalah intuisi yang lebih baik tentang apa yang harus dilakukan ketika kesalahan kompiler terjadi.

Kesalahan kompiler C tidak seintuitif, katakanlah, kesalahan penyusun C #, karena banyak alasan sebagian besar berkaitan dengan sifat "dekat dengan logam" dari C. Memecahkan kesalahan kompiler dalam C bukanlah latihan pencocokan pola, karena kesalahan yang Anda lakukan terima mungkin tidak ada hubungannya dengan masalah aktual. Tidak seperti C # atau Java, di mana pesan kesalahan biasanya memetakan ke lokasi kode yang tepat dan masalah, kesalahan dalam C cenderung banyak dan jauh.

Contohnya adalah "titik koma yang diharapkan" atau sejumlah kesalahan sintaks yang mengindikasikan parser yang terpaku pada sesuatu (belum tentu titik koma). Atau sesuatu seperti "deklarasi maju tak terduga," kesalahan yang, ketika saya melihatnya, selalu berarti bahwa saya salah kapitalisasi pada salah satu file .h saya, tetapi yang tidak menunjuk ke file .h sebagai sumber masalah.

Strategi teman Anda seharusnya bukan untuk mencocokkan pola ini dengan daftar kesalahan dan solusi; seharusnya memahami sintaks dan spesifikasi bahasa C dengan cukup baik untuk mencari tahu apa masalah sebenarnya .

Robert Harvey
sumber
17
Tidak. Idenya adalah untuk mengetahui bahasa dengan cukup baik untuk mengetahui bahwa Anda tidak dapat membuat penugasan untuk ekspresi numerik, tetapi hanya untuk variabel. Anda tidak perlu tahu apa nilai itu sama sekali, itulah sebabnya mereka tidak mengajarkan itu dalam kursus pemula.
Robert Harvey
18
Intinya ya. Tetapi secara praktis, itu tidak mungkin. Saya sudah melakukan ini untuk waktu yang sangat lama dan saya masih mendapatkan pesan kesalahan kompiler yang tidak jelas setiap kali saya menulis program C. Saya jarang repot membaca pesan-pesan itu dan mencoba memahaminya; sebaliknya, saya melihat di mana pesan kesalahan menunjuk, dan karena saya tahu seperti apa struktur sintaks dasar dari sebuah program C seharusnya, saya dapat menemukan masalah relatif cepat tanpa menghabiskan waktu menguraikan pesan kesalahan.
Robert Harvey
36
Dengan kata lain, meminta glosarium untuk memahami kesalahan kompiler sama seperti membaca kamus untuk memahami bahasa Inggris; itu tidak cukup cara kerjanya. Anda belajar dan memahami bahasa Inggris dengan membaca dan menulisnya, bukan membaca kamus.
Robert Harvey
14
[mengangkat bahu] Jika Anda tidak menggunakan kamus untuk menambah pengetahuan bahasa Inggris Anda yang sudah ada, saya sarankan Anda salah melakukannya. Hal terakhir yang saya sarankan adalah apa pun yang menyebabkan programmer pemula terbiasa dengan kosakata lebih dari yang sudah ada. Programmer tidak membutuhkan lebih banyak kata; mereka membutuhkan lebih banyak keterampilan.
Robert Harvey
13
@einpoklum, glosarium tidak akan membantu di sini. Deskripsi kata 'nilai' cenderung terlalu teknis untuk pemula atau di sepanjang garis 'bahwa apa yang bisa di sisi kiri dari tugas' yang sama tidak membantu.
Bart van Ingen Schenau
26

Teknik yang relevan yang layak disebutkan adalah menggunakan kompiler kedua. Dentang telah berinvestasi dalam pesan kesalahan yang lebih baik, misalnya, tetapi cara alternatif untuk mengungkapkan kesalahan bisa mencerahkan.

Ini terutama terjadi untuk jenis kesalahan yang paling kompleks. Misalnya, ketika Anda mencampur dua konstruksi yang sama (tidak biasa untuk pemula), kompiler biasanya memiliki masalah dalam menghasilkan pesan kesalahan yang tepat. Ini dapat menyebabkan kebingungan ketika kompilator memberikan pesan kesalahan tentang penggunaan yang salah dari konstruk A ketika Anda benar-benar bermaksud membangun B. Kompiler kedua mungkin menyimpulkan bahwa yang Anda maksudkan B.

MSalters
sumber
13

Seseorang mencoba glosarium kesalahan GCC di Wikibooks beberapa waktu lalu, tetapi sepertinya tidak pernah benar-benar lepas landas dan belum diperbarui.

Bagian "Kesalahan" jauh lebih jauh daripada bagian "Peringatan". Sepertinya itu ditujukan untuk G ++, tetapi masih ada kemungkinan beberapa informasi berguna untuk teman Anda di sana.

nBurn
sumber
12

Selain jawaban di atas, perhatikan bahwa sebagian besar kompiler tidak memiliki daftar kesalahan yang komprehensif - ini akan banyak pekerjaan untuk mempertahankan karena pesan-pesan itu sendiri sering berubah, dan ada cukup banyak dari mereka.

Pengganti glosari terbaik adalah akses ke internet. Setiap kali kompiler menghasilkan kesalahan yang tidak Anda mengerti, merasa nyaman karena sangat kecil kemungkinan Anda yang pertama kali menjumpainya dan bingung. Google cepat dari pesan yang tepat sering cukup untuk memberi Anda banyak informasi dalam format yang mudah dibaca, sering dengan kode contoh sangat mirip dengan Anda.

Lebih dari itu, waktu dan keakraban dengan bahasa dan kompiler adalah semua yang Anda butuhkan. Itu, dan saran bagus yang diberikan oleh Karl Bielefeldt .

Dúthomhas
sumber
1
Saya tidak berpikir itu akan menjadi banyak pekerjaan untuk dipertahankan. Plus, itu dapat ditambahkan oleh publik, seperti Stackoverflow atau Wiki, dengan orang-orang tepercaya yang diberi izin editor.
einpoklum - mengembalikan Monica
6
@einpoklum Apakah Anda pernah melihat dokumen PHP? Itulah yang terjadi ketika Anda membiarkan komunitas mengurus hal-hal itu.
Kevin
4
Sekali waktu, manual yang diterbitkan (dicetak) adalah satu-satunya sumber daya yang tersedia. Mereka biasanya ditulis dengan cukup baik untuk memberikan informasi / panduan yang diperlukan untuk menyelesaikan masalah. Dengan evolusi internet, tidak ada yang menerbitkan di media cetak lagi (jika sama sekali, ini online). Kualitas bahan referensi "resmi" (on-line atau lainnya) telah menurun selama beberapa dekade yang saya pemrograman, sehingga sumber daya terbaik yang tersedia sering kali adalah Google, dan hasil yang paling berguna sering muncul di Stackoverflow.
Zenilogix
2
Bahkan jika glosarium benar - benar ada, mesin pencari mungkin merupakan cara terbaik untuk mengaksesnya. Mereka juga berguna untuk melihat ketika Anda berada di wilayah yang belum dipetakan: ketika satu-satunya hasil pencarian adalah kode sumber yang mendefinisikan pesan kesalahan;)
Warbo
2
Di perguruan tinggi, saya pernah mendapat kesalahan kompiler "Dave tidak berpikir ini akan terjadi. Silakan kirim email kepadanya di <[email protected]>". Saya mengirim email kepadanya dan sebenarnya saya adalah orang pertama yang menemukan kesalahan itu!
user1118321
6

Standar C menggunakan sejumlah istilah seperti "nilai" dan "objek" dengan cara yang berbeda dari bahasa pemrograman lain, dan pesan penyusun sering ditulis dalam istilah tersebut. Penggunaan terminologi tidak konsisten di beberapa bagian Standar, tetapi siapa pun yang ingin belajar C harus melihat draft standar C89, C99, dan / atau C11 serta dokumen rasional untuk mereka. Mencari mis. "C99 draft" atau "C89 rationale" harus bekerja dengan baik, meskipun Anda mungkin perlu memastikan Anda mendapatkan dokumen yang Anda harapkan. Meskipun sebagian besar penyusun mendukung Standar C99, mungkin berguna untuk mengetahui perbedaannya dari Standar C89, dan dasar pemikiran C89 mungkin menawarkan beberapa latar belakang historis yang tidak dimiliki oleh versi yang lebih baru.

supercat
sumber
11
Standar C adalah teks yang sangat padat dan berat. Seorang pemula tidak memiliki kesempatan untuk memahaminya.
NieDzejkob
4
@NieDzejkob: Terminologi yang digunakan oleh kompiler - yang sepertinya pertanyaannya - berasal dari Standar. Meskipun Anda benar bahwa bagian-bagian Standar tidak dapat dipahami (sebagian karena dirancang oleh komite, dan penulis tampaknya tidak memiliki pemahaman yang konsisten tentang apa yang seharusnya dimaksudkan oleh bagian itu), tetapi siapa pun yang ingin memahami apa istilah seperti "lvalue" berarti harus mengetahui dari mana asalnya. Lebih jauh, jika seseorang ingin memahami mengapa sesuatu seperti x=0x1e-xmenghasilkan kesalahan, saya benar-benar tidak tahu apa-apa selain Standar ...
supercat
3
Saya setuju dengan @NieDzejkob: Standar C bukan jenis teks yang Anda ingin hadapi oleh seorang pemula. Pemula membutuhkan pengalaman langsung yang positif dengan cepat . Dan mereka perlu mempelajari hal-hal baru satu per satu saat mereka muncul. Membaca standar atau alasan membutuhkan terlalu banyak waktu sementara benar-benar membanjiri pemula dengan informasi.
cmaster
2
@ cmaster: Saya mulai dengan C89 Standard yang lalu, dan itu tidak terlalu buruk bahkan di hari-hari sebelumnya browser dengan fitur 'find text' yang praktis. Saya akui bahwa standar belakangan menjadi semakin buruk. Sementara tidak ada yang harus mengandalkan Standar sebagai referensi tunggal, penting untuk mengenali perbedaan antara kebijaksanaan rakyat tentang bagaimana komputer mikro berperilaku, dan cara-cara yang Standar memungkinkan berperilaku berperilaku berkualitas rendah, sehingga seseorang akan siap jika memiliki untuk menangani yang terakhir.
supercat
3
@ cmaster: Bagaimanapun, seseorang yang memprogram C harus mengetahui tentang Standar, dan tahu bagaimana berkonsultasi ketika diperlukan, bahkan jika mereka tidak akan mencoba membaca semuanya. Jika seseorang melakukan pencarian web untuk fungsi pustaka standar, misalnya, seseorang dapat menemukan referensi yang menggambarkan perilaku satu implementasi dalam beberapa kasus sudut tanpa menyebutkan bahwa, dari sudut pandang Standar, kasus sudut tersebut melibatkan Perilaku Tidak Terdefinisi dan implementasi lainnya mungkin tidak bekerja dengan cara yang sama. Jika seseorang mencari Standar, seseorang dapat menghindari masalah itu.
supercat
5

Saya terkejut tidak ada yang memberikan jawaban yang jelas dan, saya curiga, yang paling sering digunakan dalam praktik: hanya saja tidak membaca pesan kesalahan.

Sebagian besar nilai dari sebagian besar pesan kesalahan hanyalah bahwa ada sesuatu yang salah pada baris ini dan itu. Sebagian besar waktu saya hanya melihat nomor baris dan pergi ke baris itu. "Pembacaan" saya tentang pesan kesalahan pada titik itu biasanya hanya apa pun yang menarik perhatian saya, bahkan bukan skim. Jika tidak segera jelas apa yang salah pada atau dekat garis, maka saya akan benar-benar membaca pesannya. Alur kerja ini bahkan lebih baik dengan IDE atau alat yang menyoroti kesalahan di tempat, dan secara otomatis menyelesaikan saran Karl Bielefeldt untuk hanya mempertimbangkan perubahan kecil.

Tentu saja, pesan kesalahan tidak selalu mengarah pada baris yang sesuai, tetapi kemudian mereka juga sering tidak menunjuk ke akar penyebab yang tepat, sehingga bahkan pemahaman penuh tentang pesan kesalahan akan sangat membantu. Tidak butuh waktu lama untuk mendapatkan gagasan tentang pesan kesalahan apa yang lebih dapat diandalkan untuk menemukan garis yang tepat.

Di satu sisi, sebagian besar kesalahan yang mungkin dilakukan oleh seorang pemula cenderung sangat jelas bagi seorang programmer berpengalaman tanpa bantuan dari kompiler yang diperlukan. Di sisi lain, mereka jauh lebih kecil kemungkinannya begitu jelas bagi pemula (meskipun banyak yang akan jelas, kebanyakan kesalahan adalah kesalahan bodoh). Pada titik ini saya sepenuhnya setuju dengan Robert Harvey, pemula hanya perlu menjadi lebih akrab dengan bahasa. Tidak ada cara untuk menghindarinya. Kesalahan penyusun yang merujuk konsep asing atau tampak mengejutkan harus dilihat sebagai petunjuk untuk memperdalam pengetahuan bahasa tersebut. Demikian pula untuk kasus di mana kompiler mengeluh tetapi Anda tidak dapat melihat mengapa kode salah.

Sekali lagi, saya setuju dengan Robert Harvey bahwa strategi yang lebih baik untuk memanfaatkan kesalahan kompiler diperlukan. Saya telah menguraikan beberapa aspek di atas dan jawaban Robert Harvey memberi aspek lain. Bahkan tidak jelas apa yang diharapkan teman Anda untuk dilakukan dengan "glosarium" seperti itu, dan sangat tidak mungkin "glosarium" semacam itu akan sangat berguna bagi teman Anda. Pesan kompiler tentu bukan tempat untuk pengantar konsep bahasa 1 dan "glosarium" bukanlah tempat yang lebih baik untuk itu. Bahkan dengan deskripsi yang jelas tentang apa arti pesan kesalahan, itu tidak akan memberi tahu Anda cara memperbaiki masalah.

1 Beberapa bahasa, seperti Elm dan Dhall (dan mungkin Racket), serta beberapa implementasi bahasa "berorientasi pemula" berusaha melakukan hal ini. Dalam nada ini, saran MSalters untuk menggunakan implementasi yang berbeda relevan secara langsung. Saya pribadi menemukan hal-hal semacam itu tidak menarik dan tidak cukup ditujukan pada masalah yang tepat. Ini bukan untuk mengatakan bahwa tidak ada cara untuk membuat pesan kesalahan yang lebih baik, tetapi, bagi saya, mereka cenderung berputar membuat kepercayaan kompiler dan dasar dari kepercayaan itu menjadi lebih jelas.

Derek Elkins
sumber
4

Jadi, bagaimana seharusnya seorang programmer pemula mendekati tantangan memahami pesan kesalahan kompiler? Secara khusus, dengan kombinasi C dan GCC?

Beri tahu teman Anda untuk melakukan hal berikut saat menemukan kesalahan yang tidak mereka pahami:

  • Hapus / komentar kode yang ditambahkan sejak build terakhir yang berhasil.
  • Pasang kembali sebagian kecil dan kompilasi
  • Ulangi sampai kesalahan terjadi

Kesalahan kompiler hanya memberi tahu Anda apa yang tidak dipahami oleh kompiler tentang kode Anda, bukan apa yang salah dengannya. Pendekatan ini membutuhkan waktu yang kira-kira sama dengan Googling kesalahan dan membaca beberapa dokumen atau posting StackOverflow, tetapi memberikan pemahaman yang jauh lebih baik tentang apa yang Anda lakukan salah.

Juga buat mereka sering dikompilasi sampai mereka mulai mengerjakan proyek yang membutuhkan waktu beberapa menit untuk membangun, menemukan kesalahan sebelum menambahkan terlalu banyak kode lain banyak membantu.

Akhirnya, suruh mereka untuk mengerjakan satu hal pada satu waktu, jangan bekerja di banyak file tanpa kompilasi di antaranya, jangan memperkenalkan beberapa dependensi sekaligus, dll.

Kevin
sumber
4

Teknik lain adalah agar teman itu menulis glosariumnya sendiri dari waktu ke waktu ketika dia menemukan pesan kesalahan yang berbeda. Seringkali cara terbaik untuk mempelajari sesuatu adalah dengan mengajarkannya. Tentu saja, pada saat glosarium selesai, dia mungkin tidak akan membutuhkannya lagi.

Pengalaman pribadi saya dengan GCC adalah bahwa setiap pesan kesalahan berhubungan dengan serangkaian kesalahan "biasa". Misalnya, ketika GCC mengatakan "apakah Anda lupa &" itu biasanya berarti saya lupa tanda kurung. Tentu saja, kesalahan mana yang sesuai dengan pesan kesalahan mana yang akan tergantung pada programmer, alasan lain yang baik bagi teman tersebut untuk menulis glosariumnya sendiri.

Owen
sumber
1
Dokumen ini memiliki manfaat sampingan yang sangat penting sehingga dapat ditempatkan online (bahkan jika hanya memiliki 5-10 entri) dan akan menjadi pembeda yang baik ketika melamar magang.
Josh Rumbut