Изменения
→Некоторые другие ЯП
Зачастую Тьюринг-эквивалентные языки программирования называют Тьюринг-полными.
В теории вычислимости ''исполнитель'' (множество вычисляющих элементов) называется '''Тьюринг-полным''', если на нём можно реализовать любую вычислимую функцию. Другими словами, для каждой вычислимой функции существует вычисляющий её элемент (например, машина Тьюринга) или программа для исполнителя, а все функции, вычисляемые множеством вычислителей, являются вычислимыми функциями (возможно, при некотором кодировании входных и выходных данных).
Любой полный по Тьюрингу язык достаточно универсален, чтобы иметь возможность имитировать любой другой язык (хотя и с потенциальным замедлением в работе). Такие языки эквивалентны в рамках вычислений, которые могут произвести. Полные по Тьюрингу языки настолько распространены, что их можно обнаружить даже в примитивных на первый взгляд системах, например, [[Линейный клеточный автомат, эквивалентность МТ | клеточных автоматах]] или мозаичных системах.
На практике полнота по Тьюрингу похожа на идеализацию. Компьютеры имеют ограниченное количество памяти, а неограниченная по времени их работа может быть прервана физическим воздействием (выключение, поломка), что как бы ограничивает число задач, которые они могут решить. На самом деле, физические ограничения в контексте Тьюринг-полноты не берутся во внимание: Тьюринг-полный исполнитель не должен быть ограничен по времени и памяти лишь самим исполнителем.
==Критерии Тьюринг-полноты==
Если на языке программирования можно реализовать машину Тьюринга, то такой язык Тьюринг-полон, и наоборот. Возможность реализации машины Тьюринга на конкретном языке программирования можно ''грубо'' описать как перечень требований, которым этот язык должен для этого удовлетворять:
* Конечность (нет бесконечных символьных множеств и пр.).
* Фиксированное описание (формальность<ref>[https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA Википедия — Формальный язык]</ref>).
* Всегда достаточный объём доступной памяти — в идеале здесь имеется в виду неограниченная память, однако физические рамки не позволяют сделать память ЭВМ бесконечной, поэтому она просто должна быть ''"always big enough"''.
* Неограниченность времени выполнения — любая программа в должна иметь возможность работать до тех пор, пока не завершится.
* Возможность функциональной композиции (вызов одной функции из другой, рекурсия).
* Наличие циклов <tex>{\bf while}</tex> с прерыванием или эквивалентных им конструкций.
* Возможность останавливать выполнение (''halt'') или каким-то образом подавать сигнал о результатах выполнения.
* Представление множества натуральных чисел, понятие нуля и следующего числа. Возможны другие подобные системы.
* Поддержка входных и выходных данных (I/O), причём без формальных ограничений в объёме. Очевидно, что если любая программа, написанная на каком-то языке программирования, принимает на вход не более фиксированного n бит данных и возвращает не более n бит, этот язык не может быть Тьюринг-полным.
==Тьюринг-полнота и неполнота некоторых языков программирования==
Доказать Тьюринг-полноту языка программирования можно, предложив способ реализации машины Тьюринга на этом языке. Кроме того, можно предложить на нём интерпретатор Тьюринг-полного языка.
===Assembly language===
Язык Ассемблера достаточно примитивен относительно языков программирования высокого уровня: он рассчитан на архитектуру с конечной памятью и работает с конечным набором регистров. Однако, не был бы он полным по Тьюрингу, не были бы Тьюринг-полны и любые высокоуровневые языки программирования.
Всё необходимое для машины Тьюринга на asm можно сделать примерно так:
ADDS r0, r0, #1 <font color=green>; сдвиг ленты вправо</font>
ADDS r0, r0, #-1 <font color=green>; сдвиг ленты влево</font>
ADDS [r0], [r0], #1 <font color=green>; инкремент значения, на которое "указывает" головка ленты</font>
ADDS [r0], [r0], #-1 <font color=green>; декремент значения, на которое "указывает" головка ленты</font>
И далее использовать инструкцию <tex>\mathrm{BEQ}</tex> или ей подобную, чтобы выполнять определённую последовательность команд при определённом текущем значении, таким образом обеспечив ветвление.
===Pascal===
Язык Pascal позволяет смоделировать ленту машины Тьюринга с помощью двунаправленного списка из переменных, создаваемых оператором <tex>\mathrm{new}</tex>, семантика которого не предполагает отказа в создании переменной. Также с помощью списков
можно смоделировать сколь угодно большие числа. Стандарт не накладывает никаких ограничений: указательный тип абстрактен, множество значений указательного типа языком не ограничено.
В Паскале есть еще один тип данных с неограниченным множеством значений, файловый, также пригодный для моделирования ленты машины Тьюринга и представления больших чисел. Достаточно утверждений для очевидности Тьюринг-полноты языка Pascal.
===C===
В языке C нет высокоуровневого понятия переменной (в смысле Паскаля), есть объекты (object), хранящиеся в памяти как последовательно расположенные байты,имеющие адрес (байты в свою очередь состоят из неадресуемых битов). Целые типы ограничены (конечное множество значений), указатель отождествляется с адресом, постулируется возможность хранить адрес в целочисленной переменной (int или long — зависит от реализации), откуда следует ограниченность множества значений указателей, а стало быть, и ограниченность адресного пространства C-машины. То есть язык C, как и язык ассемблера, ориентирован на архитектуру с конечной памятью. Файл не является типом данных языка C, в отличие от Паскаля. Это вещь из окружения, для работы с которой есть операции над потоками в виде набора библиотечных функций. Тип fpos_t, принятый в стандарте C для позиционирования файлов, постулируется как «отличный от массива тип данных (object type)». Следовательно, множество значений этого типа конечно, а значит, максимальная длина файла в языке C ограничена сверху.
===SQL===
Сам по себе SQL никогда не считался полным по Тьюрингу языком. Однако, у него существует множество расширений, позволяющих делать рекурсивные запросы, циклы, списки, деревья и пр., например, с помощью PostgreSQL<ref>[http://assets.en.oreilly.com/1/event/27/High%20Performance%20SQL%20with%20PostgreSQL%20Presentation.pdf High Performance with PostgreSQL 8.4]</ref>. Более того, на в 2011 г. Habrahabr появилась статья, где показана машина Тьюринга на SQL<ref>[https://habrahabr.ru/post/113165/|Машина Тьюринга на чистом SQL]</ref> (в реализации Firebird 2.1, который ограничивает вложенность рекурсивных запросов до 2014 уровней). Тем не менее, всё ещё остаётся ограниченное query execution time.
===HTML===
HTML можно назвать языком программирования только в контексте формальной полемики. На деле он является языком гипертекстовой разметки и ни чем больше. Т. е. на HTML можно совершить только некоторую ограниченную совокупность действий, интерпретируемых браузером, однако никто не запрещает сделать язык, идентичный по синтаксису с HTML, но интерпретируемый совершенно по другому таким образом, чтобы он был полным по Тьюрингу.
===Некоторые другие ЯП===
{| style="background-color:#CCC;margin:0.5px"
!style="background-color:#EEE;padding:2px 8px"| '''Название языка'''
!style="background-color:#EEE;padding:2px 8px"| '''Год изобретения'''
!style="background-color:#EEE;padding:2px 8px"| '''Парадигма'''
!style="background-color:#EEE;padding:2px 8px"| '''Уровень'''
!style="background-color:#EEE;padding:2px 8px"| '''Зависимость от архитектуры процессора'''
!style="background-color:#EEE;padding:2px 8px"| '''Полнота по Тьюрингу'''
|-
|style="background-color:#FFF;padding:2px 8px"| C
|style="background-color:#FFF;padding:2px 8px"| 1972
|style="background-color:#FFF;padding:2px 8px"| Процедурный
|style="background-color:#FFF;padding:2px 8px"| Низкий
|style="background-color:#FFF;padding:2px 8px"| зав. от ISO
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| C++
|style="background-color:#FFF;padding:2px 8px"| 1983
|style="background-color:#FFF;padding:2px 8px"| Мультипарадигменный
|style="background-color:#FFF;padding:2px 8px"| Высокий/Низкий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| Язык Ассемблера
|style="background-color:#FFF;padding:2px 8px"| 1950
|style="background-color:#FFF;padding:2px 8px"| Полнофункциональный
|style="background-color:#FFF;padding:2px 8px"| Низкий
|style="background-color:#FFF;padding:2px 8px"| Да
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| SQL
|style="background-color:#FFF;padding:2px 8px"| 1989
|style="background-color:#FFF;padding:2px 8px"| Декларативный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Нет
|-
|style="background-color:#FFF;padding:2px 8px"| Haskell
|style="background-color:#FFF;padding:2px 8px"| 1990
|style="background-color:#FFF;padding:2px 8px"| Функциональный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| HTML
|style="background-color:#FFF;padding:2px 8px"| 1986
|style="background-color:#FFF;padding:2px 8px"| Декларативный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Нет
|-
|style="background-color:#FFF;padding:2px 8px"| CSS
|style="background-color:#FFF;padding:2px 8px"| 1996
|style="background-color:#FFF;padding:2px 8px"| Декларативный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Нет
|-
|style="background-color:#FFF;padding:2px 8px"| Java
|style="background-color:#FFF;padding:2px 8px"| 1995
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| JavaScript
|style="background-color:#FFF;padding:2px 8px"| 1995
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| Python
|style="background-color:#FFF;padding:2px 8px"| 1991
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| XML
|style="background-color:#FFF;padding:2px 8px"| 1998
|style="background-color:#FFF;padding:2px 8px"| Декларативный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|style="background-color:#FFF;padding:2px 8px"| Нет
|style="background-color:#FFF;padding:2px 8px"| Нет
|-
|style="background-color:#FFF;padding:2px 8px"| Brainfuck
|style="background-color:#FFF;padding:2px 8px"| 1993
|style="background-color:#FFF;padding:2px 8px"| Эзотерический
|style="background-color:#FFF;padding:2px 8px"| Низкий
|style="background-color:#FFF;padding:2px 8px"| Да
|style="background-color:#FFF;padding:2px 8px"| Да
|-
|style="background-color:#FFF;padding:2px 8px"| Whitespace
|style="background-color:#FFF;padding:2px 8px"| 2003
|style="background-color:#FFF;padding:2px 8px"| Эзотерический
|style="background-color:#FFF;padding:2px 8px"| Низкий
|style="background-color:#FFF;padding:2px 8px"| Да
|style="background-color:#FFF;padding:2px 8px"| Да
|}
==Интересные случаи полноты по Тьюрингу==
===Шаблоны C++===
Шаблоны C++ позволяют производить сложные вычисления ещё на стадии компиляции программы. Впервые это было продемонстрировано Эрвином Унрухом, который реализовал рекурсивный алгоритм распознавания простых чисел в процессе компиляции. Позже в статье Университета Индиана было продемонстрировано кодирование машины Тьюринга в шаблонах C++<ref>[http://web.archive.org/web/20131101122512/http://ubietylab.net/ubigraph/content/Papers/pdf/CppTuring.pdf C++ Templates are Turing-complete]</ref>.
===Java Generics===
Аналогично C++ Templates, Generics, несмотря на свои отличия, тоже оказались полными по Тьюрингу, что было подтверждено Раду Григор в одной из статей Кентского Университета<ref>[http://arxiv.org/pdf/1605.05274.pdf Java Generics are Turing-complete]</ref>.
* Minecraft<ref>[https://www.youtube.com/watch?v=7sNge0Ywz-M|Demonstrating the CPU. Then coughing a lot. Sorry about that. I may be dying.]</ref>. Возможно, достижение Тьюринг-полноты в игре-песочнице с возможностью создания логических элементов было неизбежным, но сложность компьютеров, собираемых из блоков в данной игре, достойна внимания.
* Little Big Planet<ref>[https://www.youtube.com/watch?v===Критерии Тьюринг-полноты===13GOFa1C4e4| LittleBigLife — The Game of Life in LittleBigPlanet]</ref>. Некоторые элементы игры представляют из себя ничто иное, как небольшие клеточные автоматы, которые можно запрограммировать.
* Конечность (нет бесконечных символьных множеств и пр[[Неразрешимость игры Braid|Braid]].)
'''void''' g(): '''if''' halts(g): '''for'''(;;)<tex>halts(g)</tex> должна возвращать либо <tex>true</tex>, либо <tex>false</tex>.* Возможность останавливать выполнение или каким-Если <tex>halts(g)</tex> вернула <tex>true</tex>, то образом подавать сигнал о результатах выполнения<tex>g</tex> никогда не остановится, получили противоречие* Если <tex>halts(g)</tex> вернула <tex>false</tex>, то <tex>g</tex> остановится, получили противоречие}}
===Тезис Чёрча-Тьюринга=Примечания==
* [http://wiki.c2.com/?TuringComplete Cunningham & Cunningham, Inc. — Turing Complete]
* [http://cmcmsu.no-ip.info/download/alg.lang.completeness.pdf А. А. Вылиток. Об алгоритмической полноте некоторых языков программирования]
* [http://ethclassic.ru/2016/10/21/turing-completeness-reality/ «Умные контракты»: полнота по Тьюрингу и реальность]
* [http://habrahabr.ru/post/231897/ Хабрахабр — Является ли HTML языком программирования?]
* [http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html Andreas Zwinkau — Accidentially Turing-complete]
* [https://ru.wikipedia.org/wiki/URISC Википедия — URISC]
[[Категория: Теория формальных языков]]
[[Категория: Теория вычислимости]]
[[Категория: Вычислительные формализмы]]
[[Категория: Машина Тьюринга]]