Öncelikle, burada sadece "C" den bahsetmeme rağmen, aynı şeyin C ++ için de aynı şekilde geçerli olduğunu not edeceğim.
Godel'den bahseden yorum, kısmen (ancak yalnızca kısmen) noktasındaydı.
Buna aşağı olsun, C standartlarında tanımsız davranış olduğunu büyük ölçüde sadece standart girişimleri tanımlamak ne arasındaki sınırı işaret ve ne öyle değil.
Godel'in teoremleri (iki tane vardır) temel olarak hem eksiksiz hem de tutarlı olduğu kanıtlanmış bir matematik sistemini tanımlamanın imkansız olduğunu söylüyor. Kurallarınızı tam olarak yapabilmeniz için yapabilir (ele aldığı durum "doğal sayılar için" normal "kurallardı) ya da tutarlılığını kanıtlamanızı mümkün kılabilir, ancak ikisine de sahip olamazsınız.
C gibi bir şey söz konusu olduğunda, doğrudan uygulanmaz - çoğunlukla, sistemin bütünlüğünün veya tutarlılığının “kanıtlanabilirliği” çoğu dil tasarımcısı için yüksek bir öncelik değildir. Aynı zamanda, evet, muhtemelen (en azından bir dereceye kadar) “kusursuz” bir sistem tanımlamanın kesinlikle mümkün olmadığını bilerek etkilendiler - en azından bir dereceye kadar tamamlanmış ve tutarlı. Böyle bir şeyin imkansız olduğunu bilmek, geri adım atmayı, biraz nefes almayı ve tanımlamaya çalışacaklarının sınırlarına karar vermeyi biraz daha kolaylaştırabilirdi.
Kibirle suçlanma (yine bir kez) riski altında, C standardını (kısmen) iki temel fikir tarafından yönetildiğini belirtiyordum:
- Dil mümkün olduğu kadar çok çeşitli donanımları desteklemelidir (ideal olarak, tüm donanımları makul bir alt sınıra kadar tüm "akıllıca").
- Dil, verilen ortam için mümkün olduğunca çok çeşitli yazılımı yazmayı desteklemelidir.
Birincisi, eğer biri yeni bir işlemci tanımlarsa, bunun için, tasarım en azından makul bir şekilde birkaç basit kılavuza yakın bir yere düştüğü müddetçe, bunun için iyi, sağlam, kullanışlı bir C uygulaması sağlamak mümkün olmalıdır. Von Neumann modelinin genel düzeni hakkında bir şeyler izler ve en azından bir C uygulamasına izin verecek kadar makul miktarda minimum bellek sağlar. "Barındırılan" bir uygulama için (bir işletim sistemi üzerinde çalışan), dosyalara oldukça yakın olan bir kavramı desteklemeniz ve belirli bir minimum karakter grubuna sahip bir karakter kümesine sahip olmanız gerekir (91 gereklidir).
İkinci doğrudan donanımıyla çalışır kod yazmak mümkün olmalıdır demektir, bu nedenle sonuçta vardır sen boot yükleyici, işletim sistemleri, vb herhangi bir işletim sistemi olmadan çalışan gömülü yazılım gibi şeyler yazabilirsiniz bazı bu konuda sınırlarıdır, hemen hemen her pratik işletim sistemi, önyükleyici vb., derleme dilinde yazılmış en az bir miktar kod içermesi muhtemeldir . Aynı şekilde, küçük bir gömülü sistemin bile, ana bilgisayar sistemindeki cihazlara erişim sağlamak için en azından bir tür önceden yazılmış kütüphane rutini içermesi muhtemeldir. Kesin bir sınırın tanımlanması zor olsa da, amaç, bu koda bağımlılığın asgari düzeyde tutulması gerektiğidir.
Dildeki tanımsız davranış, büyük ölçüde dilin bu yetenekleri destekleme niyeti tarafından yönlendirilir. Örneğin, dil isteğe bağlı bir tamsayıyı işaretçiye dönüştürmenize ve bu adreste olanlara erişmenize olanak tanır. Standart yaptığınız zaman ne olacağını söylemeye kalkışmaz (örneğin, bazı adreslerden okumak bile dışarıdan görülebilir etkiler yapabilir). Aynı zamanda, bu tür şeyleri yapmanıza engel olmak için hiçbir girişimde bulunmaz, çünkü C'ye yazmanız gereken bazı yazılım türlerine ihtiyaç duyarsınız .
Diğer tasarım öğeleri tarafından yönlendirilen tanımsız bir davranış var. Örneğin, C'nin bir diğer amacı ayrı derlemeyi desteklemektir. Bu, (örneğin), çoğumuzun bir linkerin normal modeli olarak gördüklerimizi kabaca izleyen bir linker kullanarak parçaları birbirine "bağlamanız" anlamına gelir. Özellikle, ayrı ayrı derlenmiş modülleri, dilin anlambilim bilgisi olmadan eksiksiz bir programda birleştirmek mümkün olmalıdır.
Derleyici teknolojisindeki sınırlamalar nedeniyle ortaya çıkan başka bir tanımlanmamış davranış türü (C ++ 'ta C ++' dan çok daha yaygın) var - temelde bildiğimiz şeyler hatalar ve muhtemelen derleyicinin hatalar olarak teşhis etmesini istiyor, ancak derleyici teknolojisindeki mevcut sınırlar göz önüne alındığında, her koşulda teşhis edilebilecekleri şüphelidir. Bunların birçoğu, ayrı derleme gibi diğer gereksinimlerden kaynaklanmaktadır, bu nedenle, büyük ölçüde çelişkili gereklilikleri dengeleme meselesidir; bu durumda, komite, bazı muhtemel problemleri teşhis etmemek anlamına gelse bile, daha büyük yetenekleri desteklemeyi seçmiştir. olası tüm sorunların teşhis edilmesini sağlamak için yetenekleri sınırlamak yerine.
Bu farklılıklar niyet C ve Java gibi bir şey ya da Microsoft'un CLI tabanlı sistemler arasındaki farkların en sürücü. Sonuncusu açıkça, çok daha sınırlı bir donanım kümesiyle çalışmak veya hedefledikleri daha spesifik donanımı taklit etmek için yazılım talep etmekle sınırlıdır. Ayrıca, özellikle donanımın doğrudan manipülasyonunu önleme niyetindedir , bunun yerine JNI veya P / Invoke (ve C gibi bir yazılı kod) gibi bir girişimde bulunmanızı gerektirir.
Bir an için Godel'in teoremlerine geri dönersek, paralel bir şey çizebiliriz: Java ve CLI "dahili tutarlı" alternatifi seçti, C ise "komple" alternatifi seçti. Tabii ki, bu çok zorlu bir benzetmedir - herhangi birinin her iki durumda da iç tutarlılık ya da bütünlüğünün resmi bir kanıtını denemekten şüpheleniyorum . Bununla birlikte, genel kavram aldıkları seçimlerle oldukça uyumludur.