Turing'in tamamlanmayan bir 'yararlı' programlama dili olması gerçekten mümkün mü?


37

Herhangi bir dilin iyi olması için Turing'in eksiksiz olması gerektiği kabul edilirse, Turing'in tamamlanmayan 'kullanışlı' bir programlama diline sahip olması gerçekten mümkün müdür?

Bunun, özellikle geleneksel anlamdaki 'programlama' dilleri ile ilgili olduğunu ve işaretleme veya sorgulama dilleri olmadığını açıklamalıyım.


3
@PhonicUK SQL ilk
başlarda

4
@Ryathal SQL bir programlama dili değildir, bir sorgu dilidir.
yannis

2
@PhonicUK yorumdaki sorunuz gerçekten değerli, yayınlanan soruyu bununla değiştirin veya yapıcı olmadığı için kapanacaktır. Gerçekten de yararlı olmayan tam diller var ve onların detaylarını duymak isterim.
Jimmy Hoffa,

5
regex tam turing henüz yaygın olarak kullanılmamaktadır
cırcır ucube

3
@DavidHammen Gerçek uygulamalar sınırlıdır, evet, fiziksel evrenimizin sınırları nedeniyle sınırlıdır (yalnızca sonlu bellekler oluşturabilir, makineyi sadece arızalarından önce sınırlı bir süre çalıştırabilir). Ancak bu, dillerin sınırlı olduğu anlamına gelmez. IOW bir turing tam dilin Spec gerektirmeyen olmayan bir TC dil, örneğin, fesih kanıtı gerektirir oysa bir program üzerinde bu tür sınırlar empoze gelen bir uygulama.

Yanıtlar:


48

Coq , Agda , HOL ve ACL2 Turing-complete olmasalar da çok kullanışlı ve son derece güçlü dillerdir.

Turing'in tamamlanmamasını sağlayan ortak bir özellik, sonlandırmanın ispatlanmasının her zaman mümkün olmasıdır. Çok basit bir sınırlama yeterlidir: özyinelemeli çağrılara yalnızca yapısal olarak daha küçük şartlarda izin verilir. Bu nedenle Turing-tamamlanmış bir dil için ve hatta dilin kendisi için bir tercüman uygulamak mümkün olmamakla birlikte, sertifikalı bir C derleyicisi gibi birçok faydalı şey hala mümkündür .


2
Bu dillere aşina olmayanlar için, onların Turing'i tamamlamamasına neden olan eksiklikleri ve bu dillerle oluşturulmuş bazı örnekler hakkında daha fazla ayrıntıya girebilir misiniz?
PhonicUK

8
@PhonicUK: Bir C derleyicisi bir C uygulaması değildir . Bir dilde (C) kodunu diğerine (genellikle makine kodu) dönüştüren bir araçtır. Yani yok değil anlamına C derleyicisi kendisi herhangi rastgele C programı eşdeğerdir.
Joachim Sauer

9
@PhonicUK, Turing tamamlanmayan bir dilde Turing tamamlanmayan bir dilde tercüman uygulayamazsınız. Ancak bir derleyici uygulayabilirsiniz (elbette Turing-complete bir işlemci gerçek bir değerlendirme yapacak).
SK-mantığı

11
@ SK-mantık: "Elbette?" C için mümkün, çünkü oldukça basit bir dil. C ++ için mümkün değildir, çünkü bir derleyici şablon kodunu yorumlamalıdır (derleme zamanında Turing-tamamlandı).
MSalters

11
@ MSalters Evet, eğer dil derleme tamamlandıysa, onun için bir derleyici tamamlama dilinde yazılmalıdır. Bu da biraz açıktır (totolojik demek değil). Bununla birlikte, C ++ standardının, giriş programlarında, şablon başlatmaları için maksimum değerlendirme derinliği gibi (ve mevcut uygulamalar bu özgürlüğü alır) sınırlamalara izin verdiğine dikkat edin. Yanılmıyorsam, bunun anlamı turkuaz bir tamamlanmış C ++ derleyicisinin mümkün olabileceği anlamına gelir (ilgisiz konuları engellemek elbette).

12

Yegge'nin "mini dil" teriminin, bir dilin görevi başarmak için tamamlama gerektirmediği belirli problemler için bir dil kullanmanın genellikle yararlı olduğu gerçeğini ifade edeceğini düşünüyorum. -Toplam dilleri hazırlamak faydalı olabilir. https://sites.google.com/site/steveyegge2/language-grubbing

Wikipedia, bağırsaklarımın söylediklerine göre, bunu çok iyi cevaplıyor. Önce saf matematik düşünüyordum, sonra regexp'i hatırladım ve Wikipedia 'saf matematik' damarı olduğuna inandığım Epigram'ı listeledi.

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

Turing tamamlanmayan diller

Turing tamamlanmayan birçok hesaplama dili vardır. Bu tür bir örnek, sonlu otomatlar tarafından üretilen ve en çok düzenli ifadeler olan normal diller kümesidir. Sonlu otomataların daha güçlü fakat yine de Turing-tam uzantısı, program derlemesinin ilk aşamasında ayrıştırma ağaçları oluşturmak için yaygın olarak kullanılan, pushdown otomata ve bağlamsız gramerlerin bir kategorisidir. Diğer örnekler, Direct3D ve OpenGL uzantılarına gömülü olan piksel gölgelendirici dillerinin bazı eski sürümlerini veya döngüsel olmayan bir elektronik tablodaki bir dizi matematiksel formülü içerir. Charity ve Epigram gibi sonlandırın. Charity, kategori teorisini temel alan bir tip sistem ve kontrol yapıları kullanır.

Veri dilleri

Turing eksiksizliği kavramı, XML, JSON, YAML ve S ifadeleri gibi diller için geçerli değildir, çünkü bunlar tipik olarak hesaplamayı tanımlamak için yapılandırılmış verileri göstermek için kullanılır. Bunlar bazen işaretleme dilleri veya daha fazla "veri açıklama dilleri" olarak adlandırılır.

Ayrıca veri yapısı temsillerinin dil olmadığını da belirtir, ancak XSLT'nin bir hesaplama temsili olarak sayılması gerektiğini düşünürdüm, XPath belki de Yannis'in bir hesaplama dili değil, bir sorgu dili olduğu konusunda yukarıda söylediklerine dayanmıyor. Muhtemelen T-SQL ya da PL / SQL, hesaplama dilleri olarak sayılabilir; ancak, genelleştirilmiş SQL formunun topakları belirtmediği kümelerini kullanarak çok fazla hesaplama yapabilirsin.


8

SQL’in işletme türleri arasında oldukça popüler olduğunu biliyorum


3
SQL bir sorgulama dilidir, programlama dili değildir.
PhonicUK

4
@PhonicUK: ve bir sorgu dili ile programlama dili arasındaki fark tam olarak nedir?
Joachim Sauer

8
@PhonicUK - Tex bir metin biçimlendirme dilidir ve Turing tamamlandı
Martin Beckett

3
modern sql uygulamaları bildiğim kadarıyla tamamlandı.
shabunc

6
@ shabunc IIRC sadece saklı yordamlarla. Tartışma biraz daireselleşiyor, eğer Turing tamamlanmadıysa, o zaman bir programlama dili değildir - bu nedenle tüm "programlama" dilleri TC'dir
Martin Beckett

5

Bir dilin genel amaçlı bir dil olarak kullanıma uygun olması için tam bir bütünlük gereklidir . Ancak bu yeterli değildir , yani tam olarak Turing olduğu için, her sorun alanı için uygun değildir:

  • Boşluğun Turing'in eksiksiz olduğu kanıtlandı, ancak programcı eğlencesi dışındaki herhangi bir sorunlu alan için uygun olmadığı açık.
  • C ++ şablonları kanıtlandı Turing tamamlandı, yine de onlarla birlikte tüm programları yazamazsınız.

Buna karşılık bir DSL , (tam olarak düzgün bir şekilde tasarlandığı varsayılarak) tasarlandığı problem alanı için, tam bir Turing olmadan bile uygundur:

  • HTML * , bir DOM ağacını tanımlamanın özlü bir yolunu sunar. JavaScript Turing tamamlandı ve aynısını yapmak için kullanılabilirken, çok daha gürültülü ve belirsiz
  • XPath ve diğer sorgu dilleri, gömülü kod olmadan PCRE vb. Tasarlandıkları tek iş için güçlü araçlardır.

* IIRC, Conway'in Yaşam Oyununu bir dizi onay kutusuna uygulamak için CSS animasyonlu HTML'nin Turing olarak tamamlandığını kanıtladı. Ancak HTML'nin kullanışlılığı, CSS animasyonlarını desteklemeyen tarayıcılarda bile geçerlidir.


2
CSS'de uygulanan Conway'in Hayatı ile bir bağlantınız var mı?
RBerteig,

CSS'de bir CGOL uygulaması olduğunu bilmiyorum, ama Kural 110'un uygulandığını biliyorum. Ancak, onu bulmak gibi görünmüyor, taşınmış gibi görünüyor.
Christian Mann


-1 Çok ilginç ama sorulan soruya cevap
vermiyor

2
@ mattnz: Yanlış. Buradaki başka bir cevabın
back2dos

3

Aslında sadece "verimli" programlar yazabileceğiniz programlama dilleri var. Bu anlamda verimli, böyle bir dilde yazılmış her programın bir dili temsil ettiği anlamına gelir P. Bellantoni, Niggl ve Schwichtenberg burada böyle bir dili anlatıyor .


1

C önişlemci (tasarım gereği) tam-Turing değil, henüz hala bir tercüman uygulayabileceği bir dil için bir belgelerinde açıklandığı şekilde, tam (Sipariş-dil Turing, temelde sadece bir çalıştırma-the- olduğu sıradışı uygulama için olmasaydı tamamen işlevsel ML / Düzeni türü şey ve nispeten dikkat çekici olurdu - muhtemelen kullanımı oldukça güzel -.

Bunun arkasındaki hile, herhangi bir Turing makinesini sonlu bir fiziksel evrende uygulama konusundaki argümanlara benzer: C önişlemcisi dile sınırsız sayıda adım veya veri hücresi sağlayamaz , ancak şunları yapabilir:

  1. Üstel bir genişleme işlemi ( evrenin mümkünse mumble ömrü boyunca ) en gerçekçi problemleri çözmek için yeterince büyük olan makul olmayan bir dinamik sayı (varsayılan olarak 2 ^ 64 ya da öylesine) sağlayın .

  2. yukarıdaki numara için rastgele bir statik başlık kullanın , yani adımların sayısı sonlu bir sayı olsa da, tercüman motorunun statik ayarlarını değiştirerek belirli bir kapağın "derleme" sırasındaki değerini değiştirebilirsiniz. Bu sınırın gerçek değeri üzerinde (teorik) bir sınır olmadığından, herhangi bir sonlandırma programı için alan gereksinimine uyacak şekilde (teorik olarak) genişletilebilir .

Order'ın kendi içinde mutlaka "faydalı" olduğunu veya CPP tarafından uygulanan herhangi bir motorun olacağını iddia etmemekle birlikte, ilginç bir kavram kanıtıdır. Ayrıca sözde dinamik olarak yazılmış , bu alan için olağandışı.


Dersin ortasında mırıldanmak için fazla oy verin.
Jpaugh

-1

Evet, gerçekten Turing tamamlanmayan yararlı bir dile sahip olmak mümkündür. Buraya bakın: http://tkatchev.bitbucket.org/tab/examples.html

Yararlı bir eksik Turing diline başka bir örnek SQL'dir. (Ve bir diğeri de Gnumeric veya Excel gibi elektronik tablolar, gerçekte programlama dilleri olmasa da)

Turing tamamlanmayan bir dilin neden olmasını istediğinize gelince: çünkü bu, çalışma zamanı davranışı hakkında bazı güçlü garantiler yapmanızı sağlar.

Bütünlüğün tam olması, açıkça ifade edilmesi, özyineleme kapasitesine sahip olmak anlamına gelir. Özyinelemeye sahip olmak, bellekte potansiyel olarak sınırlandırılmamış yapılara sahip olmak anlamına gelir. Gerçek dünyada hafızanın sonsuz olmadığı için, eksiksiz olmanın hafıza yönetimi ve / veya çöp toplanması gerekir.

Özyinelemeyi yasaklamak, kaynak yönetimi konusunda gerçekten çok zor bir problemden kaçınmanın harika bir yoludur.

Nota Bene! Tamamlanmamış olmak, herhangi bir programın mutlaka sonlandırılacağı anlamına gelmez. Turing eksik bir dil, sonsuz bir tembel listesinin değerlendirilmesine izin verebilir.


-1

Bir ilginç "alt-Turing programlama dili" şimdiye kadar söylenmedi, ben de ekleyeceğim.

Buna "Krema" denir . Kendisini şöyle tanımlar:

Crema, özellikle Turing Complete alanının altında çalıştırmayı hedefleyen bir LLVM ön uçudur. Gereken basit programlama görevlerinin çoğu için pratik ve pratik olacak şekilde tasarlanan Crema, programın hesaplama karmaşıklığını güvenliği artırmak için gereken minimum düzeyde kısıtlayabilir.

Oldukça minimalist ve oldukça düşük seviye.

C geliştiricilere tanıdık gelmeli.

Öncelikle Savunma Gelişmiş Araştırma Projeleri Ajansı (DARPA) tarafından finanse edildi, ancak şu anda yazılmayan bir durumda görünüyor. Ama belki birileri yine de ilgileniyor.

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.