Troff ทัวริงสมบูรณ์หรือไม่


9

Troff รองรับทั้งนิยามแมโครที่ใช้.deและแยกย่อยโดยใช้.if(ดูหน้า 5 และ 6 ของคู่มือผู้ใช้ Troff ) ในสองประเด็นนี้มันเหมือนกับ TeX มาก อย่างไรก็ตามฉันไม่รู้โปรแกรมที่ซับซ้อนสูงที่เขียนใน Troff (ต่างจาก TikZ สำหรับ TeX) Troff ทัวริงสมบูรณ์หรือไม่

คำตอบ:


12

The Art of Unix Programmingของ ESR อ้างว่า:

เราจะตรวจสอบ troff โดยละเอียดในบทที่ 18; สำหรับตอนนี้ก็เพียงพอแล้วที่จะทราบว่ามันเป็นตัวอย่างที่ดีของ minilanguage ที่จำเป็นซึ่งมีขอบเขตในการเป็นล่ามเต็มรูปแบบ (มีเงื่อนไขและการเรียกซ้ำ แต่ไม่ใช่ลูปโดยไม่ได้ตั้งใจทำให้สมบูรณ์)

("บังเอิญ" ซึ่งตรงกันข้ามกับm4ที่กล่าวกันว่าเป็น "จงใจทัวริง - สมบูรณ์")


13

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

ทัวริงสมบูรณ์ไม่ได้หมายความว่าโปรแกรมที่ซับซ้อนสูงเป็นประโยชน์ - เพียงว่าพวกเขาเป็นไปได้ในทางทฤษฎีอย่างใดในระดับหนึ่งของการลบ - และไม่มีการขาดความหมายว่าพวกเขาไม่ได้ดังนั้น troff ของทัวริงสมบูรณ์หรือ การไม่มีโปรแกรมที่ซับซ้อนไม่ได้แนะนำอะไรมากไปในทางใดทางหนึ่ง


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

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

  • ดำเนินต่อไปตลอดไป
  • จำข้อมูลได้มากเท่าที่คุณต้องการ
  • เลือกอะไรถ้าจะทำอะไรต่อไป

บ่อยครั้งที่คุณสมบัติเหล่านั้นโดยเฉพาะอย่างยิ่งการไม่สิ้นสุดนั้นไม่เป็นที่พึงปรารถนาซึ่งอาจรวมถึง troff ด้วย นอกเหนือจากวิทยาการคอมพิวเตอร์เชิงทฤษฎีและการออกแบบภาษาทัวริงครบถ้วนไม่ได้เป็นคุณสมบัติที่น่าสนใจชะมัดเกือบตลอดเวลาแม้จะมีเล่ห์


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

4
@theindigamer - คำสั่งของx86movคือทัวริงสมบูรณ์ (เนื่องจากโหมดการกำหนดแอดเดรสที่ให้คุณใช้ตารางการค้นหาและ mnemonic เดียวกันนี้ใช้สำหรับการโหลดจัดเก็บและ mov ทันทีในการลงทะเบียน) ใน ISAs อื่น ๆ ที่มีmovคำสั่ง (เช่น ARM) เป็นเพียงการย้าย reg-reg และไม่ได้ทำให้สมบูรณ์ (แม้ว่าใน ARM มันสามารถทำ / กะได้) นอกจากนี้คุณต้องjmpสร้างห่วงรอบบล็อกmovคำแนะนำของคุณยกเว้นว่าคุณอยู่ในโหมด 16 บิตที่ตัวชี้คำสั่งสามารถล้อมรอบในส่วนรหัส 64k เพื่อ วนรอบโดยปริยาย
Peter Cordes

6
@SpaceBison แน่นอนมี :-) github.com/Battelle/movfuscator
Daniel Näslund

2
@PeterCordes: Ah; ในสมัยก่อนมีเครื่องสถาปัตยกรรม MOV ที่มีการแมปหน่วยความจำ ALU และ IP เป็นเพียงการลงทะเบียนอีกครั้งดังนั้น JMP จึงเป็น MOV อีกเครื่องหนึ่ง
Joshua

1
@Joshua: ความจริงแล้วความสนุก: ARM แบบ 32 บิตทำให้พีซีเป็นหนึ่งในจำนวนเต็ม 16 ตัวของการลงทะเบียน push {r4, lr}/ pop {r4,pc}เป็นเรื่องธรรมดาในฟังก์ชั่นที่จำเป็นต้องบันทึก / กู้คืนหนึ่งบันทึกการโทรที่เก็บไว้และจัดเรียงสแต็ก: พวกเขายังบันทึกลิงค์ reg และป๊อปมันกลับเข้าไปในเคาน์เตอร์โปรแกรมเพื่อกลับ (คำสั่งการจัดเก็บ / โหลดหลายครั้งของ ARM 32 บิตใช้บิตฟิลด์เพื่อระบุการลงทะเบียนเพื่อจัดเก็บ / โหลด) และใช่คุณสามารถใช้พีซีเป็นปลายทางของmovคำสั่งใดก็ได้ แต่ฉันไม่รู้ว่าเป็นเรื่องธรรมดาในอดีต แต่ฉันเคยได้ยิน ISAs ที่กระตุ้นการขนส่ง
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.