Derleyiciler nasıl bu kadar güvenilirdir?


62

Derleyicileri, doğrulukları verilen bir şeymiş gibi günlük olarak kullanıyoruz, ancak derleyiciler de programdır ve potansiyel olarak hata içerebilir. Bu yanılmaz sağlamlığı hep merak etmişimdir. Derleyicinin kendisinde bir hatayla karşılaştınız mı? Bu neydi ve sorunun derleyicinin kendisinde olduğunu nasıl anladınız?

... ve nasıl yapmak onlar derleyiciler kadar güvenilir hale?


16
İçindeki derleyiciyi derliyorlar ...
Michael K

31
Yanılmaz değiller. Derleyici hatalar var - sadece çok nadir görülürler.
ChrisF

5
Kod yığınını indirdiğinizde hatalar daha az olur: uygulama hataları, derleyici hatalarından daha yaygındır. Derleyici hataları CPU (microcode) hatalarından daha yaygındır. Bu aslında iyi bir haber: Etrafında başka bir yol olup olmadığını hayal edebiliyor musunuz?
Fixee

Bir derleyici nasıl gözlemleyerek bir şeyler öğrenebilirsin yapar hataların çok şey var (SDCC gibi!) Çok daha sağlam ve güvenilir olduğunu gcc gibi bir derleyici farklıdır.
Ben Jackson

Yanıtlar:


96

Zaman içinde binlerce hatta milyonlarca geliştirici tarafından kullanımıyla iyice test edilirler.

Ayrıca, çözülecek sorun iyi tanımlanmıştır (çok ayrıntılı bir teknik şartname ile). Ve görevin doğası kolaylıkla birim / sistem testlerine borç verir. Başka bir deyişle, iyi tanımlanmış başka bir formatta (bir çeşit bytecode veya makine kodu) çıktısı almak için metinsel girişi çok spesifik bir formatta çevirmek. Bu nedenle test durumları oluşturmak ve doğrulamak kolaydır.

Ayrıca, genellikle böceklerin de çoğaltılması kolaydır: kesin platform ve derleyici sürüm bilgisi dışında, genellikle tek ihtiyacınız olan bir giriş kodu parçasıdır. Derleyici kullanıcılarının (geliştirici olarak kendileri) ortalama bir bilgisayar kullanıcısından çok daha kesin ve ayrıntılı hata raporları verme eğiliminde olduklarından bahsetmiyorum bile :-)


32
Ayrıca, derleyici kodunun çoğunun muhtemelen doğru olduğu kanıtlanabilir.
biziclop

@biziclop, iyi nokta, bu görevin özel yapısının bir başka sonucudur.
Péter Török

İlk tam derleyici 1957'de FORTRAN dili için John Backus tarafından yazılmıştır. Öyleyse, görüyorsunuz, derleyici teknolojisi 50 yaşın üzerinde. Derleyicilerde hatalar olsa da, diğerlerinin de belirttiği gibi, düzeltmek için oldukça zaman harcadık.
leed25d

Aslında, bizzoplop, lexers ve parser gibi bazı bileşenler bile gramerden otomatik olarak üretilebilir, bu da yine böcek riskini azaltır (lexer / parser jeneratörünün sağlam olması şartıyla - bunlar genellikle yukarıda belirtilen sebeplerle aynıdır) .
Péter Török

2
@ Péter: Lexer / ayrıştırıcı jeneratörler daha yaygın olarak kullanılan derleyicilerde oldukça nadir görünmektedir - çoğu, söz konusu dilin yeterince akıllı ayrıştırıcı / lexer jeneratörlerinin hızı ve eksikliği de dahil olmak üzere çeşitli nedenlerle elle lexer ve ayrıştırıcıyı yazar (örn. C ).

61

Şimdiye kadar yapılan tüm büyük cevaplara ek olarak:

Bir "gözlemci önyargınız" var. Böcekleri gözlemlemiyorsunuz ve bu nedenle hiç olmadığını varsayıyorsunuz.

Senin gibi düşünürdüm. Sonra derleyicileri profesyonelce yazmaya başladım ve size söyleyeyim, içeride çok fazla böcek var!

Hataları görmüyorsunuz, çünkü insanlar yazdığınız kodun geri kalanının% 99.999'u gibi bir kod yazıyorsunuz. Muhtemelen tamamen normal, anlaşılır ve net bir şekilde doğru kod yazıyorsunuz, bu da yöntemleri çağırıyor ve döngüleri çalıştırıyor ve normal veya işle ilgili problemleri çözen normal bir geliştirici olduğunuz için fantezi veya tuhaf bir şey yapmıyor.

Herhangi bir derleyici hatası görmüyorsunuz, çünkü derleyici hataları, basit normal kod senaryolarının analizi kolay değildir; Hatalar, yazmadığınız tuhaf kodların analizinde.

Öte yandan, karşıt gözlemci önyargısına sahibim. Her gün bütün gün çılgın kod görüyorum ve bu yüzden bana derleyiciler hatalarla dolu gözüküyor.

Herhangi bir dilin dil spesifikasyonuna uyduysanız ve bu dil için herhangi bir derleyici uygulaması yaptıysanız ve gerçekten derleyicinin tam olarak uygulayıp uygulamamayı, karanlık köşe vakalarına yoğunlaşarak karar vereceğinizi belirlemek için çok çaba sarf ettiyseniz derleyici sık sık hata veriyor. Size bir örnek vereyim, işte tam anlamıyla beş dakika önce bulduğum bir C # derleyicisi hatası.

static void N(ref int x){}
...
N(ref 123);

Derleyici üç hata veriyor.

  • Bir ref veya out argümanı atanabilir bir değişken olmalıdır.
  • N (ref int x) için en iyi eşleşmenin geçersiz argümanları var.
  • 1. argüman üzerinde "ref" eksik.

Açıkçası, ilk hata mesajı doğrudur ve üçüncüsü bir hatadır. Hata üretme algoritması, ilk argümanın neden geçersiz olduğunu anlamaya çalışıyor, ona bakıyor, sabit olduğunu görüyor ve "ref" olarak işaretlenip işaretlenmediğini kontrol etmek için kaynak koduna geri dönmüyor; bunun yerine, bir sabiti ref olarak işaretlemek için yeterince aptalca olamayacağını ve ref'nin eksik olması gerektiğine karar verdiğini varsayar.

Doğru üçüncü hata mesajının ne olduğu belli değil, ama bu değil. Aslında, ikinci hata mesajının da doğru olup olmadığı açık değildir . Aşırı yüklenme çözünürlüğü arızalanmalı mı, yoksa "ref 123" doğru tipte bir argüman olarak değerlendirilmeli midir? Şimdi biraz düşünmem ve doğru davranışın ne olduğunu belirleyebilmemiz için triyaj ekibiyle konuşmam gerekecek.

Bu hatayı hiç görmediniz, çünkü muhtemelen 123'ü ref ile geçmeye çalışmak kadar aptalca bir şey yapmazsınız. Ve yaptıysanız, muhtemelen ilk hata mesajının saçma sapan olduğunu farketmezsiniz, çünkü ilki doğru ve sorunu teşhis etmek için yeterlidir. Ama böyle şeyler yapmaya çalışıyorum çünkü derleyiciyi kırmaya çalışıyorum . Eğer deneseydin, böcekleri de görürsün.


4
İlki sonra iyi hata mesajları yapmak çok zor.

Sureöy'de daha iyi harcanan enerji olmalı, sonra derleyicileri tamamen "aptal" suya dayanıklı hale getirin :)
Homde

2
@MKO: Tabii ki. Bir sürü hata çözülmez. Bazen düzeltme çok pahalıdır ve senaryo o kadar belirsizdir ki, maliyet faydalarla haklı çıkmaz. Ve bazen de yeteri kadar insan bunu sürdürmeye devam etmen gereken "araba" davranışına güvenmeye başlamış.
Eric Lippert

mmm ... hata mesajlarıyla sonuçlanan hatalar "iyi" dir. Kodu çalıştırmak için her zaman biraz kodlama yapmak mümkündür. Derleyicinin kaynak kodunu kabul ettiği ve "yanlış" assmebly çıktısı ürettiği hatalardan ne haber? Bu korkutucu
Gianluca Ghettini

7
@ aij: "açıkça yasal C # kodu" anlamında doğru. Örneğin, bir arayüzün bir özelliği olduğu, diğerinin mülk ile aynı isimde bir yöntemi olduğu iki arayüzü alan bir arayüz içeren bir program yazdınız mı? Çabuk, spec bakmadan: Bu yasal mı? Şimdi bu yöntemi aradığınızı varsayalım; belirsiz mi Ve bunun gibi. İnsanlar her zaman ne anlama geldiklerini yapmayan bir kod yazarlar. Ancak, nadiren C # bile olsa yasal olduğunu söylemek için uzman bir uzman olmanız gereken yere kod yazarlar.
Eric Lippert

51

Benimle dalga mı geçiyorsun? Derleyicilerde de hatalar var, gerçekten yükler.

GCC muhtemelen gezegendeki açık kaynak kodlayıcıların en ünlüsü ve hata veritabanına bir göz atıyor: http://gcc.gnu.org/bugzilla/buglist.cgi?product=gcc&component=c%2B%2B&resolution=-- -

GCC 3.2 ve GCC 3.2.3 arasında kaç tane hatanın giderildiğine bir bakın: http://gcc.gnu.org/gcc-3.2/changes.html

Visual C ++ gibi diğerleri için, başlamak bile istemiyorum.

Derleyicileri nasıl güvenilir hale getirirsiniz? Pekala, başlangıç ​​için yükleri ve birim testleri yükleri var. Ve tüm gezegen onları kullanıyor, bu yüzden testçilerden hiç hoşlanmıyor.

Cidden, derleyici geliştiricilerinin üstün programcılar olduğuna ve yanılmaz olmamalarına rağmen bir yumrukta toplandıklarına inanmaktan hoşlanıyorum.


19

Günümde iki veya üç taneyle karşılaştım. Birini tespit etmenin tek gerçek yolu derleme koduna bakmaktır.

Her ne kadar derleyiciler diğer posterlerin belirttiğinden dolayı oldukça güvenilir olsalar da, derleyicinin güvenilirliğinin genellikle kendi kendini tatmin eden bir değerlendirme olduğunu düşünüyorum. Programcılar derleyiciyi standart olarak görme eğilimindedir. Bir şeyler ters gittiğinde, bunun sizin suçunuz olduğunu kabul edersiniz (çünkü zamanın% 99,999'u) ve kodunuzu başka bir yoldan ziyade derleyici problemi etrafında çalışacak şekilde değiştirin. Örneğin, yüksek bir optimizasyon ayarında kod çökmesi kesinlikle bir derleyici hatasıdır, ancak çoğu kişi sadece biraz daha düşük bir seviyeye ayarlayıp hatayı bildirmeden devam eder.


6
"Derleyiciyi standart olarak görüntüleme" için +1. Bir dili gerçekten tanımlayan iki şey olduğunu uzun süredir sürdürmüştüm: derleyici ve standart kütüphane. Standartlar belgesi sadece dokümantasyondur.
Mason Wheeler

8
@Mason: Bu bir uygulama ile diller için iyi çalışıyor. Çok olan diller için standart hayati öneme sahiptir. Gerçek hayattaki etki, eğer bir şeyden şikayet ederseniz, bir standart sorunsa satıcı sizi ciddiye alacak ve tanımlanmamış bir davranış veya benzeri bir şey varsa sizi fırçalayacaktır.
David Thornley

2
@Mason - Sadece bu kadar az dilde ve / 'nın uyduğu bir standart olduğu için. Bu, btw, IMHO, iyi bir şey değil - herhangi bir ciddi gelişme için, birden fazla işletim sistemi nesli sürmesi bekleniyor.
Şok

1
@David: Ya da daha doğru bir baskın uygulama. Borland, Pascal'ı ve Microsoft, ANSI ve ECMA'nın söylediklerinden bağımsız olarak C #'yi tanımlar.
dan04 23

4
Yüksek optimizasyon altında çöken C, C ++ veya Fortran kodu, derleyici hatalarından çok daha sık yanlış giriş kodudur. Sık sık yeni donanımlar için yeni çıkan ve sürüm öncesi derleyicilerle çalışıyorum ve optimizasyon ile ilgili hataları düzenli olarak görüyorum. Bu diller tanımlanmamış davranış kavramlarına sahip olduğu ve uygun olmayan programların kullanımını belirlemediği için, birincisi çökmelere karşı dikkatli bir şekilde kontrol etmek zorundasınız. Vakaların% 80-90'ında, uygulama kodu derleyici değil yanlış.
Phil Miller

14

Derleyiciler doğruluklarına yol açan birkaç özelliğe sahiptir:

  • Etki alanı çok iyi bilinmektedir ve araştırılmıştır. Sorun iyi tanımlanmış ve sunulan çözümler iyi tanımlanmış.
  • Derleyicilerin doğru çalıştığını kanıtlamak için otomatik test yeterlidir
  • Derleyiciler, diğer çoğu programdan daha fazla hata alanını kapsayacak şekilde zaman içinde biriken çok kapsamlı, tipik olarak açık, otomatik ve birim testlerine sahiptir.
  • Derleyicilerin sonuçlarını izleyen çok sayıda göz küresi var

2
Ayrıca birçok durumda, kod eskidir, GCC, diğerlerinin çoğu gibi, 20 yaşın üzerindedir, bu yüzden birçok hata, uzun bir zaman diliminde çözülmüştür.
Zachary K,

13

Derleyicileri günlük olarak kullanıyoruz

... ve derleyicileri nasıl bu kadar güvenilir hale getiriyorlar?

Yapmazlar. Yaparız. Çünkü herkes onları her zaman kullanır, böcekler çabucak bulunur.

Bu bir sayı oyunu. Derleyiciler bu nedenle yaygın bir alışması için, herhangi bir hata olasılığı çok yüksektir edecek birileri tarafından tetiklenebilir, ancak kullanıcıların bu kadar büyük bir numara var, bunun nedeni yüksek olduğu olası birisi Özellikle sizi olacağı.

Yani, bakış açınıza bağlı: tüm kullanıcılar arasında, derleyiciler buggy 'dir. Ama senden önce onların eğer öyleyse başkası kod benzer bir parçasını derlenmiş olması büyük bir olasılıkla oldu bir hata, o sizi onlara değil vurmak olurdu senin bu kadar, bireysel hata oldu gibi görünüyor, bakış açısı orada asla

Elbette, bunun üzerine, diğer tüm cevapları buraya ekleyebilirsiniz: derleyiciler iyi araştırılmış, iyi anlaşılmış. Bu efsane, yazmak zor olduğu, yani çok akıllı, çok iyi programcıların aslında bir tane yazmaya çalıştıkları ve yaptıklarında daha dikkatli oldukları anlamına gelir. Genellikle test etmek kolaydır ve stres testi veya tüylenme testi kolaydır. Derleyici kullanıcıları, uzman programcılar olma eğilimindedir ve bu da yüksek kalitede hata raporlarına yol açar. Ve bunun tersi: derleyici yazarları kendi derleyicilerinin kullanıcıları olma eğilimindedir.


11

Zaten tüm cevaplara ek olarak, eklemek istiyorum:

Ben inanıyorum bir çok kez, satıcılar kendi köpek maması yiyor. Yani derleyicileri kendileri yazıyorlar.


7

Derleyici hatalarına sıkça rastladım.

Onları daha az test edicinin bulunduğu daha karanlık köşelerde bulabilirsiniz. Örneğin, GCC’deki hataları bulmak için şunu denemelisiniz:

  • Bir çapraz derleyici oluşturun. Kelimenin tam anlamıyla GCC'nin yapılandırma ve kod dosyalarını oluşturmada onlarca hata bulacaksınız . Bazıları GCC derlemesi sırasındaki derleme hatalarıyla sonuçlanır, bazıları ise çapraz derleyicinin çalışma yürütücülerinin oluşturulmamasına neden olur.
  • Profile-bootstrap kullanarak GCC'nin Itanium versiyonunu oluşturun. Bunu son birkaç kez GCC 4.4 ve 4.5'te denedim, çalışan bir C ++ istisna işleyicisi üretemedi. Optimize edilmemiş yapı iyi çalıştı. Kimse bildirdiğim hatayı düzeltmekle ilgilenmedi ve GCC asm bellek özelliklerinde neyin kırıldığını araştırmaya çalıştıktan sonra kendim düzeltmekten vazgeçtim.
  • Distro derleme komut dosyasını izlemeden kendi çalışma GCJ'nizi en son sürümlerden oluşturmayı deneyin. Sana meydan okuyorum.

IA64 (Itanium) ile ilgili birçok sorun buluyoruz. Bu platform için çok fazla müşterimiz yok, bu nedenle optimizasyon seviyesini azaltmak her zamanki sorunumuzdur. Bu, diğer cevaplara geri döner, popüler mimariler için popüler diller için derleyiciler genellikle yeterli kullanıcı maruziyeti ve yeterince iyi olmak için yeterli desteğe sahipti, ancak daha az popüler mimariler ve / veya dillere giderken güvenilirliğin acı çekmesini beklemelisiniz.
Omega Centauri

@Omega: Optimizasyonu geri almak herkesin yaptığı gibi görünüyor. Ne yazık ki, Itanium gerektirir iyi performans için yüksek optimize derleyiciler. Oh iyi ...
Zan Lynx,

Seni duyuyorum. Açıkçası, mimarlık ortaya çıktığında çoktan kullanılmıştı, neyse ki AMD Intels'in elini x86-64 ile zorladı (ki bu pek çok siğilini fena saymaz). Eğer kaynak dosyalarınızı kırabilirseniz, yalıtmanız mümkün olabilir (ler) ve bir geçici çözüm bulabilirsiniz. Önemli bir platformsa, IA64 için değil, yaptığımız şey bu.
Omega Centauri

@Omega: Ne yazık ki, gerçekten Itanium'u seviyorum. Harika bir mimari. X86 ve x86-64'ün modası geçmiş olduğunu düşünüyorum ama elbette asla ölmeyecekler.
Zan Lynx

X86 biraz garip. Buna yeni şeyler eklemeye devam ediyorlar, böylece her seferinde bir siğil büyüyor. Ancak, sıra dışı yürütme motoru oldukça iyi çalışıyor ve yeni SSE => AVX öğeleri, kodlama isteyenler için bazı gerçek yetenekler sunuyor. Kuşkusuz, yarı eskimiş işleri yapmaya adanmış çok sayıda transistör var, ancak bunun eski bir uyumluluk için ödediği bir bedel var.
Omega Centauri

5

Birkaç neden:

  • Derleyici yazarlar " kendi köpek yemeklerini yerler ".
  • Derleyiciler, CS'nin iyi anlaşılmış prensiplerine dayanmaktadır .
  • Derleyiciler çok net bir özelliğe göre üretilmiştir .
  • Derleyiciler test edilir .
  • Derleyiciler her zaman çok güvenilir değildir .

4

Genellikle -O0'da çok iyidirler. Aslında bir derleyici hatasından şüphelenirsek, kullanmaya çalıştığımız seviye ile -O0'u karşılaştırırız. Daha yüksek optimizasyon seviyeleri daha büyük risk taşır. Bazıları bile kasıtlı olarak öyle ve belgelerde olduğu gibi etiketlenir. Çok fazla kişi ile karşılaştım (zamanım boyunca en az yüz), fakat son zamanlarda çok daha nadir hale geliyorlar. Bununla birlikte, iyi fiyat numaralarının (veya pazarlama için önemli olan diğer kriterlerin) peşinde koşarken, sınırları zorlama eğilimi harikadır. Birkaç yıl önce bir satıcının (isimlendirilmemiş) parantez ihlali yapmaya karar verdiği, bazı özel olarak açıkça etiketlenmiş bir derleme seçeneğinden daha fazla sorun yaşadık.

Bir derleyici hatasını teşhis etmek zor olabilir, bir sokak hafızası referansı söylemek yerine, farklı seçeneklerle bir yeniden derleme, bellek içindeki veri nesnelerinin göreceli konumlandırmasını satabilir, bu nedenle kaynak kodunuzun Heisenbug veya bir buggy olduğunu bilmiyorsunuz derleyici. Ayrıca birçok optimizasyon işlemlerin sırasındaki meşru değişiklikleri veya hatta cebirinizi basitleştirmelerini sağlar ve bunlar kayan nokta yuvarlama ve taşma / taşma bakımından farklı özelliklere sahip olacaktır. Bu etkileri REAL böceklerinden ayırmak zor. Sert çekirdekli kayan nokta hesaplaması bu sebepten zordur, çünkü böcekler ve sayısal hassasiyetler çoğu zaman çözülmeleri kolay değildir.


4

Derleyici hatalar o kadar nadir değildir. En sık karşılaşılan durum, derleyicinin kabul edilmesi gereken koddaki bir hatayı bildirmesi veya derleyicinin reddedilmiş olması gereken kodu kabul etmesidir.


ne yazık ki, ikinci bir böcek sınıfı göremiyoruz: kod derler = her şey yolunda. Muhtemelen böceklerin yarısı (iki böcek sınıfı arasında bölünmüş bir oranın 50-50 olduğunu varsayarsak) insanlar tarafından bulunmaz ancak derleyici ünite testleri ile bulunur
Gianluca Ghettini

3

Evet, dün ASP.NET derleyicisinde bir hatayla karşılaştım:

Görünümlerde kesinlikle yazılan modelleri kullandığınızda, şablonların kaç tane parametre içerebileceğinin bir sınırı vardır. Açıkçası, 4'ten fazla şablon parametresi alamaz, bu nedenle aşağıdaki her iki örnek de derleyicinin işlemesi için çok fazla şey yapar:

ViewUserControl<System.Tuple<type1, type2, type3, type4, type5>>

Olduğu gibi derlenmez, ancak type5kaldırılırsa olur.

ViewUserControl<System.Tuple<MyModel, System.Func<type1, type2, type3, type4>>>

type4Kaldırılırsa derler .

System.TupleÇok fazla aşırı yüklenme olduğunu ve 16 parametreye kadar sürebileceğini unutmayın (biliyorum ki bu delilik).


3

Derleyicinin kendisinde bir hatayla karşılaştınız mı? Bu neydi ve sorunun derleyicinin kendisinde olduğunu nasıl anladınız?

Evet!

En unutulmaz iki şimdiye kadar karşılaştığım ilk iki idi. İkisi de 1985-7'ye kadar geri dönen 680x0 Mac'ler için Lightspeed C derleyicideydiler.

İlki, bazı durumlarda tamsayı sonrası geri dönüş operatörünün hiçbir şey yapmadığı yerdi - başka bir deyişle, belirli bir kod parçasında, "i ++", "i" için hiçbir şey yapmadı. Sökmeye bakana kadar saçlarımı çekiyordum. Daha sonra artışı farklı bir şekilde yaptım ve bir hata raporu gönderdim.

İkincisi, biraz daha karmaşıktı ve gerçekten de ters giden bir "kötü" özellik olarak algılandı. İlk Mac'lerde düşük seviyeli disk işlemleri yapmak için karmaşık bir sistem vardı. Bazı nedenlerden dolayı, hiç anlamadım - muhtemelen daha küçük yürütülebilir dosyalar oluşturmakla ilgili - derleyici sadece nesne kodundaki yerinde disk çalıştırma talimatlarını oluşturmak yerine, Lightspeed derleyicisi çalışma zamanında disk çalışmasını üreten dahili bir fonksiyon çağırır. yığındaki talimatlar ve orada atladı.

Bu, 68000 işlemcide çok işe yaradı, ancak aynı kodu bir 68020 işlemcide çalıştırdığınızda, genellikle garip şeyler yapardı. 68020'nin yeni bir özelliğinin ilkel bir talimat olan 256 bayt komut önbelleği olduğu ortaya çıktı. Bu işlem, CPU önbellekleriyle ilk günlerde olduğu gibi, önbellek "kirli" olduğu ve yeniden doldurulması gerektiğine dair hiçbir fikri yoktu; Sanırım Motorola'daki CPU tasarımcıları kendi kendini değiştiren kodlar hakkında düşünmediler. Dolayısıyla, yürütme sıranızda birbirine yeterince yakın iki disk işlemi yaptıysanız ve Lightspeed çalışma zamanı, asıl talimatları yığında aynı yere yerleştirirse, CPU hatalı bir şekilde bir komut önbelleği alacağını ve ilk disk işlemini iki kez çalıştıracağını düşünürdü.

Yine, bunun bir disassembler ile bir miktar kazmaya başladığını ve düşük seviyeli bir hata ayıklayıcıda bir sürü tek adım attığını bulmak. Geçici çözümüm, her disk işlemine, önbelleğe su basmış (ve böylece silinmiş) 256 "NOP" talimatı olan bir işleve çağrı yapmaktı.

O zamandan bu yana geçen 25 yılda, zaman içerisinde daha az ve daha az derleyici hatası gördüm. Bence bunun birkaç nedeni var:

  • Derleyiciler için sürekli artan bir doğrulama testleri kümesi var.
  • Modern derleyiciler tipik olarak biri platformdan bağımsız kod (örneğin, hayali bir CPU olarak düşünebileceğiniz şeyi hedefleyen LLVM'leri hedefleyen) ve diğeri de bunu gerçek hedef donanımınız için talimatlara çeviren iki veya daha fazla parçaya bölünür. Çok platformlu derleyicilerde ilk kısım her yerde kullanılır, bu nedenle tonlarca gerçek dünya testine tabi tutulur.

Kendi kendini değiştiren kodlardan kaçınmanın nedenlerinden biri.
Technophile

3

5.5 yıl önce Turbo Pascal'da göz kamaştırıcı bir hata bulundu. Derleyicinin önceki (5.0) veya sonraki (6.0) sürümlerinde mevcut bir hata. Ve test edilmesi kolay olması gereken bir şeydi, çünkü hiç bir köşesi değildi (sadece yaygın olarak kullanılmayan bir çağrı).

Genel olarak, kesinlikle ticari derleyici üreticileri (hobi projeleri yerine) çok kapsamlı KG ve test prosedürlerine sahip olacaklardır. Derleyicilerinin amiral gemisi projeleri olduğunu ve kusurların kendileri üzerinde çok kötü görüneceğini, diğer şirketlerin çoğunu yapan diğer şirketlere baktıklarından daha kötü olacağını biliyorlar. Yazılım geliştiriciler affedilmez bir demet, araç tedarikçilerimiz bizi tedarikçiden bir düzeltme beklemekten ziyade alternatifleri aramaya devam edeceğimiz konusunda hayal kırıklığına uğratıyor ve bu gerçeği iyi takip edebilecek meslektaşlarımıza iletme ihtimalimiz çok yüksek örnek. Diğer pek çok sektörde durum böyle olmadığından, derleyici yapıcı için ciddi bir hata sonucu oluşacak olası kayıp, bir video düzenleme yazılımı üreticisi söyleyenden çok daha büyük.


2

Yazılımınızın davranışı -O0 ve -O2 ile derlendiğinde farklı olduğunda, bir derleyici hatası bulmuş olursunuz.

Yazılımınızın davranışı beklediğinizden sadece farklı olduğunda, o zaman hata kodunuzda olma ihtimali vardır.


8
Şart değil. C ve C ++ 'da sinir bozucu miktarda tanımlanmamış ve tanımsız davranış vardır ve ayın optimizasyon seviyesine veya aşamasına veya Dow Jones endekslerinin hareketine bağlı olarak yasal olarak değişebilir. Bu test daha sıkı tanımlanmış dillerde çalışıyor.
David Thornley

2

Derleyici hataları oluyor, ama onları garip köşelerde bulma eğilimindesiniz ...

1990'larda Digital Equipment Corporation'ın VAX VMS C derleyicisinde çok garip bir hata vardı.

(O zamanki moda olduğu gibi kemerimde bir soğan vardı)

Bir for döngüsünün önündeki herhangi bir yerde bir dış noktalı virgül for formanın gövdesi olarak derlenir.

f(){...}
;
g(){...}

void test(){
  int i;
  for ( i=0; i < 10; i++){
     puts("hello");
  }
}

Söz konusu derleyicide, döngü yalnızca bir kez yürütülür.

görüyor

f(){...}
g(){...}

void test(){
  int i;
  for ( i=0; i < 10; i++) ;  /* empty statement for fun */

  {
     puts("hello");
  }
}

Bu bana çok zaman harcadı.

PIC C derleyicisinin eski sürümünde (eskiden beri) iş deneyimi öğrencilerimize uyguladıkları, yüksek öncelikli kesmeyi doğru bir şekilde kullanan kod üretemediler. 2-3 yıl beklemek zorunda kaldısın.

MSVC 6 derleyicisinin bağlayıcıda şık bir hata vardı, hata segmentasyonu ve zaman zaman sebepsiz yere ölecek. Temiz bir yapı genellikle onu düzeltir (ancak her zaman iç çekmez ).


2

Aviyonik yazılım gibi bazı alanlarda kod ve donanım ile derleyici üzerinde son derece yüksek sertifikasyon gereklilikleri vardır. Bu son bölümde, Compcert adında resmi olarak doğrulanmış bir C derleyicisi oluşturmayı amaçlayan bir proje var . Teoride, bu tür bir derleyici geldikleri kadar güvenilirdir.


1

Birkaç derleyici hata gördüm, birkaçını kendim rapor ettim (özellikle F # 'da).

Bununla birlikte, derleyici hatalarının nadir olduğunu düşünüyorum, çünkü derleyicileri yazan insanlar genellikle onları kodun matematiksel sonuçları hakkında gerçekten bilinçlendiren titiz bilgisayar bilimi kavramları konusunda çok rahatlar.

Muhtemelen çoğu, lambda matematiği, biçimsel doğrulama, terimbilimsel anlambilim vb. Şeylere çok aşinadır - benim gibi ortalama bir programcının ancak zorlukla kavrayabileceği şeyler.

Ayrıca, genellikle derleyicilerden girdiden çıktıya kadar oldukça basit bir haritalama vardır, bu nedenle bir programlama dilini hata ayıklamak muhtemelen hata ayıklamaktan, yani bir blog motorundan çok daha kolaydır.


1

Çok uzun zaman önce C # derleyicisinde bir hata buldum, Eric Lippert'in (C # tasarım ekibinde bulunan) hatanın burada ne olduğunu nasıl bulduğunu görebilirsiniz .

Daha önce verilen cevaplara ek olarak, birkaç şey daha eklemek istiyorum. Derleyici tasarımcıları genellikle son derece iyi programcılar. Derleyiciler çok önemlidir: çoğu programlama derleyiciler kullanılarak yapılır, bu nedenle derleyicinin yüksek kalitede olması zorunludur. Bu nedenle, derleyicileri en iyi insanları koymak için derleyen şirketler (veya en azından çok iyi olanlar: en iyileri derleyici tasarımını beğenmeyebilir). Microsoft, C ve C ++ derleyicilerinin düzgün çalışmasını çok ister ya da şirketin geri kalanı işlerini yapamaz.

Ayrıca, gerçekten karmaşık bir derleyici oluşturuyorsanız, birlikte kesemezsiniz. Derleyicilerin arkasındaki mantık hem karmaşık hem de biçimlendirmesi kolaydır. Bu nedenle, bu programlar genellikle daha az hatayla sonuçlanma eğiliminde olan çok 'sağlam' ve genel bir şekilde kurulur.

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.