Kitabın önüne geçersek (veya tercih ederseniz dil spesifikasyonunun herhangi bir versiyonunu kullanırsak), bir C uygulamasının ne kadar hesaplama gücü olabilir?
“C uygulaması” nın teknik bir anlamı olduğunu unutmayın: Uygulama-tanımlanmış davranışın belgelendiği C programlama dili spesifikasyonunun özel bir örneğidir. AC uygulamasının gerçek bir bilgisayarda çalışabilmesi gerekmez. Bit-dizili bir temsili olan her nesne ve uygulama-tanımlı boyutta olan türler dahil olmak üzere, tüm dili uygulamak zorundadır.
Bu sorunun amacı için harici depolama yoktur. Yapabileceğiniz tek giriş / çıkış getchar
(program girişini okumak için) ve putchar
(program çıkışını yazmak için) 'dir. Ayrıca tanımsız davranışı çağıran herhangi bir program geçersizdir: geçerli bir program, C belirtimi ile tanımlanmış davranışı artı uygulamanın Ek J'de listelenen uygulama tanımlı davranışları tanımlamasıyla tanımlamalıdır (C99 için). Standartta belirtilmeyen çağıran kütüphane işlevlerinin tanımsız davranış olduğunu unutmayın.
İlk tepkim, bir C uygulamasının sonlu bir otomattan başka bir şey olmamasıydı, çünkü adreslenebilir bellek miktarını sınırlandırıyordu sizeof(char*) * CHAR_BIT
(depolanan bitlerden daha fazlasını ele alamazsınız , çünkü farklı bellek adreslerinin depolandığında farklı bit desenleri olması gerekir) bir bayt işaretçisinde).
Ancak bir uygulamanın bundan daha fazlasını yapabileceğini düşünüyorum. Söyleyebileceğim kadarıyla, standart özyinelemenin derinliğine sınır koymuyor. Böylece istediğiniz kadar özyinelemeli işlev çağrısı yapabilirsiniz, ancak sınırlı sayıda çağrı yalnızca adreslenebilir olmayan ( register
) argümanları kullanmalıdır. Böylece, keyfi tekrarlama sağlayan ve register
nesne sayısını sınırlamayan bir C uygulaması deterministik aşağı itme otomatlarını kodlayabilir.
Bu doğru mu? Daha güçlü bir C uygulaması bulabilir misiniz? Bir Turing tamamlandı C uygulaması var mı?