Catatan, sementara saya tahu cara memprogram, saya cukup pemula dalam teori CS.
Menurut jawaban ini
Kelengkapan Turing adalah konsep abstrak dari kemampuan komputasi. Jika suatu bahasa Turing lengkap, maka ia mampu melakukan perhitungan apa pun yang bisa dilakukan bahasa lengkap Turing lainnya.
Baik. Ini masuk akal. Saya dapat menerjemahkan (kompilasi) C ke Majelis (dan saya melakukannya setiap hari!), Dan dapat menerjemahkan Majelis ke C (Anda dapat menulis mesin virtual di C). Dan hal yang sama berlaku untuk bahasa lain - Anda dapat mengkompilasi bahasa apa saja ke dalam Majelis, dan kemudian menjalankannya dalam VM yang ditulis dalam bahasa lain.
Tapi bisa saja program yang ditulis dalam bahasa yang lengkap Turing harus ditulis ulang di lain?
Bagaimana jika Majelis saya memiliki kode sandi LIGHTBUTTON? Secara fisik saya tidak dapat meniru bahasa itu pada sistem (bahasa) tanpa bola lampu.
Baik. Jadi Anda akan mengatakan bahwa karena kita berurusan dengan teori komputer , kita tidak membahas keterbatasan perangkat fisik.
Tetapi bagaimana dengan perangkat yang tidak memiliki multiplikasi? divisi? Sepengetahuan saya (meskipun ini lebih merupakan pertanyaan untuk matematika. SE), seseorang tidak dapat meniru perkalian (dan pasti bukan pembagian) dengan penambahan dan pengurangan [1].
Jadi bagaimana "turing bahasa lengkap" (yang dapat menambah, mengurangi, dan melompat) meniru bahasa lain yang dapat menambah, mengurangi, mengalikan dan melompat?
EDIT
[1]. Pada bilangan real arbitrer.
Jawaban:
Kelengkapan Turing mengatakan satu hal dan hanya satu hal: model perhitungan adalah Turing-complete, jika ada perhitungan yang dapat dimodelkan oleh Mesin Turing juga dapat dimodelkan oleh model itu.
Jadi, apa saja komputasi yang bisa dimodelkan Mesin Turing? Yah, pertama dan terutama, Alan Turing dan semua rekannya hanya tertarik pada fungsi pada bilangan alami. Jadi, Mesin Turing (dan kalkulus λ, kalkulus kombinator SK, fungsi μ-rekursif, ...) hanya berbicara tentang kemampuan komputasi fungsi pada bilangan asli. Jika Anda tidak berbicara tentang fungsi pada bilangan asli, maka konsep Turing-kelengkapan bahkan tidak masuk akal, itu sama sekali tidak berlaku.
Namun, perlu diketahui bahwa kita dapat menyandikan banyak hal menarik sebagai bilangan alami. Kita dapat menyandikan string sebagai bilangan alami, kita dapat menyandikan grafik sebagai bilangan alami, kita dapat menyandikan boolean sebagai bilangan alami. Kita dapat menyandikan Mesin Turing sebagai bilangan alami, yang memungkinkan kita membuat Mesin Turing yang berbicara tentang Mesin Turing!
Dan, tentu saja, tidak semua fungsi pada bilangan asli dapat dihitung. Mesin Turing hanya dapat menghitung beberapa fungsi pada bilangan asli, kalkulus λ hanya dapat menghitung beberapa fungsi pada bilangan asli, kalkulus kombinator SK hanya dapat menghitung beberapa fungsi pada bilangan asli,…. Anehnya (atau tidak), ternyata setiap model perhitungan (yang benar-benar dapat diwujudkan dalam jagat fisik kita) dapat menghitung fungsi yang sama pada bilangan alami (setidaknya untuk semua model yang telah kita temukan sampai sekarang). [Catatan: jelas, ada model komputasi yang lebih lemah , tetapi kami belum menemukan yang lebih kuat, kecuali beberapa yang jelas-jelas tidak kompatibel dengan alam semesta fisik kita, seperti model yang menggunakan bilangan real atau perjalanan waktu.]
Fakta ini, bahwa setelah lama mencari banyak model yang berbeda, kami menemukan, setiap saat, bahwa mereka dapat menghitung fungsi yang persis sama, adalah dasar untuk Turing-Turing-Gereja, yang mengatakan (secara kasar) bahwa semua model-model perhitungan sama kuatnya, dan bahwa semuanya menangkap gagasan "ideal" tentang apa artinya menjadi "dapat dihitung". (Ada juga aspek CTT kedua yang lebih filosofis, yaitu bahwa manusia yang mengikuti algoritme juga dapat menghitung fungsi yang persis sama dengan yang dapat dihitung TM dan tidak lebih.)
Namun , tidak ada yang mengatakan apa-apa tentang ini
Dan bahwa justru di mana perbedaan antara model yang berbeda dari perhitungan (dan bahasa pemrograman) ikut bermain.
Sebagai contoh untuk kenyamanan yang berbeda, Anda bisa membandingkan kode yang ditulis dalam bahasa tingkat tinggi, kode yang ditulis dalam rakitan, dan deskripsi TM untuk memecahkan masalah yang sama.
Dan saklar lampu Anda adalah contoh dari jenis ketiga perbedaan, hal-hal yang dapat dilakukan beberapa model yang tidak berfungsi pada bilangan asli dan karenanya tidak ada hubungannya dengan kelengkapan Turing.
Untuk menjawab pertanyaan spesifik Anda:
Tidak. Hanya jika program menghitung fungsi Turing-computable pada bilangan asli. Dan bahkan kemudian, mungkin perlu pengkodean yang kompleks. Sebagai contoh, λ-calculus bahkan tidak memiliki bilangan asli, mereka perlu dikodekan menggunakan fungsi (karena fungsi adalah satu-satunya yang dimiliki λ-calculus).
Pengkodean input dan output ini bisa sangat kompleks, seperti yang dapat mengekspresikan algoritma. Jadi, walaupun benar bahwa program apa pun dapat ditulis ulang, program yang ditulis ulang mungkin jauh lebih kompleks, lebih besar, menggunakan lebih banyak memori, dan jauh lebih lambat.
Bola lampu bukan fungsi Turing yang dapat dihitung pada bilangan asli. Sungguh, bola lampu bukanlah fungsi atau perhitungan. Mengaktifkan dan menonaktifkan bola lampu adalah efek samping I / O. Mesin Turing tidak memodelkan efek samping I / O, dan Kelengkapan Turing tidak relevan bagi mereka.
Kelengkapan Turing hanya berkaitan dengan fungsi yang dapat dihitung pada bilangan asli, itu tidak berkaitan dengan bilangan real.
Kelengkapan Turing sama sekali tidak menarik ketika datang ke pertanyaan seperti milik Anda karena dua alasan:
IF
,GOTO
,WHILE
, dan satu variabel bilangan bulat (dengan asumsi variabel dapat menahan bilangan bulat sewenang-wenang besar). Atau, rekursi. Banyak dan banyak dan banyak hal yang Turing-lengkap. Permainan kartu Magic: The Gathering sudah selesai Turing. CSS3 selesai-Turing. Filesendmail
konfigurasi selesai Turing. Intel x86 MMU sudah selesai Turing.MOV
Instruksi Intel x86 adalah Turing-complete. Animasi PowerPoint sudah selesai Turing. Excel (tanpa skrip, hanya menggunakan rumus) sudah selesai Turing. Protokol perutean BGP sudah selesai Turing.sed
adalah Turing-complete.mod_rewrite
Aturan Apache sudah lengkap Turing. Google untuk " (secara tidak sengaja ATAU mengejutkan) telah selesai"untuk menemukan beberapa contoh menarik lainnya. Jika hampir semuanya Turing-lengkap, Turing-lengkap berhenti menjadi properti yang menarik.Edwin Brady, penulis Idris, menggunakan istilah "Tetris-complete" untuk membicarakan beberapa aspek ini. Menjadi Tetris-complete tidak didefinisikan dengan ketat (selain dari yang jelas "dapat digunakan untuk mengimplementasikan Tetris"), tetapi itu mencakup hal-hal seperti menjadi tingkat tinggi dan cukup ekspresif sehingga Anda dapat menulis permainan tanpa menjadi gila, mampu berinteraksi dengan dunia luar (input dan output), mampu mengekspresikan efek samping, mampu menulis loop peristiwa, mampu mengekspresikan pemrograman reaktif, asinkron, dan bersamaan, mampu berinteraksi dengan sistem operasi, mampu untuk berinteraksi dengan perpustakaan asing (dengan kata lain: bisa memanggil dan dipanggil dengan kode C) dan sebagainya. Itu adalah fitur yang jauh lebih menarik dari bahasa pemrograman tujuan umum daripada Turing-kelengkapannya.
Anda mungkin menemukan jawaban saya untuk pertanyaan yang Anda tautkan menarik, yang menyentuh beberapa poin yang sama meskipun menjawab pertanyaan yang berbeda.
sumber
Tentu saja Anda dapat menerapkan perkalian dengan penambahan dan pengurangan:
Fakta bahwa Anda kemungkinan tidak akan melakukan itu tidak membuatnya kurang mungkin.
Divisi hampir tidak lebih sulit:
Dan bagaimana menurut Anda penggandaan dan pembagian sebenarnya dilakukan oleh sirkuit CPU? Petunjuk: ini bukan tabel pencarian yang besar. Ini lebih efisien daripada yang di atas, karena bit shifting juga digunakan, tetapi pada dasarnya diterapkan dalam hal penambahan dan pengurangan.
sumber
Tidak ada mesin fisik (benar-benar ada) yang dapat atau pernah menjadi Turing lengkap, karena kelengkapan Turing membutuhkan penyimpanan tanpa batas dan alam semesta tidak terbatas.
Oleh karena itu, jawaban afirmatif untuk apakah dua mesin abstrak adalah setara tidak membantu Anda menjawab pertanyaan apakah dua perkiraan fisik dari mesin-mesin itu setara.
Oleh karena itu, kesetaraan Turing dari model abstrak (misalnya) dua bahasa tidak berarti bahwa masing-masing dapat menghitung segala sesuatu yang lain dapat menghitung dalam praktek. Seseorang mungkin menghadapi keterbatasan fisik sebelum yang lain.
sumber
Sebagai soal fakta, operasi “tambah 1”, “kurangi 1” dan “lompatan bersyarat jika register yang ditentukan adalah nol” sudah cukup untuk membuat model komputasi Turing-complete (lihat mesin 2-counter sebagai referensi untuk suatu model komputasi Turing-complete sangat minim).
sumber
tl; mesin dr - Turing hanyalah deskripsi logis dasar untuk operasi sistem logis umum. Mereka dapat melakukan sebagian besar hal yang dapat kami gambarkan, termasuk memanggil opcode khusus dan membangun operasi matematika.
Dalam model Turing, simbol seperti
LIGHTBUTTON
opcode hanyalah string dalam alfabet apa pun yang digunakan komputer Turing.Jadi, mesin Turing akan bertanggung jawab untuk memproduksi string
"LIGHTBUTTON"
, atau nilai integer yang sesuai dengan opcode itu; apakah entitas eksternal bertindak atas hal itu atau bukan bisnis komputer Turing.Program C memiliki batasan yang sama. Ini adalah, sebuah program C hanya dapat memanggil opcode
LIGHTBUTTON
, tetapi apakah CPU benar-benar melakukan operasi yang terkait dengan opcode itu hingga CPU.Yup, mesin Turing dapat melakukan hal-hal itu, bahkan pada bilangan real, sejauh yang bisa dijelaskan oleh logika manusia. Mesin Turing bisa sesederhana otomatisasi seluler Peraturan 110 .
Triknya adalah membangun sistem logika dari fisika apa pun yang dimiliki mesin secara alami. Sebagai contoh, CPU mainstream dapat melakukan perkalian dan pembagian karena mereka memiliki unit logika aritmatika (ALU) . Tapi ALU itu bukan sihir; mereka hanya gerbang logika sederhana sendiri. Dan gerbang logika itu terbuat dari transistor . Dan transistor-transistor itu terbuat dari pasir yang diolah .
Jadi, untuk mendapatkan perangkat Turing-lengkap untuk melakukan matematika, hanya harus memprogram seperti itu.
sumber
Jika input ke program adalah urutan bit yang sewenang-wenang, dan outputnya juga merupakan urutan bit yang panjangnya sewenang-wenang, maka YES. Dengan asumsi Anda memiliki waktu dan energi untuk menulis ulang, dan bahwa Anda tidak peduli dengan kinerja, dan bahwa Anda memiliki memori fisik yang cukup untuk kedua implementasi.
Pertimbangan praktis yang berarti dua bahasa lengkap Turing tidak dapat dipertukarkan meliputi:
mereka mendukung berbagai jenis input dan output (misalnya akses database SQL)
mereka memiliki pustaka tipe data yang berbeda (mis. dukungan untuk string Unicode)
mereka menyediakan paradigma pemrograman berbeda yang dioptimalkan untuk tugas yang berbeda (misalnya objek, utas, coroutine, fungsi kelas satu)
mereka menyediakan pustaka fungsi yang berbeda (misalnya parsing XML dan serialisasi)
sumber
Tidak. Kelengkapan Turing tidak ada hubungannya dengan program , ini tentang fungsi matematika (atau algoritma ). Algoritma apa saja - perhitungan apa saja - dapat Anda lakukan dalam C, Anda dapat melakukannya dalam bahasa lengkap Turing lainnya (ini harus jelas). Tapi kelengkapan Turing sebenarnya tidak mengatakan Anda bisa melakukan I / O - sama sekali. Tidak berbicara tentang perangkat keras sama sekali. Hanya perhitungannya.
Anda dapat memperluas bahasa lengkap Turing dengan operasi perangkat keras apa pun yang Anda inginkan (secara teknis, ini adalah caranya
fputc
danfgetc
bekerja di C). Jika Anda mengambil dua bahasa lengkap Turing dan memperluasnya dengan operasi spesifik perangkat keras yang identik , maka mereka tetap dapat dipertukarkan. Jadi bahasa assembly Anda denganLIGHTBULB
operasi lebih kuat daripada Turing-complete; Anda bisa mengatakan sudah selesai TuringLIGHTBULB
. Untuk membuat bahasa lain identik dengan itu, itu juga harus Turing-selesai selesaiLIGHTBULB
; cara termudah untuk melakukannya adalah dengan menambahkanLIGHTBULB
primitif / instruksi / fungsi / dll.Inilah sebabnya mengapa implementasi C umumnya mendukung assembler inline, atau mendokumentasikan cara memanggil fungsi yang ditulis dalam assembler, dan mengapa implementasi bahasa lain umumnya menyediakan cara untuk memanggil fungsi yang ditulis dalam C.
sumber