เป็นไปได้หรือไม่ที่จะมีภาษาการเขียนโปรแกรมที่ 'มีประโยชน์' ซึ่งไม่ได้ทำให้ทัวริงสมบูรณ์


37

เป็นที่ยอมรับกันหรือไม่ว่าภาษาต้องทัวริงให้สมบูรณ์และมีประโยชน์หรือไม่จริง ๆ แล้วมันมีความเป็นไปได้ไหมที่จะมีภาษาโปรแกรมที่มีประโยชน์

ฉันควรชี้แจงว่านี่ค่อนข้างเฉพาะเจาะจงเกี่ยวกับภาษา 'การเขียนโปรแกรม' ในความหมายดั้งเดิมไม่ใช่ภาษามาร์กอัปหรือแบบสอบถาม


3
@PhonicUK SQL ไม่ได้ทำให้สมบูรณ์ในตอนแรก
Ryathal

4
@Ryathal SQL ไม่ใช่ภาษาโปรแกรม แต่เป็นภาษาคิวรี
yannis

2
@PhonicUK คำถามของคุณในความคิดเห็นมีคุณค่าจริง ๆ เปลี่ยนคำถามที่โพสต์เป็นอย่างนั้นหรือมันจะถูกปิดเพราะไม่สร้างสรรค์ จริง ๆ แล้วมีภาษาที่ไม่ใช่ทัวริงที่มีประโยชน์และฉันอยากจะฟังรายละเอียดของพวกเขา
Jimmy Hoffa

5
regex ยังไม่เสร็จสมบูรณ์ แต่มันถูกใช้อย่างกว้างขวาง
ratchet freak

3
@DavidHammen การใช้งานจริงมี จำกัด ใช่เนื่องจากข้อ จำกัด ของเอกภพทางกายภาพของเรา (สามารถสร้างหน่วยความจำที่ จำกัด เท่านั้นที่สามารถเรียกใช้เครื่องในเวลา จำกัด ก่อนที่มันจะทำงานผิดพลาด) แต่นั่นไม่ได้หมายความว่าภาษามี จำกัด IOW ข้อกำหนดเฉพาะของภาษาที่สมบูรณ์ไม่จำเป็นต้องมีการนำไปปฏิบัติจากการกำหนดขีด จำกัด ดังกล่าวในโปรแกรมในขณะที่ภาษาที่ไม่ใช่ TC ต้องการตัวอย่างเช่นหลักฐานการยกเลิก

คำตอบ:


48

Coq , Agda , HOLและACL2เป็นภาษาที่มีประโยชน์มากและมีประสิทธิภาพมากแม้ว่าจะไม่ได้เป็นทัวริงที่สมบูรณ์

คุณลักษณะทั่วไปที่ทำให้ไม่สมบูรณ์ทัวริงคือข้อเท็จจริงที่ว่ามันเป็นไปได้เสมอที่จะพิสูจน์การเลิกจ้าง ข้อ จำกัด ที่ง่ายมากก็เพียงพอแล้ว: อนุญาตให้โทรแบบเรียกซ้ำได้เฉพาะเงื่อนไขที่มีขนาดเล็กกว่าเท่านั้น ดังนั้นในขณะที่มันเป็นไปไม่ได้ที่จะใช้ล่ามภาษาทัวริงสมบูรณ์หรือแม้กระทั่งสำหรับภาษาของตัวเองอื่น ๆ อีกมากมายที่มีประโยชน์สิ่งที่ยังคงเป็นไปเช่นคอมไพเลอร์ C ได้รับการรับรอง


2
สำหรับคนที่ไม่คุ้นเคยกับภาษาเหล่านั้นคุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่พวกเขาขาดไปได้ซึ่งทำให้พวกเขาไม่เข้าใจทัวริงและตัวอย่างบางส่วนของสิ่งที่สร้างขึ้นด้วยภาษาเหล่านั้น
PhonicUK

8
@PhonicUK: คอมไพเลอร์ C ไม่ได้เป็นการดำเนินงาน C เป็นเครื่องมือที่แปลงรหัสในภาษาหนึ่ง (C) ไปเป็นอีกภาษาหนึ่ง (โดยปกติจะเป็นรหัสเครื่อง) ไม่ได้หมายความว่าคอมไพเลอร์ Cเองนั้นเทียบเท่ากับโปรแกรม C ใด ๆ แบบสุ่ม
Joachim Sauer

9
@PhonicUK คุณไม่สามารถใช้ล่ามสำหรับภาษาทัวริงที่สมบูรณ์ในภาษาที่ไม่ใช่ทัวริงที่สมบูรณ์ แต่คุณสามารถใช้คอมไพเลอร์ได้แน่นอน (เนื่องจาก CPU ทัวริงสมบูรณ์จะทำการประเมินจริง)
SK-logic

11
@ SK-logic: "แน่นอน?" เป็นไปได้สำหรับ C เท่านั้นเนื่องจากเป็นภาษาที่ค่อนข้างง่าย เป็นไปไม่ได้สำหรับ C ++ เนื่องจากคอมไพเลอร์ต้องแปลรหัสเทมเพลต (ซึ่งเป็นทัวริงสมบูรณ์ในเวลารวบรวม)
MSalters

11
@MSalters ใช่ถ้าการคอมไพล์ภาษานั้นกำลังทำให้สมบูรณ์นั้นคอมไพเลอร์นั้นจะต้องถูกเขียนในภาษาที่สมบูรณ์แบบ ซึ่งก็ค่อนข้างชัดเจน (ไม่ต้องพูดซ้ำซาก) อย่างไรก็ตามโปรดทราบว่ามาตรฐาน C ++ อนุญาตให้มีข้อ จำกัด เกี่ยวกับโปรแกรมอินพุตเช่นความลึกการประเมินสูงสุดสำหรับอินสแตนซ์แม่แบบ (และการใช้งานที่มีอยู่ใช้เสรีภาพนี้) ถ้าฉันไม่ผิดนี่หมายความว่าคอมไพเลอร์ C ++ ที่ไม่ได้รับการรับรองอาจเป็นไปได้ (ยกเว้นปัญหาที่ไม่เกี่ยวข้อง)

12

ฉันคิดว่าคำว่า "mini-language" ของ Yegge หมายถึงความจริงที่ว่ามันมักจะมีประโยชน์ในการใช้ภาษาสำหรับปัญหาเฉพาะที่ภาษาไม่ต้องการความสมบูรณ์ - ทัวริงในการทำงานให้สำเร็จ การพูดภาษาที่สมบูรณ์จะมีประโยชน์ https://sites.google.com/site/steveyegge2/language-grubbing

Wikipedia ตอบคำถามนี้ดีมากสอดคล้องกับสิ่งที่ลำไส้ของฉันพูด ครั้งแรกที่ฉันคิดว่าคณิตศาสตร์บริสุทธิ์แล้วฉันจำ regexp และ Wikipedia แสดงรายการ Epigram ซึ่งฉันเชื่อว่าน่าจะอยู่ในเส้นเลือด 'คณิตศาสตร์บริสุทธิ์'

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

ภาษาที่ไม่ใช่ภาษาทัวริงที่สมบูรณ์

ภาษาการคำนวณจำนวนมากมีอยู่ซึ่งไม่ทัวริงสมบูรณ์ ตัวอย่างหนึ่งดังกล่าวคือชุดของภาษาปกติซึ่งเป็นนิพจน์ทั่วไปส่วนใหญ่ซึ่งสร้างขึ้นโดยออโตไฟไนต์ จำกัด ส่วนขยายที่มีประสิทธิภาพ แต่ยังไม่สมบูรณ์ของทัวริงของออโตมาต จำกัด คือหมวดหมู่ของออโตมาตาแบบกดลงและแกรมม่าแบบไม่มีบริบทซึ่งใช้กันทั่วไปในการสร้างแผนภูมิแยก ตัวอย่างเพิ่มเติมรวมถึงบางส่วนของรุ่นแรก ๆ ของภาษาพิกเซลเชดเดอร์ที่ฝังอยู่ใน Direct3D และ OpenGL ส่วนขยายหรือชุดของสูตรทางคณิตศาสตร์ในสเปรดชีตที่ไม่มีวงรอบ [อ้างจำเป็น] ในภาษาโปรแกรมการทำงานทั้งหมด ยุติเช่น Charity และ Epigram กุศลใช้ระบบประเภทและสร้างโครงสร้างการควบคุมตามทฤษฎีหมวดหมู่

ภาษาข้อมูล

ความคิดของทัวริง - ความสมบูรณ์ไม่ได้ใช้กับภาษาเช่น XML, JSON, YAML และ S- นิพจน์เพราะโดยทั่วไปจะใช้เพื่อแสดงข้อมูลที่มีโครงสร้างไม่ได้อธิบายการคำนวณ บางครั้งเรียกว่าภาษามาร์กอัปหรือมากกว่านั้นเป็น "ภาษาคำอธิบายข้อมูล" อย่างถูกต้อง

นอกจากนี้ยังกล่าวถึงการแสดงโครงสร้างข้อมูลไม่ใช่ภาษา แต่ฉันคิดว่า XSLT ควรนับเป็นการแสดงการคำนวณ XPath อาจไม่ได้อิงตามสิ่งที่ Yannis พูดไว้ข้างต้นเกี่ยวกับ SQL เป็นภาษาแบบสอบถามและไม่ใช่ภาษาคำนวณ บางที T-SQL หรือ PL / SQL นับเป็นภาษาการคำนวณแม้ว่าคุณจะสามารถทำการคำนวณได้อย่างมากมายโดยใช้การรวมของพวกเขาซึ่งรูปแบบทั่วไปของ SQL นั้นไม่ได้ระบุการรวม


8

ฉันเข้าใจว่า SQL เป็นที่นิยมในประเภทธุรกิจ


3
SQL เป็นภาษาแบบสอบถามไม่ใช่ภาษาโปรแกรม
PhonicUK

4
@PhonicUK: และสิ่งที่แตกต่างระหว่างภาษาแบบสอบถามและภาษาการเขียนโปรแกรมคืออะไร?
Joachim Sauer

8
@PhonicUK - Tex เป็นภาษามาร์กอัปข้อความและเป็นทัวริงสมบูรณ์
Martin Beckett

3
การใช้งาน sql ที่ทันสมัยเท่าที่ฉันรู้กำลังทำให้สมบูรณ์
shabunc

6
@shabunc IIRC พร้อมโพรซีเดอร์ที่เก็บไว้เท่านั้น การโต้เถียงนั้นค่อนข้างกลมหากไม่ใช่ทัวริงสมบูรณ์แล้วก็ไม่ใช่ภาษาโปรแกรม - ดังนั้นภาษา "การเขียนโปรแกรม" ทั้งหมดจึงเป็น TC
Martin Beckett

5

ความสมบูรณ์ของทัวริงนั้นเป็นสิ่งจำเป็นสำหรับภาษาที่จะเหมาะสมสำหรับการใช้งานเป็นภาษาวัตถุประสงค์ทั่วไป แต่มันไม่เพียงพอนั่นก็คือเพียงเพราะทัวริงสมบูรณ์มันไม่เหมาะสำหรับทุกโดเมนปัญหา:

  • ช่องว่างได้รับการพิสูจน์แล้วว่าเป็นทัวริงสมบูรณ์ แต่ก็ไม่เหมาะสำหรับโดเมนที่มีปัญหานอกเหนือจากความบันเทิงโปรแกรมเมอร์
  • เทมเพลต C ++ ได้รับการพิสูจน์แล้วว่าทัวริงสมบูรณ์ แต่คุณก็ยังไม่เคยเขียนโปรแกรมทั้งหมดกับพวกเขาเลย

ในทางกลับกันDSLนั้นเหมาะสำหรับโดเมนปัญหาที่ถูกออกแบบมา (สมมติว่ามันถูกออกแบบมาอย่างเหมาะสม) แม้ว่าจะไม่มีความสมบูรณ์แบบของทัวริง:

  • HTML *เป็นวิธีที่กระชับในการอธิบายแผนผัง DOM แม้ว่า JavaScript จะทัวริงสมบูรณ์และสามารถใช้ทำสิ่งเดียวกันได้ แต่ก็มีเสียงดังและไม่ชัดเจน
  • XPath และภาษาคิวรีอื่น ๆ PCRE ที่ไม่มีรหัสฝังตัวและเป็นเครื่องมือที่ทรงพลังสำหรับงานเดียวที่ถูกออกแบบมา

* IIRC ได้รับการพิสูจน์แล้วว่า HTML ที่มีภาพเคลื่อนไหว CSS นั้นทัวริงสมบูรณ์โดยใช้พวกเขาในการนำเกม Game of Life ของ Conway ไปใช้ในช่องทำเครื่องหมายต่างๆ แต่ประโยชน์ของ HTML ก็ยังคงอยู่แม้ในเบราว์เซอร์ที่ไม่รองรับภาพเคลื่อนไหว CSS


2
คุณมีลิงค์ไปสู่ชีวิตของ Conway ที่ใช้ใน CSS หรือไม่?
RBerteig

ฉันไม่รู้การใช้งาน CGOL ใน CSS แต่ฉันรู้ว่ามีการใช้งานกฎข้อ 110 ดูเหมือนจะไม่พบมันดูเหมือนว่าจะถูกย้ายไปแล้ว
Christian Mann

2
@ChristianMann คนนี้เหรอ? raw.github.com/elitheeli/stupid-machines/master/rule110/ …
SK-logic

-1 น่าสนใจมาก แต่ไม่ได้ตอบคำถามที่ถาม
mattnz

2
@mattnz: ผิด ผมยกตัวอย่างที่เป็นรูปธรรมของภาษาที่ไม่ใช่ภาษาทัวริงสมบูรณ์ที่เป็นประโยชน์ซึ่งผมคิดว่าเป็นคำตอบที่เหมาะสมที่จะ "มันเป็นจริงไปได้ที่จะมี 'ประโยชน์' การเขียนโปรแกรมภาษาที่ไม่ทัวริงสมบูรณ์?" ไม่แตกต่างจากคำตอบที่นี่อีก
back2dos

3

มีภาษาการเขียนโปรแกรมอยู่จริงซึ่งคุณสามารถเขียนโปรแกรม "ประสิทธิภาพ" เท่านั้น Pที่มีประสิทธิภาพในความรู้สึกนี้หมายความว่าทุกโปรแกรมที่เขียนในภาษาดังกล่าวแสดงให้เห็นถึงภาษา Bellantoni, Niggl และ Schwichtenberg อธิบายภาษาดังกล่าวที่นี่


1

ซี preprocessor ไม่ได้ทัวริงสมบูรณ์ (โดยการออกแบบ) แต่มันก็ยังคงสามารถใช้ล่ามภาษาที่เป็นทัวริงสมบูรณ์ (คำสั่งที่ใช้ภาษาตามที่อธิบายไว้ในเอกสารนี้เป็นเพียงการทำงานของล้ำหน้าด้วย สิ่งที่เป็นประเภทของ ML / Scheme ที่ทำงานได้อย่างหมดจดและอาจไม่มีความหมายใด ๆ - น่าจะใช้งานได้ดี - ถ้าไม่ใช่เพื่อการใช้งานที่ผิดปกติ)

เคล็ดลับที่อยู่เบื้องหลังมันคล้ายกับข้อโต้แย้งดังกล่าวข้างต้นเกี่ยวกับการใช้เครื่องทัวริงใด ๆ ในจักรวาลทางกายภาพ จำกัด ที่: preprocessor C ไม่สามารถให้บริการที่ไม่มีขีด จำกัดจำนวนของขั้นตอนหรือเซลล์ข้อมูลภาษา แต่มันสามารถ:

  1. ให้ค่าไดนามิกจำนวนมากอย่างไม่มีเหตุผล (2 ^ 64 หรือมากกว่านั้น) มีขนาดใหญ่พอสำหรับการแก้ปัญหาที่สมจริงที่สุดโดยใช้กระบวนการขยายแบบเอ็กซ์โปเนนเชียล ( พึมพำพึมพำชีวิตของจักรวาลพึมพำ )

  2. ใช้หมวกคงที่ตามอำเภอใจสำหรับหมายเลขข้างต้นคือในขณะที่จำนวนขั้นตอนจะต้องมีจำนวน จำกัด คุณสามารถเปลี่ยนสิ่งที่หมวกเฉพาะที่ "รวบรวม" - เวลาโดยการเปลี่ยนการตั้งค่าคงที่ของเครื่องยนต์ล่าม เนื่องจากไม่มี (ทฤษฎี) จำกัด เกี่ยวกับค่าที่แท้จริงของหมวกนี้ก็สามารถ (ทฤษฎี) จะขยายให้พอดีกับความต้องการพื้นที่สำหรับใด ๆโปรแกรมยุติ

เพื่อไม่ให้ยืนยันว่าคำสั่งซื้อนั้นจำเป็น "มีประโยชน์" ในตัวเองหรือเครื่องมือที่ใช้ CPP ใด ๆ จะเป็นไปได้ แต่เป็นข้อพิสูจน์ที่น่าสนใจเกี่ยวกับแนวคิด มันพิมพ์แบบไดนามิกตามที่คาดคะเนซึ่งผิดปกติสำหรับพื้นที่นี้


โหวตขึ้นสำหรับการพูดพึมพำในช่วงกลางของการบรรยาย
jpaugh

-1

ใช่แน่นอนเป็นไปได้ที่จะมีภาษาที่มีประโยชน์ที่ไม่ได้รับการทำให้ทัวริงสมบูรณ์ ดูที่นี่: http://tkatchev.bitbucket.org/tab/examples.html

อีกตัวอย่างหนึ่งของภาษาทัวริงที่มีประโยชน์คือ SQL (และอีกอันคือสเปรดชีตเช่น Gnumeric หรือ Excel แม้ว่าจะไม่ใช่ภาษาโปรแกรมจริงๆ)

สำหรับสาเหตุที่คุณต้องการภาษาที่ไม่สมบูรณ์ทัวริง: เพราะนั่นทำให้คุณสามารถรับประกันได้อย่างมั่นใจเกี่ยวกับพฤติกรรมของรันไทม์

ทัวริงสมบูรณ์ใส่ชัดหมายถึงมีความสามารถในการเรียกซ้ำ การเรียกซ้ำหมายถึงการมีโครงสร้างที่ไม่มีขอบเขตในหน่วยความจำ เนื่องจากในหน่วยความจำโลกแห่งความจริงไม่ได้ไม่มีที่สิ้นสุดทัวริงครบถ้วนต้องจัดการหน่วยความจำและ / หรือการเก็บขยะ

การห้ามการเรียกซ้ำเป็นวิธีที่ดีในการหลีกเลี่ยงปัญหาการจัดการทรัพยากร

โปรดทราบ! การเป็นทัวริงที่ไม่สมบูรณ์ไม่ได้หมายความว่าโปรแกรมใด ๆ จะต้องยุติ ภาษาที่ไม่สมบูรณ์ของทัวริงอาจอนุญาตให้มีการประเมินรายการสันหลังยาวที่ไม่มีที่สิ้นสุด


-1

ไม่มีใครพูดถึง "ภาษาการเขียนโปรแกรมย่อยทัวริง" ที่น่าสนใจจนถึงตอนนี้ดังนั้นฉันจะเพิ่ม

มันเรียกว่า"Crema" มันอธิบายตัวเองเป็น:

Crema เป็นส่วนหน้า LLVM ที่มีจุดมุ่งหมายเพื่อดำเนินการเฉพาะในพื้นที่ย่อยทัวริงสมบูรณ์ ออกแบบมาเพื่อให้ง่ายต่อการเรียนรู้และใช้งานได้จริงสำหรับงานด้านการเขียนโปรแกรมส่วนใหญ่ Crema สามารถจำกัดความซับซ้อนของการคำนวณของโปรแกรมให้เหลือน้อยที่สุดเพื่อปรับปรุงความปลอดภัย

มันค่อนข้างเรียบง่ายและค่อนข้างต่ำ

ควรมีลักษณะคุ้นเคยกับนักพัฒนา C

เริ่มแรกได้รับเงินทุนจากสำนักงานโครงการวิจัยขั้นสูงด้านกลาโหม (DARPA) แต่ดูเหมือนจะไม่ได้รับการสนับสนุนในขณะที่เขียน แต่บางทีใครบางคนอาจสนใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.