Acemi programcı (lar), derleyici hataları sözlüğünün eksikliği yüzünden engelleniyor


66

Ailemin bir arkadaşı, programlamayı öğrenirken benden biraz yardım istedi. (C dilinde). Biz konuşurken, derleyicisinin (GCC) hata yaptığında verdiği hata mesajlarını anlamakta zorlanmanın sıkıntısı olduğunu dile getirdi. Kullanılan tüm terimleri anlamıyor ve bazen anlamalarının ötesinde onların kombinasyonu. Bana "Derleyici belgeleri neden hata mesajlarıyla ilgili daha uzun açıklamalar içermiyor?" Diye soruyordu. - ve onun için iyi bir cevabım yoktu.

Ben kendim - daha deneyimli bir programcı olarak - çok nadiren bu durumdayım, ancak bu nadir olaylar oluyor - daha önce karşılaşmadığım egzotik bir hata mesajı. Bir arama motorunda hata mesajını arayarak uğraşmayı başardım, ancak görünüşe göre bu her zaman işe yaramadı - özellikle karşılaştığı hatalar daha yaygın olduğu ve kendisiyle ilgili sorun yaşadığı birden fazla farklı durumda ortaya çıktığı için kendi.

Peki acemi bir programcı, derleyici hata mesajlarını anlama zorluğuna nasıl yaklaşmalıdır? Spesifik olarak, C ve GCC kombinasyonu ile?


7
“Peki, acemi bir programcı, derleyici hata mesajlarını anlama zorluğuna nasıl yaklaşmalı?” / alaycı İhtiyaç duyulacak ilk beceri, derleyici mesajından her biti okuyabilmek, bağlamla ilişkilendirmek de dahil olmaktır. iğneleyici. Derleyicide bir kusur veya hata olduğu nadiren görülür.
ῥεῖ πάντα

10
@MasonWheeler: Bir acemi genellikle eğitim alırken hangi derleyiciyi kullanacağını seçmez. Ve GCC birçok, birçok sistemin ortak paydasıdır ...
einpoklum

24
GCC C ++ şablon hataları söz konusu olduğunda, "Hata <dosya: satır>" dan sonra okumayı bırakıp bırakmadığımı bulup kaynak dosyaları inceledim, aklımı koruduğumun yan etkisi ile hatayı daha hızlı buluyorum. GCC ..... tarafından verilen asıl hatayı
okursam

18
Çözüm açıktır: Daha az kafa karıştırıcı çıkışı olan bir derleyici kullanın. Rmcc'yi öneririm . Kodunuz derlenip derlenmediğine bağlı olarak Yes.veya yazdırır No.. Anında hayal kırıklığını, uzun ve anlamsız mesajları anlamamaktan kurtarır!
boru

21
C yeni başlayanlar için iyi bir dil değil - ve bunun nedenlerinden birini tökezlediniz. Olduğu söyleniyor, Clang, yeni başlayanlar için daha çekici olabilecek daha iyi hatalar sunma eğilimindedir.
Theodoros Chatzigiannakis

Yanıtlar:


164

Birkaç faydalı teknik:

  • Açın -Wallve -Werror. Daha da fazla hata mesajı oluşturmak için hata mesajlarını deşifre etmekle uğraşırken, bu durumun sezgisel görünmesine neden olabilir , ancak uyarılar genellikle sorunun asıl kaynağını anlamak ve onlara daha yakın olmak ve bunları görmezden gelmek anlaşılması zor hatalara yol açabilir .
  • Sadece listedeki ilk hatayı düzeltmeye çalışın. Genellikle hatalar birbirine karışır ve sonraki hata mesajlarının gerçekten gerçek hatalar olmamasına yol açar. Birini düzeltin ve yeniden derleyin. Daha fazla deneyim edindiğinizde birden fazla hata iletisini düzeltmekte daha iyi olursunuz.
  • Mümkün olan en yeni derleyici sürümünü kullanın. C son derece kararlı bir dildir. Bu nedenle, yeni derleyicilerdeki gelişmelerin büyük bir kısmı dil özellikleri eklemek değil, daha iyi hata mesajları dahil olmak üzere geliştirici deneyimini geliştirmek. Yaygın olarak kullanılan birçok linux dağıtımı, varsayılan olarak çok eski gcc sürümlerine sahiptir.
  • Artımlı olarak programlayın. Derlemeden önce bir ton kod yazmaya çalışmayın. Hala derlenecek en kısa miktarı yazınız. Son derleme işleminden bu yana yalnızca bir satırı değiştirdiyseniz, asıl sorunu içeren çizgiyi bulmak çok daha kolaydır.
  • Birim testleri yaz. Derleme hatalarını düzeltirken yeniden yapılanma değişikliklerini açıklığa kavuşturmak için size daha fazla güven veriyor.

23
İyi bir IDE, örneğin deneyime büyük ölçüde yardımcı olabilir. kırmızı alt çizgi hataları.
BlueRaja - Danny Pflughoeft

86
"Artımlı olarak programlayın. Derlemeye başlamadan önce bir ton kod yazmaya çalışmayın. Hala derleyebilecek en kısa miktarı yazın. En son derlediğinizden beri yalnızca bir satır değiştirdiyseniz, anlaşılması çok daha kolaydır. Hangi satırda asıl sorun var? " Bu, bu çok fazla. Ayrıca çoğu IDE derlenmeyecek bir kod yazarsanız sizi uyarır ve hataları işaret eder.
Polygnome

4
@ einpoklum: üçüncü seçeneği küçümseme; derleyici hata mesajları çok gelişti. Benzer bir damarda, birkaç derleyici kullanın (örn. Gcc ve clang) - daha fazla hata / uyarı yakalar ve bunlardan biri belirli bir konu için diğerinden daha iyi bir tanıya sahip olabilir.
Mat,

19
@ einpoklum: Her şeyi daha fazla yazmak , özellikle yeni başlayanlar için çok önemlidir . Heck, "kısa programlama ödevlerinin" aşamalı olarak yapılamayacağına inanıyorsanız, bunları birkaç küçük fonksiyona bölerek ve tek tek uygulayıp derleyerek, bu beceriyi kendiniz için geliştirmeye çalışmalısınız ..
Doc Brown

4
Bana yardımcı olan bir püf noktası: eğer hata mesajı Hat N’den bahsediyorsa, Hat N-1’e bakın. Örneğin, 17. satırda bir noktalı virgül eksikse, hata mesajı 18. satırda yanlış bir şey olduğunu söyler. Bunun nedeni, derleyicinin bir noktalı virgül beklemesi ancak bunun yerine bir sonraki satırda başka bir şey almasıdır.
user2023861 21:18

56

Arkadaşınızın bir sözlüğe ihtiyacı yok. Bir sözlük ona yardım etmeyecek. Onun ihtiyacı olan derleyici hataları meydana geldiğinde yapmanız gerekenler hakkında daha iyi sezgi.

C derleyici hataları, C # derleyici hataları kadar sezgisel değildir, çoğu zaman C'nin "metale yakın" doğası ile ilgili olan birçok nedenden ötürü, C'deki derleyici hatalarının çözülmesi bir kalıp eşleştirme alıştırması değildir, çünkü Alma asıl sorunla ilgisi olmayabilir. Bir hata iletisinin tipik olarak kesin bir kod konumuna ve soruna eşleştiği C # veya Java'nın aksine, C'deki hataların çok sayıda ve daha uzakta olması muhtemeldir.

Buna bir örnek "noktalı virgül bekleniyor" veya ayrıştırıcının bir şey üzerine asılı olduğunu gösteren herhangi bir sayıda sözdizimi hatası olabilir (zorunlu olarak noktalı virgül değil). Ya da "beklenmeyen iletme bildirimi" gibi bir hata, bunu gördüğümde, .h dosyalarımın birinde yanlış büyük harfle yanlış yaptığım anlamına gelir, ancak sorunun kaynağı olarak .h dosyasına işaret etmez.

Arkadaşınızın stratejisi, bunu bir dizi hata ve çözümle eşleştirmek için olmamalıdır; Asıl sorunun ne olduğunu anlamak için C dilinin sözdizimini ve teknik özelliklerini iyi anlamak gerekir .


17
Hayır. Fikir, sayısal bir ifadeye atama yapamayacağınızı, ancak yalnızca bir değişkeni atayamayacağınızı bilmek için dili yeterince iyi tanımaktır. Hiç bir değerin ne olduğunu bilmek zorunda değilsiniz, bu yüzden bunu acemi derslerde öğretmiyorlar.
Robert Harvey

18
Esasen, evet. Ancak pratikte bu mümkün değil. Bunu çok uzun zamandır yapıyorum ve her C programını yazarken hala derleyici hata mesajları alıyorum. Bununla birlikte, nadiren bu mesajları okumaktan ve onları anlamaya çalışmaktan rahatsızım; bunun yerine, hata mesajının nereye işaret ettiğine bakıyorum ve bir C programının temel sözdizimi yapısının nasıl görünmesi gerektiğini bildiğim için, hata mesajlarını deşifre etmek için zaman harcamadan sorunu nispeten hızlı bir şekilde tespit edebiliyorum.
Robert Harvey

36
Başka bir deyişle, derleyici hatalarını anlama sözlüğünü istemek biraz İngilizce dilini anlamak için sözlüğü okumak gibidir; İşler böyle değil. İngilizceyi, sözlük okuyarak değil, yazarak ve okuyarak anlarsınız.
Robert Harvey

14
[shrug] İngilizce olarak zaten var olan İngilizce bilginizi desteklemek için bir sözlük kullanmıyorsanız , yanlış yaptığınızı öneririm. Önereceğim son şey acemi programcıların kelime hazinelerine olduğundan daha fazla kelime takılmasına neden olan herhangi bir şey. Programcılar daha fazla kelimeye ihtiyaç duymazlar; daha fazla beceriye ihtiyaçları var.
Robert Harvey

13
@ einpoklum, bir sözlük burada yardımcı olmayacak. “Değer” kelimesinin açıklaması yeni başlayanlar için çok teknik olabilir veya 'işe yaramaz olan' bir ödevin sol tarafında ne olabileceği 'satırları boyunca çok teknik olabilir.
Bart van Ingen Schenau

26

Bahsetmeye değer ilgili bir teknik ikinci bir derleyici kullanıyor. Clang, örneğin daha iyi hata mesajlarına yatırım yaptı, ancak hatayı ifade etmenin alternatif bir yolu aydınlatıcı olabilir.

Bu özellikle en karmaşık hatalar için geçerlidir. Örneğin, iki benzer yapıyı karıştırdığınızda (yeni başlayanlar için olağandışı değil), derleyiciler tipik olarak doğru hata mesajını oluştururken bir sorunla karşılaşır. Bu, derleyici B'yi gerçekten amaçladığınızda B yapısının yanlış kullanımı hakkında bir hata mesajı verdiğinde karışıklığa neden olabilir.


13

Bir süre önce Wikibook’larda bir GCC hata sözlüğü için bir girişimde bulunmuş , ancak hiçbir zaman tam olarak çalınmamış ve güncellenmemiş gibi görünüyor.

"Hatalar" bölümü, "Uyarılar" bölümünden çok daha ileridedir. Görünüşe göre G ++ 'ya hedeflenmiş, ancak arkadaşınızın orada kullanımına ilişkin bazı bilgiler olması muhtemel.


12

Yukarıdaki cevaplara ek olarak, çoğu derleyicinin kapsamlı hata sözlüğü olmadığına dikkat edin - bunlar mesajların kendileri sıklıkla değiştikçe sürdürülmesi gereken çok iş olacaktır ve bunlardan birçoğu vardır.

Bir sözlük için en iyi alternatif internete erişimdir. Derleyici anlamadığınız bir hata ürettiğinde, karşılaştığınız ve kafanız karışan ilk kişi olmanızın muhtemel olmadığından emin olun. Kesin mesajın hızlı bir Google'ı, genellikle, kendinize çok benzeyen örnek kodla, okunması kolay formatta bol miktarda bilgi vermek için yeterlidir.

Bunun ötesinde, zamana ve dile ve derleyiciye aşinalık yeter. Bu ve Karl Bielefeldt tarafından verilen iyi tavsiyeler .


1
Korunması gereken çok iş olacağını sanmıyorum . Buna ek olarak, Stackoverflow veya Wiki gibi halk tarafından editör izinleri verilen güvenilir insanlarla eklenebilir.
einpoklum

6
@einpoklum Hiç PHP docs gördünüz mü? Topluluğun bu şeylerle ilgilenmesine izin verdiğinde olan budur.
Kevin,

4
Bir zamanlar, yayınlanan (basılı) kılavuzlar mevcut olan tek kaynaktı. Genellikle bir sorunu çözmek için gerekli bilgileri / rehberliği sağlayacak kadar iyi yazılmışlardır. İnternetin evrimi ile, artık hiç kimse baskıda yayınlamıyor (eğer çevrimiçi ise). “Resmi” referans materyalinin kalitesi (çevrimiçi veya başka şekilde), programladığım on yıllar boyunca önemli ölçüde düşmüştür, bu nedenle mevcut en iyi kaynak genellikle Google'dır ve en faydalı sonuçlar genellikle Stackoverflow'ta ortaya çıkar.
Zenilogix

2
Bir sözlük bile gelmez var, arama motorları bunlara erişmek için en iyi yol olabilir. Bunlar keşfedilmemiş
bölgedeyken

2
Üniversitede, bir keresinde "Dave bunun olması gerektiğini düşünmüyor. Lütfen ona <dave@example.com> adresinden e-posta gönderin" derleyici hatası aldım. Ona e-posta atmıştım ve aslında o hatayı ilk gören benim oldu!
user1118321

6

C Standardı, "programlama" ve "nesne" gibi bir takım terimleri diğer programlama dillerinden farklı şekillerde kullanır ve derleyici mesajları genellikle bu terimlerle yazılır. Terminolojinin kullanımı Standardın bazı bölümlerinde tutarsız olmakla birlikte, C öğrenmek isteyen herkes C89, C99 ve / veya C11 standartlarının taslaklarına ve ayrıca kendilerine ilişkin mantık belgelerine bakmalıdır. Örneğin "C99 taslak" veya "C89 gerekçesi" aranıyor, ancak beklediğiniz belgeyi aldığınızdan emin olmanız gerekebilir. Her ne kadar çoğu derleyici C99 Standardını desteklese de, bunun C89 Standardından ne kadar farklı olduğunu bilmek faydalı olabilir ve C89 gerekçesi, daha sonraki sürümlerde bulunmayan bazı tarihsel geçmişlere sahip olabilir.


11
C standardı çok yoğun ve ağır bir metindir. Bir aceminin bunu anlama şansı yok.
NieDzejkob

4
@NieDzejkob: Derleyicilerin kullandığı terminoloji - sorunun ne anlama geldiği gibi - bu standarttan türemiştir. Standardın bazı kısımlarının anlaşılmaz olduğunu (kısmen komite tarafından tasarlandığından ve yazarların hangi kısımlarının ne anlama gelmesi gerektiğine dair tutarlı bir anlayışa sahip görünmedikleri için) haklıyken, "değer" gibi terimler nereden geldiklerini bilmelidir. Ayrıca, biri neden bir şeyin x=0x1e-xhata verdiğini anlamak isterse , Standart'tan başka bir şey bilmiyorum ...
supercat

3
@NieDzejkob ile aynı fikirdeyim: C standardı bir acemiyle yüzleşmek istediğiniz türden bir metin değildir. Yeni başlayanlar hızlı bir şekilde olumlu deneyimler edinmelidir . Ve ortaya çıktıkça yeni şeyleri tek tek öğrenmeye ihtiyaçları var. Bir standardın veya gerekçenin okunması, bilgi sahibi bir çocuğa tamamen aşırı yüklenirken çok fazla zaman alır.
cmaster

2
@cmaster: Yıllar önce C89 Standardına başladım ve kullanışlı bir 'metin bulma' özelliğine sahip tarayıcılardan önceki günlerde bile fena değildi. Daha sonraki standartların daha da kötüye gittiğini kabul edeceğim. Hiç kimse Standard'a tek referans olarak güvenmemelidir, ancak mikrobilgisayar derleyicilerinin nasıl davrandığına dair halk bilgeliği ile Standardın düşük kaliteli davranışların nasıl davranmasına izin verdiği arasındaki farkın farkına varmak önemlidir; ikincisi ile başa çıkmak için.
supercat

3
@cmaster: Her halükarda, C'yi programlayan birinin Standartları bilmesi ve her şeyi okumaya çalışmasalar bile gerektiğinde nasıl danışılacağını bilmesi gerekir. Örneğin, standart bir kütüphane işlevi için bir web araması yaparsa, örneğin, bazı bakış açılarından bazı durumlarda, bir uygulamanın davranışını tanımlayan bir referans bulabiliriz; aynı şekilde çalışma. Eğer biri Standart'ı ararsa, bu problemden kaçınılabilir.
supercat

5

Kimsenin bariz cevap vermemesine şaşırdım ve pratikte en sık kullanılanlardan şüpheleniyorum: sadece hata mesajlarını okumayın.

Çoğu hata mesajının değerinin büyük çoğunluğu basitçe böyle bir hatta bir şeylerin yanlış olduğudur. Çoğu zaman sadece satır numarasına bakarım ve o satıra giderim. Bu noktada hata mesajını "okuduğumda" genellikle sadece gözümün geçerken yakaladığı şey değil, bir yağsız bile değil. Satır üzerinde veya yakınında neyin yanlış olduğu hemen belli değilse, o zaman mesajı okurum. Bu iş akışı, yerinde hataları vurgulayan bir IDE veya aletle daha da iyidir ve Karl Bielefeldt'in sadece küçük değişiklikleri düşünmek için önerisini otomatik olarak yerine getirir.

Kuşkusuz, hata mesajları her zaman uygun satırı göstermez, ancak daha sonra çoğu zaman uygun kök nedenini de göstermezler, bu nedenle hata mesajının tam olarak anlaşılması bile sınırlı bir yardımcı olacaktır. Doğru satırı bulma konusunda hangi hata mesajlarının daha güvenilir olduğu hakkında bir fikir edinmek uzun zaman almaz.

Bir yandan, bir aceminin yapması muhtemel olan hataların çoğunun , derleyiciden yardım gerekmeden deneyimli bir programcı için acı verici bir şekilde anlaşılması muhtemeldir . Diğer taraftan, acemiler için bu kadar açık olma ihtimalleri çok daha düşüktür (çoğu kişi açıkça görülse de, çoğu hata aptalcadır). Bu noktada Robert Harvey ile tamamen aynı fikirdeyim, aceminin diline daha aşina olması gerekiyor. Bundan kaçınmak yok. Bilmediğiniz kavramlara referans veren veya şaşırtıcı görünen derleyici hataları, dilin bilgisini derinleştirmek için bir ipucu olarak görülmelidir. Benzer şekilde, derleyicinin şikayet ettiği durumlar için de ancak kodun neden yanlış olduğunu göremiyorsunuz.

Yine, Robert Harvey ile derleyici hatalarını kullanmak için daha iyi bir stratejinin gerekli olduğu konusunda hemfikirim. Yukarıda bazı yönleri ana hatlarıyla belirttim ve Robert Harvey'in cevabı başka yönler de veriyor. Arkadaşınızın böyle bir "sözlük" ile ne yapmayı umduğu bile net değildir ve böyle bir "sözlük" in aslında arkadaşınız için çok faydası olmaz. Derleyici mesajları kesinlikle 1. dil kavramlarına giriş için bir yer değildir ve bir “sözlük” bunun için daha iyi bir yer değildir. Hatta hata mesajı ne anlama geldiğini berrak bir bilgi ile, nasıl söyleyeceğim vermeyecek düzeltmek sorunu.

1 Elm ve Dhall (ve muhtemelen Raket) gibi bir kaç dilde olduğu gibi, bazı "başlangıç ​​seviyesine yönelik" dil uygulamaları da bunu yapmaya çalışır. Bu bağlamda, MSalters'ın farklı bir uygulamayı kullanma tavsiyesi doğrudan ilgilidir. Şahsen böyle şeyleri çekici bulmuyorum ve doğru soruna yönelik değil. Bu, daha iyi hata mesajları yapmanın bir yolu olmadığını söylemek değildir, ancak bana göre derleyicinin inançlarını ve bu inançların temelini daha açık hale getirme eğilimindedir.


4

Peki acemi bir programcı, derleyici hata mesajlarını anlama zorluğuna nasıl yaklaşmalıdır? Spesifik olarak, C ve GCC kombinasyonu ile?

Arkadaşınıza bir hatayla karşılaştığında aşağıdakileri yapmalarını söyleyin.

  • Son başarılı oluşturma işleminden bu yana eklenen kodu kaldırın / yorum yapın.
  • Küçük parçalarını geri koyun ve derleyin
  • Hata oluşana kadar tekrarlayın

Derleyici hataları, derleyicinin kodunuzla ilgili neyi anlamadığını söyler, yanlış olanı değil. Bu yaklaşım kabaca Googling ve bazı dokümanları veya bir StackOverflow gönderisini okumakla aynı miktarda zaman alır, ancak ne yaptığınızla ilgili daha iyi bir fikir verir.

Ayrıca çok fazla kod eklemeden önce hataların farkına varmak, birkaç dakika süren projeler üzerinde çalışmaya başlayana kadar sık ​​sık derlenmelerini sağlar.

Sonunda, bir kerede bir şey üzerinde çalışmalarını, aralarında derleme yapmadan birden fazla dosyada çalışmalarını, bir kerede birden fazla bağımlılık oluşturmalarını vb. Söyleyin.


4

Başka bir teknik ise arkadaşın zaman içinde farklı hata mesajları ile karşılaştığı zaman kendi sözlüğünü yazması olacaktır. Genellikle bir şeyi öğrenmenin en iyi yolu, onu öğretmektir. Tabii ki, sözlük yapıldığı zaman, muhtemelen artık ona ihtiyacı kalmayacak.

GCC ile ilgili kişisel deneyimim, her hata mesajının "olağan" bir hatalar dizisiyle ilgili olduğudur. Örneğin, GCC "&’ yi unuttun mu "dediğinde, genellikle parantezleri unuttuğum anlamına gelir. Elbette, hangi hataların hangi hata mesajlarının programlayıcıya bağlı olacağı, arkadaşın kendi sözlüğünü yazması için iyi bir sebep olacaktır.


1
Bu belge, çevrimiçi hale getirilebilmesi (sadece 5-10 giriş olsa bile) çok önemli bir yan faydaya sahiptir ve staj başvurusunda bulunurken çok büyük bir farklılık yaratacaktır.
Josh Rumbut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.