Neden bazı programlama dilleri Turing tamamlandı ama diğer dillerin bazı yeteneklerinden yoksun?


42

Dış programlara / işlevlere kanca olması gereken bir tercüman yazarken garip bir sorunla karşılaştım: 'C' ve 'C ++' içindeki işlevler değişken işlevlere bağlanamıyor , örneğin 'printf' adında bir işlev yapamıyorum onunla aynı argümanlar ile ve bunun yerine, değişken bir nesneyi alan alternatif bir sürümü çağırmak zorundadır. Bu çok sorunlu çünkü isimsiz bir kancayı tutan bir nesne yapabilmek istiyorum.

Bu yüzden, bunun çok garip olduğunu düşündüm, çünkü Forth , JavaScript ve belki de başka dillerden oluşan bir bolluk, meclis dili / makine koduna başvurmak zorunda kalmadan bunu çok kolay bir şekilde yapabiliyordu. Diğer diller bu kadar kolay yapabileceği için, bu, her programlama dilinin çözebileceği problem sınıfının, bu dillerin tamamının eksiksiz olmasına rağmen, dile göre farklılık gösterdiği anlamına mı geliyor?


33
Sen de bakması gerektiğini turing tarpits . Tamamen turing yaparken bilerek mümkün olduğunca az işlem yapabilen büyüleyici bir programlama dilidir. Birçoğunda temel veri tipleri, fonksiyonlar, hatta değişkenleri bildirmek gibi basit şeyler yoktur. Şahsen, bunlara kod yazmanın çok eğlenceli olduğunu düşünüyorum, çünkü gereksiz yere zor bir şeyi denemek için sizi rahat bölgenizden çıkarmaya zorluyor.
DJMcMayhem 27.06.2016

8
Bir Turing makinesinin ne yaptığına bakın ve "Turing-complete" un temizlemesi çok düşük bir engel olduğunu göreceksiniz. Temel aritmetiği desteklerken, 'oku', 'yaz' ve 'atlayabilen' her şey Turing-tamamlandı. Bu, baktığınız dil özelliklerinin seviyesinin oldukça altında.
16'da

2
Daha da saçma olmak için: bir x86 işlemcideki MOV komutu Turing-tamamlandı. Ayrıntılar için cl.cam.ac.uk/~sd601/papers/mov.pdf adresine bakın.
Gareth McCaughan

3
Kart oyunu Magic bile: The Gatinging tamamlandı. Turing-eksiksizliğin bir dilin özellikleri ile ilgisi yoktur.
Mast,

2
BTW, prova denetleyicileri gibi tamamlanmayan çok karmaşık programlama dilleri de var.
盛安安

Yanıtlar:


68

Tam dilleri , genel özyinelemeli kısmi işlevler kümesi olan işlevlerini aynı şekilde hesaplayabilir . Bu kadar.N-kN-

Bu, dil özellikleri hakkında hiçbir şey söylemez. Bir Turing Makinesi çok sınırlı kompozisyon özelliklerine sahiptir. Türsüz -calculus çok daha kompozisyon, ama genellikle modern diller bulunan birçok özellik yoksundur.λ

Bütünlüğü tamamlamak, diziler / tamsayılar / sözlükler, giriş / çıkış yetenekleri, ağ erişimi, çoklu okuma, dinamik ayırma, ... gibi türlere sahip olmak hakkında hiçbir şey söylemez.

Java'nın X özelliğine (makrolar, yüksek dereceli türler veya bağımlı türler) sahip olmadığı için aniden Turing'in tamamlanmasını durdurmaz.

Bütünlüğü ve dilde etkileyiciliği sürdürmek iki farklı kavramdır.


42
İ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 ".
Jörg W Mittag

12
Bunları C / C ++ ile alabileceğinizi de söyleyebilirsiniz. Sadece kodunuzun C / C ++ kodunuzda bir dize derlediği başka bir dil için C / C ++ dilinde bir derleyici işlevi gören bazı kodlar yazmanız gerekir. O zaman sadece C dosyanızın içindeki Java gibi bir programla programlama yapabilirsiniz. Bunların hepsi çok iş olurdu, ama bu mümkün (muhtemelen C / C ++ Turing Complete olduğu için).
Shufflepants 27:16

4
@ Shufflepants Ancak "Başka bir dili yorumlayabildiğim için C ++ 'ta yapabilirim" demenin gerçekten yararlı olup olmadığını merak ediyorum. Bu belirteçle, Java, ML, C ++ eşdeğerdir. Sistem çağrıları için bir kehaneti bulunan TM (I / O) da eşdeğerdir. Bu nedenle, neredeyse tüm dillerin eşit derecede açıklayıcı olduğundan korkuyorum. Öyleyse, dilleri karşılaştırmak yararlı bir kavram değildir.
chi

9
@chi Doğru, eşdeğerdirler. Turing Complete olmanın anlamı budur. Bir Turing Complete sistemi ile yapılabilecek her şey başka bir Turing Complete sisteminde yapılabilir. Belirli bir sistemde yapmak uygun olmayabilir. Ve çeşitli şeyler yapmanın rahatlığı, farklı programlama dillerini karşılaştırmanın birincil yoludur. Ama sorulan soru bu değildi.
Shufflepants

5
@ Rhymoid C Turing Complete'i hafıza erişim nedenlerinden dolayı veya keyfi bir şekilde büyük depolama alanı olan bağlı bir cihaza rastgele sinyaller gönderemediğinden sayılmazsa, gerçek dünya dilinin veya cihazın Turing Complete'in olmadığı söylenebilir. . Ama bunun çok verimli bir mantık çizgisi olduğunu düşünmüyorum.
Shufflepants

47

Bütünlüğü tamamlamak, soyut bir hesaplanabilirlik kavramıdır. Eğer bir dil Turing tamamlandıysa, diğer bir Turing tamamlayıcı dilin yapabileceği herhangi bir hesaplama yapabilir.

Ancak bu, bunun ne kadar uygun olduğunu söylemez. Tasarım seçeneklerinden dolayı bazı dillerde kolay olan bazı özellikler diğerlerinde çok zor olabilir. Tamlığı Turing sadece söylüyor olabilir hesaplama yapmak. Aşırı bir örnek olarak, C ++ 'da varadik fonksiyonların bağlanması zor olabilir, ancak C ++' da variadik fonksiyonları bağlayabilen bir JavaScript yorumlayıcısı yazmak mümkündür.

Dil tasarımı oldukça ilginç bir sanattır. Bir adım atmanız gereken en önemli adımlardan biri, dilinizin bel kemiğini oluşturmak istediğiniz davranışları belirlemektir. Bu davranışlar, kendi dilinizde yapılması kolay olan şeylerdir çünkü zemin katında bulunurlar. Her dile hangi özelliklerin dahil edileceğine dair tasarım kararları veriyoruz.

Özel bir örneğinize göre, C geliştirildiğinde, günün montaj dillerinin çalıştırılma şekline çok yakın çalışmak üzere tasarlanmıştır. Variadic işlevleri argümanları yığına itti, çok az çeşitliliği vardı. Maksimum taşınabilirliği sağlamak için bu değişken işlevlerin uygulanması derleyiciye bırakılmıştır. Buna göre, donanımın yetenekleri hakkında çok az varsayım yapılmıştır. JavaScript geldiğinde, sahne değişmişti. Zaten bir sanal makinede yorumlanmış bir dil olarak çalışıyor, bu nedenle denge rahatlığa doğru kayıyor. Değişken işlevlerin takılmasına izin vermek makul hale gelir. Tam Zamanında Derlenmiş bir JavaScript durumunda bile, derleyicilerimiz argümanlar hakkında eskiden C'nin derleyicilerinin saklamak istediğinden çok daha fazla bilgi depolamaya isteklidir.


1
@Wildcard (neredeyse) tüm derleyicileri bu bilgisiz olarak görürüm. Çoğu dil Turing tamamlandı, ama sonunda değil montaj tarafından yorumlanmalı / derlenmeli. Ancak bu gerekli bir fiziksel sınırlamadır - donanım asla güçlü olmuyor. Yine de, hesaplanabilirlik, gerçek anlamda bilgisayarlara pratik anlamda "uygulanabilen" birçok faydalı konsept sunar.
chi,

3
@Wildcard Bu önemsiz anlamda. Meclis (ve C) yalnızca sınırlı miktarda belleği ele alabilen sabit boyutlu işaretçilere sahiptir. Teorik olarak konuşursak, işaretçilerin sınırsız doğal olduğu bir montaj tanımlayabiliriz, ancak artık bu "montaj" demeyeceğim - buna URM veya buna benzer bir şey diyebilirim. Uygulamada, fiziksel sınırların programlarımızın çalışmasına izin verecek kadar büyük olduğunu iddia ediyoruz, bu nedenle bir bilgisayar yalnızca sınırlı bir durumlu bir makine olsa bile (örneğin ekleme yapamayacağı anlamına gelir), bunun hakkında bir Turing makinesi olarak düşünüyoruz ( bu yüzden ekleme yapılabilir).
chi

4
@chi Bu tam olarak doğru değil. Öncelikle, neredeyse herkes C Turing'in tamamlanmış olduğunu düşünür çünkü genellikle bu cümleyi “yeterli hafızanız” olduğu varsayımına dayandırırız. Bu varsayımların geçersiz olduğu yerlerde daha katı ifadelerden endişe duyması gereken çok az sayıda insan için, C bir işaretçinin boyutunu belirtmez ve ne kadar belleğin ele alınabileceğine ilişkin bir sınır belirtmez. Bu yüzden, mutlak en katı “Turing complete” anlamında bile, C gerçekten Turing tamamlandı.
Cort Ammon

3
@CortAmmon Katılmam gerekiyor. C'nin anlamını biçimlendirirsek, "yeterli hafıza" varsayımını yerleştirmeye çalışırsak sizeof(void *), ISO C standardına göre bir şeyi değerlendirmek zorunda kaldığımız için başarısız oluruz . Bu, bizi herhangi bir program için bellek miktarını, büyük bir şeye - ama hala bir sınırlamaya - zorlar. Örneğin, anlamı iki keyfi doğal ekleyen bir program yazamıyorum. C hala TM bantları gibi dosyalar kullanarak (yukarıda @ Hürkyl'ün belirttiği gibi) I / O aracılığıyla güçlü Turing yapılabilir. Bunun pratikte mesele olmadığı konusunda hemfikirim.
chi

7
Özyinelemeyle veya yığın tahsisi yoluyla çok fazla bellek tahsis edilmedikçe, programın tamamen iptal edildiğini, programın iptal edildiğini, sizeof (void *) ve sizeof (size_t) için daha büyük bir değerle yeniden derlendiğini düşünüyorum. ve en baştan tekrar çalışmaya başlar.
gnasher729

26

Dilleri farklı kara araçları olarak düşünün: bisikletler, arabalar, vagonlar, trenler.

Turing Completeness, "bu araç başka bir aracın gidebileceği her yere gidebilir" diyor. Yani, aynı işlevleri hesaplayabilirsiniz. Çıktıya girdi, bitmeye başlar.

Ancak, bu ifade oraya nasıl gideceğiniz hakkında hiçbir şey söylemez . Raylar üzerinde olabilir, yollarda olabilir, havada olabilir. Aynı şekilde, Turing Completeness, bir fonksiyonu nasıl hesapladığınız hakkında hiçbir şey söylemez . Özyineleme, yineleme veya bazı garip hücresel otomatlar kullanabilirsiniz. Türleri kullanabilir veya kullanamazsınız, dinamik veya statik teknikler kullanabilirsiniz. Ancak, düşündüğünüz tüm işlevler (veya kümeler / biçimsel diller) ise, Turing Complete'i tamamladığınız sürece, bu özellikleri size aynı gücü verir.


4
Bu harika bir benzetme. Ayrıca, bu sitede başka bir yerde gördüğüm, bir Turing makinesini geçen başka hesaplama modellerinin bulunup bulunamayacağı sorusuna güzel bir şekilde uzanıyor: Bu benzetmede, uçaklar ve uzay gemileri Turing Complete'den daha fazla ve sürat tekneleri başka bir şey. tamamen makinenin türü. :)
Wildcard

2
Hafif seyahatten daha hızlı, muhtemelen süper Turing hesaplaması için daha iyi bir benzetmedir. Bu olabilir mümkün, ama çoğu insan bunun olmadığını düşünüyorum.
jmite

@jmite Elbette, beynimizin süper turistik bilgisayarlar olduğunu söyleyecek iyi bir kanıt yok. Turing olmayan makineleri göz önünde bulundurma konusundaki yetersizliğimiz, mutlaka aşılmaz bir engel olmamasına rağmen, bundan kaynaklanabilir. Uçaklar aslında oldukça iyi bir benzetmedir - sadece araziyi görmezden gelen iki nokta arasında "dümdüz" giderler. Uzay-zamanın topolojisini görmezden gelirsek, ışıktan da daha hızlı uçabiliriz.
Tabii

1
@Luaan Doğru, ama beynimizin bir süper Turing bilgisayarı kavramak için mutlaka süper Turing olması gerekmez. Bir Turing Makinesinin anlamını, TM ve durumunu alan bir fonksiyon yazarak ve bir sonraki aşamaya geçiren Simply Typed Lambda Calculus gibi daha zayıf bir sonlandırma dili kullanarak tanımlayabilirim. Makineyi aslında bu dilde çalıştıramıyorum (çünkü sonsuz adım atabilir), ancak her adımın nasıl göründüğünü yazabilirim.
jmite

@Luaan, "beyinlerimizin süper turistik bilgisayarlar olduğunu önerecek hala iyi bir kanıt yok" - belki de, ama insan aklının sadece bir Turing makinesi olduğunu önerecek bir kanıt yok . Fikirlere izlenemez olduğu her yere işaret edilebilir hiçbir Turing makinesi olmadığı için bir insan tarafından kökenli zihin-oradaki ayrım hala yaşam olabilir köken fikirleri ve mekanik kurmaca olamaz. Ancak, hesaplama modellerinde olduğu gibi , Turing makinelerinin “hesaplama”, fikirleri ve hayalleri gibi makul olmasına rağmen makul bir şekilde her şeyi kapsadığını düşünüyorum.
Joker

17

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 , WHILEprogramlar 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:

  1. Genel hesaplama yapabilen tüm bilgisayar sistemleri eşit derecede güçlü ve
  2. 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:

  1. çeşitli simülasyonların ne kadar verimli olduğu ve
  2. 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, FORdöngülere WHILEdö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, WHILEve IFonlar koşullu bir sözdizim şeker olsa bile, mevcut GOTObizim 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.

  1. 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.
  2. 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!

7

Tüm Turing komple programlama dilleri aynı algoritma kümesini uygulayabilir. Dolayısıyla, bazı algoritmaların belirli bir dilde uygulanmasının çok zor olduğunu görürseniz, bunun imkansız olduğu anlamına gelmez.

Bir dilin sözdizimi ve anlambilimden oluştuğunu unutmayın. Bazen, bazı dillere ait kelime kümeleri Turing tamamlandı olarak kabul edilmek için minimum değildir, işleri kolaylaştıran özellikler vardır (bu yüzden onlara özellik denir ). Bu özellikleri çıkarırsanız, dil hala Tamamlanıyor demektir.

Bunlardan bazıları ilgi çekici olabilir:


5

Tüm Turing tamamlanmış diller aynı şeyleri hesaplayabilir.

Modern bir dil uygulamaya çalışırsanız, özelliklerinin çoğunun herhangi bir hesaplama kabiliyeti eklemediğini fark edeceksiniz . Bu özelliklerin çoğu, aynı dilde bulunan daha basit olanlara indirgenebilir.

İşte bazı örnekler:

  • Enums'leriniz yoksa, tamsayıları kullanabilirsiniz.
  • Boyutlarını bilen arabellekleriniz yoksa, boyutunu içeren bir boyut ve arabellek içeren bir tür oluşturabilirsiniz.
  • Arabellek sınırlarını denetleme sınırınız yoksa, her kullanışınızda dizini kontrol edebilirsiniz.
  • Değişken işlevleriniz yoksa, boyutlarını bilen bir arabellek alan ve bu arabellekten okuyan resmi argümanlardan elde ettiğiniz bilgilerin aynısını oluşturabilirsiniz.
  • Operatörünüz yoksa, işlevleri kullanabilirsiniz.
  • Birbirinizi devralacak türleriniz yoksa, birbirlerini içeren türler oluşturabilir ve bunlara fazladan bir dolaylı erişimle erişebilirsiniz, altyazı yalnızca tanıtıcıdan başlayarak tümünün türüne dönüştürülmesidir. idare-to-yeten tipi.
  • Temsilciniz yoksa ancak işlev işaretçileriniz varsa, başvuru nesnesini ve bir işlev işaretçisini içeren bir tür oluşturabilirsiniz.
  • Temsilciniz yoksa ancak arabiriminiz varsa, istediğiniz imzayla tek bir yöntem içeren bir arabirim bildirebilirsiniz.
  • Genel türleriniz yoksa, yalnızca ilgilendiğiniz üst veya alt sınırları varsayan genel olmayan türleri kullanabilirsiniz (ve derleyiciyi mutlu etmek için kullanım noktalarında uygun yayınlar kullanabilirsiniz).
  • Doğrusal / afine tip bir sisteminiz yoksa, herhangi bir değişkeni bir kereden fazla kullanmaktan kaçınabilirsiniz.
  • ...ve bunun gibi.

Yaygın dil tasarımı yapmak özelliklere odaklanan daha kolay ve daha uygun , daha erken ve benzeri bilinmeyen bileşenleri, marka paralellik Daha Güvenli karşı programı Hatalarımızı tanımak, daha hızlı işler hesaplamak için.

Tamamen hesaplamalı şeyler uzun zaman önce çivilendi.


4

Var olan cevaplar, tam anlamıyla Turing'in dilleri karşılaştırmanın iyi bir yolu olmadığını gösteriyor. Nitekim, hemen hemen bütün diller tamamlanıyor. ("Herkes özelse, o zaman kimse özel değildir" derdi.)

Ancak, bir matematiksel bir kesinlikle dillerin etkileyiciliğini karşılaştırmak mümkündür. Felleisen'in Programlama Dillerinin Etkileyici Gücü Üzerine bir göz atın . Kabaca, fikir şu soruyu sormak: A dilinde herhangi bir programı sadece yerel değişiklikler yaparak B dilinde bir programa dönüştürebilir miyim ? Başka bir deyişle, Felleisen sezginize matematiksel olarak kesin bir form verir.


2

Herkesin cevaplarının üstünde, işte bir benzetme.

Çamaşır yıkamak için üç şeye ihtiyacınız vardır: su tutan bir hazne, bir tür deterjan ve ajitasyon mekanizması. Bu birçok yolla gerçekleştirilebilir. Su haznesi, yeterince su tutan herhangi bir şeydir (örn. Bir küvet, bir göl, bir nehir). Çalkalama mekanizması mekanik bir cihaz, bir çamaşır tahtası veya giysilerin dövüldüğü bir kaya olabilir. Ve deterjanlar da çeşitli şekillerde gelir.

Peki modern bir bilgisayarlı çamaşır makinesi ile bir nehrin yanındaki bir kaya arasındaki fark nedir?

Verimlilik, güvenlik ve kolaylık: Üç şeye kadar kaynatır. Bazı yıkama yöntemleri daha az enerji kullanır, çevreyi daha az kirletir, daha az su kullanır vb. Bazı yıkama yöntemleri daha az tekrarlayan manuel faaliyetler (yaralanmalara neden olur) veya sert havalarda dışarıda olmayı gerektirir. Ve bazı yıkama yöntemleri, bu prosese bakıcılık yapmak için bir insan gerektirmez.

Turing-complete programlama dilleri genel amaçtır, bu nedenle birden fazla göreve getirilirler. Bununla birlikte, verilen bir görev için, bazı programlama dilleri daha verimli, daha uygun ve daha güvenlidir (yani, aslında program kullanıldığında daha az yanlış olabilir) anlamında diğerlerinden daha iyidir.


2

Diğerleri pek çok iyi cevap verdiler, ancak açıkça bir keresinde beni kafam karıştıran bir uyarıdan söz etmiyorlar: Bir bütünlük kazanmak, bir dilin girdilerden çıktılarına rasgele hesaplanabilir işlevleri ifade edebileceği anlamına gelmez. Olmalıdır: Bu zayıf bir girdi olarak hesaplanabilir fonksiyonların kümesinin alanını ve aralığını temsil eden bir yolu ve bu fonksiyonların her bir karşılık gelen çıkışlarına girişlerinden bir temsilini alan bir program harita şekilde verir.

Örneğin, Turing makinelerini ifade eden bir dili alın. Dilde her program bir Turing makinesidir.

Şimdi sadece a, b ve blank karakterlerini okuyan ve yazan tüm Turing makinelerinin alt dilini düşünün. Turing tamamlandı, ancak herhangi bir cs yazamadığı için, örneğin tüm girişlerde c üreten programları ifade edemiyor. Yalnızca ve bs dizeleri olarak kodlanan giriş ve çıkışlardaki tüm hesaplanabilir fonksiyonları ifade edebilir.

Bu nedenle, tüm Turing-complete dillerinin aynı şeyleri hesaplayabileceği doğru değil, bu şeyleri hesaplanabilir işlevler olarak sınırlandırsak bile potansiyel girdilerinden potansiyel çıktılarına kadar. Dil, girişlerin ve çıkışların belirli şekillerde kodlanmasını gerektirebilir.

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.