Troff รองรับทั้งนิยามแมโครที่ใช้.de
และแยกย่อยโดยใช้.if
(ดูหน้า 5 และ 6 ของคู่มือผู้ใช้ Troff ) ในสองประเด็นนี้มันเหมือนกับ TeX มาก อย่างไรก็ตามฉันไม่รู้โปรแกรมที่ซับซ้อนสูงที่เขียนใน Troff (ต่างจาก TikZ สำหรับ TeX) Troff ทัวริงสมบูรณ์หรือไม่
Troff รองรับทั้งนิยามแมโครที่ใช้.de
และแยกย่อยโดยใช้.if
(ดูหน้า 5 และ 6 ของคู่มือผู้ใช้ Troff ) ในสองประเด็นนี้มันเหมือนกับ TeX มาก อย่างไรก็ตามฉันไม่รู้โปรแกรมที่ซับซ้อนสูงที่เขียนใน Troff (ต่างจาก TikZ สำหรับ TeX) Troff ทัวริงสมบูรณ์หรือไม่
คำตอบ:
The Art of Unix Programmingของ ESR อ้างว่า:
เราจะตรวจสอบ troff โดยละเอียดในบทที่ 18; สำหรับตอนนี้ก็เพียงพอแล้วที่จะทราบว่ามันเป็นตัวอย่างที่ดีของ minilanguage ที่จำเป็นซึ่งมีขอบเขตในการเป็นล่ามเต็มรูปแบบ (มีเงื่อนไขและการเรียกซ้ำ แต่ไม่ใช่ลูปโดยไม่ได้ตั้งใจทำให้สมบูรณ์)
("บังเอิญ" ซึ่งตรงกันข้ามกับm4
ที่กล่าวกันว่าเป็น "จงใจทัวริง - สมบูรณ์")
ใช่ troff เป็นทัวริงสมบูรณ์ สนับสนุนการเรียกซ้ำโดยพลการและการแยกตามเงื่อนไขซึ่งเพียงพอ นอกจากนี้ยังมีการลงทะเบียนและวิธีอื่น ๆ ในการจัดเก็บข้อมูลซึ่งจะช่วยให้คุณมีเส้นทางใหม่อีกครั้ง
ทัวริงสมบูรณ์ไม่ได้หมายความว่าโปรแกรมที่ซับซ้อนสูงเป็นประโยชน์ - เพียงว่าพวกเขาเป็นไปได้ในทางทฤษฎีอย่างใดในระดับหนึ่งของการลบ - และไม่มีการขาดความหมายว่าพวกเขาไม่ได้ดังนั้น troff ของทัวริงสมบูรณ์หรือ การไม่มีโปรแกรมที่ซับซ้อนไม่ได้แนะนำอะไรมากไปในทางใดทางหนึ่ง
ทัวริงสมบูรณ์ไม่ปกติคุณสมบัติที่หมายถึงสิ่งที่มีประโยชน์สำหรับคุณผู้ใช้ ทั้งหมดก็หมายความว่าคุณสามารถจำลองเครื่องทัวริงด้วยมันไม่ใช่สิ่งที่คุณต้องการและไม่ใช่ว่าผลลัพธ์ที่คุณได้รับจากมันเป็นอะไรที่เหมือนกับที่คุณคาดหวังที่จะอ่าน อินพุทหรือเอาท์พุทอาจเป็นตัวเลขหรือแม้แต่จำนวนครั้งที่มีบางสิ่งปรากฏขึ้นแทนที่จะเป็นสิ่งที่มีประโยชน์และประเภทของเครื่องที่คุณทำการจำลองและโปรแกรมของพวกเขามักจะเข้าใจยากที่จะเริ่มต้นด้วย
หลายภาษาและระบบต่าง ๆ มีการใช้ทัวริงสมบูรณ์ แต่ไม่สามารถใช้กับการเขียนโปรแกรมจริงในชุดย่อยนั้น (ตัวอย่างเช่น Game of Life หรือ CSS ของ Conway) และบางภาษาที่มีประโยชน์สำหรับการเขียนโปรแกรมจริงไม่ได้ทำให้ทัวริงสมบูรณ์ AGDA) ลักษณะการกำหนดเป็นจริงที่คุณสามารถ
บ่อยครั้งที่คุณสมบัติเหล่านั้นโดยเฉพาะอย่างยิ่งการไม่สิ้นสุดนั้นไม่เป็นที่พึงปรารถนาซึ่งอาจรวมถึง troff ด้วย นอกเหนือจากวิทยาการคอมพิวเตอร์เชิงทฤษฎีและการออกแบบภาษาทัวริงครบถ้วนไม่ได้เป็นคุณสมบัติที่น่าสนใจชะมัดเกือบตลอดเวลาแม้จะมีเล่ห์
mov
คือทัวริงสมบูรณ์ (เนื่องจากโหมดการกำหนดแอดเดรสที่ให้คุณใช้ตารางการค้นหาและ mnemonic เดียวกันนี้ใช้สำหรับการโหลดจัดเก็บและ mov ทันทีในการลงทะเบียน) ใน ISAs อื่น ๆ ที่มีmov
คำสั่ง (เช่น ARM) เป็นเพียงการย้าย reg-reg และไม่ได้ทำให้สมบูรณ์ (แม้ว่าใน ARM มันสามารถทำ / กะได้) นอกจากนี้คุณต้องjmp
สร้างห่วงรอบบล็อกmov
คำแนะนำของคุณยกเว้นว่าคุณอยู่ในโหมด 16 บิตที่ตัวชี้คำสั่งสามารถล้อมรอบในส่วนรหัส 64k เพื่อ วนรอบโดยปริยาย
push {r4, lr}
/ pop {r4,pc}
เป็นเรื่องธรรมดาในฟังก์ชั่นที่จำเป็นต้องบันทึก / กู้คืนหนึ่งบันทึกการโทรที่เก็บไว้และจัดเรียงสแต็ก: พวกเขายังบันทึกลิงค์ reg และป๊อปมันกลับเข้าไปในเคาน์เตอร์โปรแกรมเพื่อกลับ (คำสั่งการจัดเก็บ / โหลดหลายครั้งของ ARM 32 บิตใช้บิตฟิลด์เพื่อระบุการลงทะเบียนเพื่อจัดเก็บ / โหลด) และใช่คุณสามารถใช้พีซีเป็นปลายทางของmov
คำสั่งใดก็ได้ แต่ฉันไม่รู้ว่าเป็นเรื่องธรรมดาในอดีต แต่ฉันเคยได้ยิน ISAs ที่กระตุ้นการขนส่ง