Недетерминированные языки программирования - PullRequest
23 голосов
/ 02 февраля 2010

Я знаю, что в Прологе вы можете сделать что-то вроде

someFunction(List) :- 
    someOtherFunction(X, List)
    doSomethingWith(X)
    % and so on

Это не будет повторять каждый элемент списка; вместо этого он будет разветвляться на разные "машины" (используя несколько потоков, возвращая обратно в один поток, создавая параллельные юниверсы или что у вас есть) , с отдельным выполнением для каждого возможного значения X, который заставляет someOtherFunction(X, List) возвращать истину!
(Понятия не имею, как это происходит, но это не важно для вопроса)

Мой вопрос: Какие еще существуют недетерминированные языки программирования? Кажется, недетерминизм - это самый простой и логичный способ реализации многопоточности в языке с неизменяемыми переменными, но Я никогда не видел, чтобы это было сделано раньше - Почему эта техника не более популярна?

Ответы [ 8 ]

17 голосов
/ 02 февраля 2010

Пролог на самом деле является детерминированным - порядок оценки задан, и порядок имеет значение.

Почему недетерминизм не популярен?

Недетерминизм непопулярен, потому что онзатрудняет рассуждение о результатах ваших программ, и по-настоящему недетерминированные исполнения (в отличие от семантики) трудно реализовать.

Единственные недетерминированные языки, о которых я знаю, это

  • Исчисление Дейкстры защищенных команд, которое он никогда не хотел реализовывать

  • Параллельная ML, в которой сообщения могут быть синхронизированы недетерминированно

  • Язык Promela Джерарда Хольцмана, который является языком проверки модели SPIN

SPIN фактически использует недетерминизм и исследует все пространство состояний, когда может.

И, конечно, любой многопоточный язык ведет себя недетерминированно, если потоки не синхронизированы, ноЭто именно та вещь, о которой трудно рассуждать, и почему так сложно реализовать эффективные, правильные структуры данных без блокировок.

Кстати, если вы хотите достичь параллелизма, вы можете достичь того же самогопростой функцией map на чистом функциональном языке, таком как Haskell.Есть причина, по которой Google MapReduce основан на функциональных языках.

6 голосов
/ 02 февраля 2010

Статья Википедии указывает на Amb , которая является производной от схемы с возможностями недетерминированного программирования.

Насколько я понимаю, главная причина, по которой языки программирования не делают этого, заключается в том, что запуск недетерминированной программы на детерминированной машине (как и на всех существующих компьютерах) по своей природе дорогой. По сути, недетерминированная машина Тьюринга может решать сложные задачи за полиномиальное время, для которых не известен полиномиальный алгоритм для детерминированной машины Тьюринга. Другими словами, недетерминированное программирование не в состоянии охватить суть алгоритмики в контексте существующих компьютеров.

Та же проблема касается Пролога. Любое эффективное или, по крайней мере, не очень неэффективное приложение Prolog должно использовать оператор «cut», чтобы избежать экспоненциального числа путей. Этот оператор работает только до тех пор, пока у программиста есть хорошее представление о том, как интерпретатор Prolog будет исследовать возможные пути детерминистическим и очень процедурным способом. Вещи, которые являются очень процедурными, плохо сочетаются с функциональным программированием, так как последнее - это попытка вообще не мыслить процедурно.

В качестве примечания, между детерминированными и недетерминированными машинами Тьюринга существует модель «квантовых вычислений». Квантовый компьютер, предполагая, что он существует, не делает всего, что может сделать недетерминированная машина Тьюринга, но он может сделать больше, чем детерминированная машина Тьюринга. Есть люди, которые в настоящее время разрабатывают языки программирования для квантового компьютера (предполагая, что квантовый компьютер в конечном итоге будет построен). Некоторые из этих новых языков являются функциональными. Вы можете найти множество полезных ссылок на этой странице Википедии . По-видимому, разработка квантового языка программирования, функционального или нет, и его использование не легки и, конечно, не «просты».

4 голосов
/ 01 июля 2016

В Прологе вы можете иметь как недетерминизм, так и параллелизм.Недетерминизм - это то, что вы описали в своем вопросе относительно кода примера.Вы можете себе представить, что предложение Prolog полно неявных amb операторов.Менее известно, что параллелизм также поддерживается логикой программирования.

История говорит:

Первым параллельным языком логического программирования был реляционный язык Кларка и Грегори, который был ответвлением IC-Prolog.Более поздние версии параллельного логического программирования включают в себя Shapro's Concurrent Prolog и Ueda's Guarded Horn Clause язык GHC.https://en.wikipedia.org/wiki/Concurrent_logic_programming

Но сегодня мы могли бы просто пойти с шагами внутри логического программирования. Здесь - пример реализации поиска через потоки.Это также может быть модифицировано для выполнения всех видов задач в коллекции, или, возможно, даже для создания агентских сетей в направлении распределенного искусственного интеллекта.

4 голосов
/ 09 ноября 2011

Одним из примеров недетерминированного языка является Occam , основанный на теории CSP . Комбинация конструкций PAR и ALT может привести к недетерминированному поведению в многопроцессорных системах, реализующих мелкозернистые параллельные программы.

При использовании мягких каналов, то есть каналов между процессами на одном процессоре, реализация ALT сделает поведение, близкое к детерминированному & dagger; , но как только вы начнете использовать жесткие каналы (физические непроцессорные каналы связи) исчезает любая иллюзия детерминизма. Не предполагается, что различные удаленные процессоры будут синхронизироваться каким-либо образом, и они могут даже не иметь одинаковое ядро ​​или тактовую частоту.

& dagger; Конструкция ALT часто реализуется с PRI ALT, поэтому вам нужно явно кодировать, если вам нужно, чтобы она была честной.


Недетерминизм рассматривается как недостаток, когда речь идет о рассуждениях и доказательстве правильности программ, но во многих отношениях после того, как вы его приняли, вы освобождаетесь от многих ограничений, которые детерминизм навязывает вашим рассуждениям.

Пока последовательность коммуникации не приводит к тупику , который может быть сделан с применением методов CSP, тогда точный порядок, в котором все это делается, должен иметь значение намного меньше чем вы получаете результаты, которые вы хотите вовремя.

Возможно, именно отсутствие детерминизма было основным фактором, препятствующим внедрению систем Occam и Transputer в военных проектах, где доминировали Ada в то время, когда точно знали то, что процессор делал на каждом такте, считалось необходимым для проверки правильности системы. Без этого ограничения системы Occam и Transputer, на которых он работал (единственные в то время процессоры с формально проверенной реализацией с плавающей запятой IEEE), были бы идеально подходящими для жестких военных систем реального времени, требующих высокого уровня функциональности обработки в небольшом пространство.

1 голос
/ 02 марта 2014

Язык программирования Sly , разрабатываемый в IBM Research, является попыткой включить недетерминированность, присущую многопоточному выполнению, в выполнение определенных типов алгоритмов. Похоже, что эта работа еще не завершена.

1 голос
/ 30 сентября 2010

Существует язык программирования для недетерминированных задач, который называется «программирование управляющей сети». Если вам нужна дополнительная информация, перейдите на http://controlnetworkprogramming.com. Этот сайт все еще находится в разработке, но вы можете прочитать некоторую информацию о нем.

1 голос
/ 02 февраля 2010

Java 2K

Примечание. Перед тем как щелкнуть ссылку и разочарование: это эзотерический язык, не имеющий отношения к параллелизму.

1 голос
/ 02 февраля 2010

Я считаю, что Haskell обладает способностью конструировать и недетерминированные машины. Поначалу Haskell может показаться слишком сложным и абстрактным для практического использования, но на самом деле он очень мощный.

...