Apakah Troff Turing lengkap?


9

Troff mendukung definisi makro menggunakan .dedan bercabang menggunakan .if(lihat halaman 5 dan 6 manual pengguna Troff ). Dalam dua hal ini, sangat mirip dengan TeX. Namun, saya tidak tahu program yang sangat rumit yang ditulis dalam Troff (tidak seperti mengatakan TikZ untuk TeX). Apakah Troff Turing lengkap?

Jawaban:


12

ESR The Art of Unix Programming mengklaim itu adalah:

Kami akan memeriksa troff lebih terinci di Bab 18; untuk saat ini, cukup untuk dicatat bahwa ini adalah contoh yang baik dari bahasa yang imperatif yang berbatasan dengan penerjemah penuh (ia memiliki kondisi dan rekursi tetapi tidak berulang; itu tidak sengaja Turing-lengkap).

("Secara tidak sengaja" sebagai lawan dari m4, yang dikatakan "sengaja Turing-lengkap".)


13

Ya, troff sudah selesai Turing. Ini mendukung rekursi sewenang-wenang dan percabangan bersyarat, yang cukup. Ini juga memiliki register dan berbagai cara lain untuk menyimpan data, yang memberi Anda jalan lain lagi.

Kelengkapan Turing tidak menyiratkan bahwa program yang sangat kompleks itu praktis - hanya saja mereka secara teoritis mungkin, entah bagaimana, pada tingkat penghapusan tertentu - dan tidak juga ketiadaannya menyiratkan bahwa mereka tidak, sehingga tidak ada troff yang menjadi Turing-lengkap atau pun tidak. tidak adanya program yang rumit tidak menyarankan banyak hal tentang hal itu.


Turing kelengkapan bukan, umumnya, properti yang berarti sesuatu yang bermanfaat bagi Anda pengguna. Maksudnya adalah Anda dapat mensimulasikan mesin Turing dengan itu, bukan yang Anda inginkan, dan bukan bahwa output yang Anda dapatkan dari itu adalah sesuatu seperti apa yang Anda harapkan untuk dibaca. Input atau output mungkin hanya berupa angka, atau bahkan berapa kali sesuatu muncul, daripada sesuatu yang bermanfaat, dan jenis mesin yang Anda akhirnya simulasikan dan program-program mereka seringkali sulit dipahami.

Banyak bahasa dan sistem yang kebetulan Turing-lengkap tetapi tidak cukup berlaku untuk setiap pemrograman yang sebenarnya di bagian itu (misalnya, permainan Conway of Life atau CSS), dan beberapa bahasa yang sangat berguna untuk pemrograman nyata tidak Turing-lengkap (misalnya, Agda). Karakteristik yang menentukan sebenarnya adalah Anda bisa

  • terus berjalan selamanya
  • ingat sebanyak mungkin data yang Anda inginkan
  • pilih apa yang harus dilakukan selanjutnya

Seringkali sifat-sifat tersebut - terutama non-pemutusan hubungan kerja - sebenarnya tidak diinginkan, mungkin termasuk untuk troff. Di luar ilmu komputer teoretis dan desain bahasa, kelengkapan Turing bukanlah properti yang sangat menarik pada saat itu, meskipun menarik.


Ya tentu saja, itu bukan hal yang sangat berguna dengan sendirinya tetapi masih menarik - misalnya bahkan instruksi mov Turing lengkap.
cutculus

4
@theindigamer - x86 's movinstruksi Turing-lengkap. (Karena mode pengalamatan yang memungkinkan Anda menggunakan tabel pencarian, dan mnemonic yang sama digunakan untuk memuat, menyimpan, dan langsung bergerak untuk mendaftar.) Pada banyak SPA lainnya yang memiliki movinstruksi (misalnya ARM) itu hanya perpindahan reg-reg dan tidak turing-lengkap. (Meskipun pada ARM dapat melakukan shift / rotate.) Juga, Anda sebenarnya perlu jmpmembuat loop di sekitar blok movinstruksi Anda, kecuali jika Anda berada dalam mode 16-bit di mana pointer instruksi dapat membungkus dalam segmen kode 64k untuk loop secara implisit.
Peter Cordes

6
@ SpaceBison Tentu saja ada :-) github.com/Battelle/movfuscator
Daniel Näslund

2
@PeterCordes: Ah; di masa lalu ada ware MOV arsitektur yang memiliki memori dipetakan ALU dan IP hanyalah register lain sehingga JMP adalah MOV lain.
Joshua

1
@ Joshua: fakta yang menyenangkan: ARM 32-bit mengekspos PC sebagai salah satu dari 16 register integer untuk tujuan umum. push {r4, lr}/ pop {r4,pc}Umum dalam fungsi yang perlu menyimpan / mengembalikan satu register yang diawetkan dengan panggilan dan menjaga stack tetap selaras: mereka juga menyimpan reg tautan dan mengembalikannya ke penghitung program untuk kembali. (32-bit ARM's store / load-multiple instructions menggunakan bitfield untuk menunjukkan register mana yang akan disimpan / load.) Dan ya, Anda dapat menggunakan PC sebagai tujuan dari movatau instruksi apa pun. Tapi saya tidak tahu itu biasa di masa lalu. Tapi saya pernah mendengar tentang ISA yang dipicu transportasi.
Peter Cordes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.