Esasen sorduğunuz şey, hesaplama gücü ile genel olarak bir dilin (veya hesaplama sisteminin) ifade gücü (veya sadece ifade edilebilirliği ) olarak adlandırılan arasındaki farktır .
Hesaplamalı Güç
Hesaplamalı güç problemlerinin türlü dil hesaplayabilir ne ifade eder. En iyi bilinen hesaplama gücü sınıfı, Evrensel Turing Makinesi ile aynı olandır . Rasgele Erişim Makineleri , λ-hesabı , SK-birleştiricisi hesabı , µ-özyinelemeli fonksiyonlar , WHILE
programlar ve diğerleri gibi bir çok hesaplama sistemi vardır . Görünüşe göre, bunların hepsi birbirlerini taklit edebilir, bu da hepsinin aynı hesaplama gücüne sahip olduğu anlamına gelir.
Bu, Kilise Turing Tezi'ne neden olur ( λ-calculus'u oluşturan Alonzo Kilisesi ve Evrensel Turing Makinesi'ni oluşturan Alan Turing adını aldı). Kilise Turing Tezi hesaplanabilirlik üzerine iki yönden bir hipotezdir:
- Genel hesaplama yapabilen tüm bilgisayar sistemleri eşit derecede güçlü ve
- Bir algoritmayı takip eden bir insan, bir Turing Makinesinin (ve diğer sistemlerden herhangi birinin) hesaplayabileceği fonksiyonları tam olarak hesaplayabilir.
İkincisi, zihin felsefesi alanında, bilgisayar bilimlerinden daha önemlidir.
Ancak, Church-Turing-Tez iki şey vardır vermez Sorunuza çok alakalı olduğunu söylüyor:
- çeşitli simülasyonların ne kadar verimli olduğu ve
- Bir problemin kodlanmasının ne kadar uygun olduğu.
(1) için basit bir örnek: Bir Rasgele Erişim Makinasında, bir dizinin kopyalanması dizinin uzunluğuyla orantılı olarak zaman alır. Turing Makinası günü, ancak, zamanı orantılı alır meydanda Turing Makinesi rastgele bellek erişimi olmadığı için, sadece bir seferde bant bir hücreden boyunca hareket edebilir, dizinin uzunluğunun. Bu nedenle, karşıdan karşıya geçmek gerekiyor n dizinin elemanları n kopyalamak kez. Bu nedenle, farklı hesaplama modelleri, uygulama detaylarından uzaklaşmaya çalıştığımız asimptotik durumda bile farklı performans özelliklerine sahip olabilir.
(2) için bol miktarda örnek: hem λ-calculus hem de Python Turing-tamamlandı. Ancak Python'da veya λ-calculus'ta bir program yazmayı mı tercih edersiniz?
Şimdiye dek etrafa fırlattığım üçüncü bir kırışıklık da var: tüm bu orijinal sistemler, bilgisayar ve böylece bilgisayar bilimleri olmadığı için, bilgisayar bilimcileri tarafından değil, logo yazarları, filozoflar veya matematikçiler tarafından tasarlandı. Hatta önce erken 1930'lara kadar Bunların hepsi go back, Konrad Zuse 'çok ü ilk deneyleri (programlanabilir ve / veya Turing tamamlama zaten değildi). Sadece "doğal sayılardaki hesaplanabilir fonksiyonlar" hakkında konuşuyorlar.
Şimdi, ortaya çıktığı gibi, doğal sayılar üzerinde işlevler olarak ifade edebileceğiniz çok şey var - sonuçta, modern bilgisayarlarımız bile bundan daha azına sahip oluyorlar (temelde 0 ve 1 sayıları üzerinde 3-4 işlev görüyor ve işte bu kadar. ), fakat, örneğin, bir işletim sistemi hangi işlevi hesaplar?
Bu I / O kavramı, yan etkiler, çevre ile etkileşime giren, "doğal sayılar üzerinde fonksiyonlar" fikri tarafından yakalanmamıştır. Yine de, Simon Peyton Jones'un bir keresinde “hiçbir yan etkisi olmayan“ tamamen saf bir işlev, işlemcinizi sıcak hale getirmesi ” dediği gibi , bir izleyici üyesinin yanıtladığı “ aslında, bir taraftır ”çünkü bu önemli bir şey. -Etki de! "
İdris'in tasarımcısı Edwin Brady (sadece yarısı) şaka olarak kullanıyor (icat edip etmediğini bilmiyorum) "Tetris-complete" terimini "doğal sayılar üzerinde hesaplanabilir herhangi bir işlevi hesaplayabilir" ile "arasındaki çevre ile etkileşime giren önemsiz programları yazmak için kullanılır ". Daha da ironik bir şekilde, bunu İdris'te klonlanan bir Space Invaders uygulaması gerçekleştirerek gösterdi , ancak Tetris'in Space Invaders'a indirgendiğinden emin olduğunu söylüyor.
Dikkat edilmesi gereken bir diğer husus da, sadece "yararlı" programlar yazmaktan bahsetmek için yeterli olmamak kaydıyla, Turing-denkliği değil , aynı zamanda OTOH'ın da gerekli olması gerekmiyor . Örneğin, SQL yalnızca Turing'e eşdeğer hale geldi: ANSI SQL: 1999 , ancak bundan önce hala faydalı oldu. Aslında, bazıları onu Turing'e eşdeğer hale getirmenin yararına hiç eklemediğini iddia edebilir. Turing'e eşdeğer olmayan bir çok Etki Alanına Özel Dil var. Veri Açıklama Dil genellikle değildir (ve olmamalıdır). Toplam Diller açıkça Turing'e eşdeğer olamaz ancak yine de bunlara olay döngüleri, web sunucuları veya işletim sistemleri yazabilirsiniz. Turing'e eşdeğer ancak bunun aslında bir hata olduğu düşünülen diller de var.
Dolayısıyla, sonuçta, Turing-denklik programları statik olarak analiz etmek istemediğiniz sürece çok ilginç değildir.
Etkileyicilik
Hesaplama sistemimizin, sorunumuzu bile çözebilecek kadar hesaplamalı olarak güçlü olduğunu farz edersek, daha sonra yapmamız gereken, bu sorunu o sistem için bir tür biçimsel gösterimde çözmek için algoritmamızı ifade etmektir. Başka bir deyişle: Bazı bilgisayar dilinde bir program yazmamız gerekiyor. Etkileyicilik nosyonunun girdiği yer burasıdır .
Temel olarak, programımızı özel programlama dilimizde yazmanın ne kadar "kolay" veya "eğlenceli" olduğunu ifade eder. Gördüğünüz gibi, fikir teknikten çok belirsiz, öznel ve psikolojiktir.
Ancak, daha kesin tanımlarda girişimler var. En ünlü (ve tanıdığım en titiz olanı), Programlama Dillerinin Etkileyici Gücü Üzerine (ilk iki sayfa yumuşak bir giriş içeriyor, kağıdın geri kalanı daha yumuşaktır ) makalesinde Matthias Felleisen tarafından yazılmıştır .
Temel sezgi şudur: Bir programı dilden başka bir dile çevirirken, yapmanız gereken değişikliklerin bazıları yerel olarak bulunur (örneğin, FOR
döngülere WHILE
döngülere dönme veya koşullulara döngülere dönüşme gibi GOTO
) ve bazılarında globalde değişiklik yapılması gerekir. programın yapısı.
Bir dilin bir özelliğini farklı bir dilin özelliği ile yalnızca yerel dönüşümlerle değiştirebildiğinizde, bu özelliklerin etkileyici gücü üzerinde hiçbir etkisinin olmadığı söylenir. Buna sözdizimi şekeri denir .
Öte yandan, programın küresel yapısının değişmesini gerektiriyorsa, çevirdiğiniz dilin özelliği ifade edemediği söylenir. Ve çevirdiğiniz dilin daha etkileyici olduğu söyleniyor (bu özelliğe göre).
Bunun nesnel olarak ölçülebilir bir ifade tanımı verdiğine dikkat edin. Ayrıca, nosyonun özelliğe içeriğe bağlı olduğunu ve karşılaştırmalı olduğunu unutmayın. Dil içinde her program Yani eğer, A dili ile tercüme edilebilir B sadece yerel değişikliklerle ve dil içinde en azından bir program var B olabilir değil çevrilemez A yalnızca yerel değişikliklerle, daha sonra dil B dilden kesinlikle daha etkileyici olduğunu bir. Ancak, daha muhtemel senaryo, her iki dilde birçok programın ileri ve geri çevrilebilmesidir, ancak her iki dilde de diğerine çevrilemeyen bazı programlar vardır. Bu, hiçbir dilin diğerinden kesinlikle daha anlamlı olmadığı anlamına gelmez, farklı programların farklı şekillerde ifade edilmesine izin veren farklı özelliklere sahiptir.
Bu, "daha anlamlı" olmanın ne anlama geldiğinin resmi bir tanımını verir, ancak yine de olgunun arkasındaki psikolojik kavramları yakalamaz. Örneğin, söz konusu modele göre sözdizimsel şeker, bir dilin ifade gücünü arttırmaz, çünkü yalnızca yerel değişiklikler kullanılarak çevrilebilir. Ancak, biz deneyimlerinden biliyoruz ki sahip FOR
, WHILE
ve IF
onlar koşullu bir sözdizim şeker olsa bile, mevcut GOTO
bizim niyetini ifade eden markaların daha kolay .
Gerçek şu ki, farklı diller, bir problem hakkında farklı düşünce tarzlarını ifade etmeyi kolaylaştıran veya zorlaştıran farklı özelliklere sahiptir. Bazı insanlar niyetlerini daha kolay ifade etmenin bir yolunu, bazılarını ise farklı bir yoldan bulabilirler.
StackOverflow'ta Ruby etiketinde bulduğum bir örnek: Ruby etiketini izleyen birçok kullanıcı döngülerin özyinelemeden daha kolay anlaşıldığını iddia ediyor ve özyineleme yalnızca gelişmiş işlevsel programcılar içindir ve döngüler yeni gelenler için daha sezgiseldir; sezgisel olarak bu şekilde kod yazan yeni gelenler:
def rock_paper_scissors
get_user_input
determine_outcome
print_winner
rock_paper_scissors # start from the top
end
Bu genellikle birkaç kişinin "bu işe yaramadığını" ve "yanlış yaptıklarını" ve "doğru şekilde" olduğunu söyleyerek sonuçlanır:
def rock_paper_scissors
loop do
get_user_input
determine_outcome
print_winner
end
end
Bu nedenle, açıkça, kuyruk özyinelemesinin döngü yapılarından ziyade "döngü" kavramını ifade etmenin daha doğal bir yolu olduğu bazı insanlar var.
özet
İki dilin Turing'e eşdeğer olduğu gerçeği, tek ve tam olarak tek bir şey söylüyor: bir Turing Makinesi'nin yapabildiği gibi, doğal sayılardaki aynı işlevleri kümesini hesaplayabiliyorlar. Bu kadar.
Bu fonksiyonları ne kadar hızlı hesapladıklarıyla ilgili hiçbir şey söylemez. Bu işlevleri ifade etmenin kolaylığı hakkında hiçbir şey söylemez. Ayrıca, doğal sayılar üzerinde hesaplama fonksiyonlarının yanı sıra başka neler yapabilecekleri hakkında hiçbir şey söylemez (örn. C kütüphanelerine bağlantı vermek, kullanıcıdan girdi okumak, çıktıları ekrana yazmak).
bu, her dilin tamamının bitmesine rağmen, her programlama dilinin kesin olarak çözebileceği problemler sınıfının dile göre farklılık gösterdiği anlamına mı geliyor?
Evet.
- Ekrana basma gibi "Turing-complete" terimi (yalnızca doğal sayılardaki hesaplama işlevleriyle ilgilidir) ile kapsanmayan sorunlar var. İki dil Turing-tamamlanmış olabilir, ancak biri ekrana yazdırırken diğeri yazdırmamaya izin verebilir.
- Her iki dil de aynı sorunları çözebilse bile, bu kodlamanın ne kadar karmaşık olduğu ve bu kodlamanın ne kadar kolay olduğu hakkında bir şey söylemez. Örneğin C her problemi çözebilir Haskell, basitçe C'de bir Haskell tercümanı yazarak… ama bir problemi bu şekilde çözmek için önce Haskell tercümanını yazmanız gerekir!