Полное и параллельное программирование Тьюринга (истинный параллелизм)
Я часто вижу, как люди говорят, что если вы можете сделать X на каком-то языке, вы можете сделать Y на другом языке, который является полным аргументом Тьюринга. Поэтому у вас будет часто (обычно в ехидном комментарии) "конечно, вы можете сделать t с y, потому что y также является полным Тьюрингом.
Я давно взял теорию CS, но я не думаю, что это всегда верно, потому что я не уверен, где Тьюринг вписывается в параллелизм. Например, есть языки программирования с правильным оборудованием, которое вы можете выполнить, чтобы произойти точно в то же время, но другие, где это невозможно.
Я понимаю, что это, вероятно, больше проблема оборудования/драйвера, чем язык, но мне любопытно, если или как параллелизм изменяет то, что он должен быть полным Тьюринга? Может быть вы быть больше, чем Turing Complete?
EDIT: The причина то, что я задал этот вопрос, было в значительной степени связано с квантовыми вычислениями. Хотя принятый ответ не говорит об этом но квантовые вычисления (кажущиеся) подмножество Тьюринга.
2 ответов
Это запутанная тема для многих людей; вы не одиноки. Проблема в том, что здесь есть два разных определения "возможного". Одно из определений "возможного" - это то, как вы его используете: можно ли делать параллелизм, можно ли управлять гигантским роботом с помощью языка, можно ли заставить компьютер наслаждаться клубникой и т. д. Это непрофессиональное определение "возможного".
Тьюринг полнота не имеет ничего общего с тем, что возможно в выше здравого смысла. Конечно, параллелизм возможен не везде, потому что (по крайней мере, для некоторого определения параллелизма) необходимо, чтобы язык мог создавать код, который может работать на двух или более разных процессорах одновременно. Таким образом, язык, который может компилироваться только в код, который будет работать на одном процессоре, не будет способен к параллелизму. Он все еще мог быть Тьюрингом-полным, однако.
полнота Тьюринга связана с виды математических функции это может быть вычислено на машине с достаточным объемом памяти и временем работы. Для целей оценки математических функций один процессор может делать все, что может несколько процессоров, потому что он может эмулировать несколько процессоров, выполняя логику одного процессора за другим. (Недоказанное и недоказуемое, хотя фальсифицируема) утверждение о том, что все математические функции, которые могут быть вычислены на любом устройстве, вычисляются с помощью машины Тьюринга, является так называемым тезис Черча-Тьюринга.
язык программирования называется Turing-complete если вы можете доказать, что вы можете эмулировать машину Тьюринга, используя его. В сочетании с тезисом Черча-Тьюринга это означает, что язык программирования способен оценивать каждый тип математической функции, которую может оценить любое устройство, при наличии достаточного времени и памяти. Большинство языков являются Turing-complete, потому что для этого требуется только способность выделять динамические массивы и циклы использования и If-операторы, а также некоторые основные операции с данными.
идя в другом направлении, так как машина Тьюринга может быть построена для эмуляции любого процессора, который мы в настоящее время знаем, и языки программирования делают то, что они делают, используя процессоры, ни один текущий язык программирования не имеет более выразительной силы, чем машина Тьюринга. Таким образом, вычисление математических функций одинаково возможно на всех распространенных языках программирования. Функции вычислимы в одно можно вычислить в другом. Это ничего не говорит о производительность - параллелизм-это, по сути, оптимизация производительности.
да и нет. Нет известной модели вычислений, которая могла бы делать то, что машины Тьюринга могут делать и все еще называться вычислениями, в отличие от magic1. Следовательно, в этом смысле нет ничего, кроме полноты Тьюринга.
с другой стороны, вы можете быть знакомы с поговоркой, что "нет проблемы, которая не может быть решена путем добавления слоя абстракции". Таким образом, мы можем различать модели вычислений, которые сопоставляются непосредственно с машинами Тьюринга и моделями вычисления, требующие определенного уровня косвенности. "Добавление уровня косвенности" не является точным математическим понятием в целом, но во многих конкретных случаях вы можете наблюдать уровень косвенности. Часто самый простой способ доказать, что некоторая парадигма вычислений является вычисляемой Тьюрингом,-это написать интерпретатор для нее на машине Тьюринга, и это именно уровень косвенности.
Итак, давайте посмотрим, что значит моделировать параллелизм. Вы упоминаете возможность "выполнить все должно происходить в одно и то же время". Это особый вид параллелизма, называемый параллельность, и что касается параллелизма, это очень ограниченная модель. Мир параллелизм намного дикее, чем это. Тем не менее, параллелизм уже допускает вещи, которые требуют некоторой формы косвенности при моделировании на машине Тьюринга.
рассмотрим следующую задачу: учитывая компьютерные программы A и B (переданные на ленту универсального Тьюринга машина), выполните их оба и верните результат любой из программ; ваша программа должна завершиться, если оба A и B не завершаются. В чисто последовательном мире вы можете выполнить A и вернуть результат; или вы можете выполнить B и вернуть результат. Но если вы начинаете с выполнения A, и это оказывается бесконечной программой, в то время как B завершается, тогда ваша стратегия выполнения не решает проблему. И точно так же, если вы начинаете с выполнения B, ваша стратегия выполнения не решает проблема в том, что B может не завершиться, даже если A делает.
учитывая, что невозможно решить, завершается ли A или B, вы не можете основывать свое решение о том, какое из них выполнить первым. Однако есть очень простой способ изменить машину Тьюринга для параллельного выполнения программ: поместить A и B на отдельные ленты, дублировать автомат и выполнять один шаг каждой программы, пока одна из двух не завершится. Добавив этот уровень обработки, можно решить параллель проблема с исполнением.
решения этой проблемы требуется лишь незначительное изменение модель (легко модель двойной-лента машины Тьюринга с одной лентой, автомат). Тем не менее я упоминаю об этом, потому что это важный пример в [лямбда-исчислении](http://en.wikipedia.org/wiki/Lambda calculus), еще одна важная модель вычислений. Операция сокращения (оценки) двух лямбда-членов параллельно, пока один из них не достигнет нормальной формы (завершается), называется параллель Плоткина или. Известно, что невозможно написать лямбда-термин (программу лямбда-исчисления), реализующую параллельное или. Следовательно, лямбда-исчисление считается "по своей сути последовательным".
причина, по которой я упоминаю лямбда-исчисление здесь, заключается в том, что большинство языков программирования ближе к лямбда-исчислению, чем к программной машине. Таким образом, как программист, идеи из лямбда-исчисления часто более важны, чем идеи из Тьюринга машины. Пример parallel или показывает, что добавление параллелизма в language2 может открыть возможности, недоступные на языке оригинала.
можно добавить параллелизм к последовательному языку, по существу, с помощью того же трюка, что и на машинах Тьюринга: выполнить небольшой кусок нити A, затем небольшой кусок нити B и так далее. Фактически, если вы не делаете этого на своем языке, ядро операционной системы обычно может сделать это за вас. Строго говоря, это обеспечивает одновременное выполнение потоков, но по-прежнему с использованием одного процессора.
в качестве теоретической модели этот вид резьбового выполнения страдает ограничением, что это детерминированные. Действительно, любая система, которая может быть смоделирована непосредственно на машинах Тьюринга называется детерминированной. При работе с параллельными системами часто важно иметь возможность писать недетерминированные программы. Часто точный порядок, в котором чередуются несколько потоков вычислений неуместный. Так что две программы эквивалентны, если они по сути те же вычисления, но в несколько ином порядке. Вы можете сделать модель параллельных вычислений из модели последовательных вычислений, посмотрев на наборы возможных перемежений вместо одиночных запусков программы, но это добавляет уровень косвенности, который трудно управлять. Следовательно, большинство моделей параллелизма выпекают недетерминизм в систему. Когда вы это сделаете, вы не можете работать на машине Тьюринга любой больше.
1
В этом отношении мысль (то, что происходит в нашем мозгу) все еще волшебна в том смысле, что мы понятия не имеем, как это делается, у нас нет научного понимания этого. Все, что мы умеем воспроизводить (не в биологическом смысле!) является Тьюринг-вычислимым.
2
Обратите внимание, что здесь, язык включает в себя все, что вы не можете определить сами. В этом смысле, стандартная библиотека является частью "языка".