Языки недетерминированного программирования

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

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

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

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

23
задан Tom Zych 15 June 2019 в 02:13
поделиться

4 ответа

См. http://msdn.microsoft.com/en-us/library/aa365539%28VS.85%29.aspx

-121--3791916-

Использование SetFileInformationStartHandle с FileInformationType как FILE_BASIC_INFO

-121--3791914-

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

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

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

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

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

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

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

SP

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

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

18
ответ дан 29 November 2019 в 02:16
поделиться

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

1
ответ дан 29 November 2019 в 02:16
поделиться

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

Вы можете взглянуть на Boost.Locale , который может обеспечить лучший API и использовать модель словаря gettext : http://cppcms.sourceforge.net/boost_locale/docs/ (не является официальной частью Boost, все еще бета-версия).


Изменить:

Если не нравится получить текст ...

Это технологии перевода:

  • OASIS XLIFF
  • GNU gettext po/mo files
  • POSIX каталоги
  • Qt ts/tm files
  • Java свойства,
  • ресурсы Windows.

Теперь:

  • Последние два всего дерьма... Очень трудно использовать переводить и поддерживать, не поддерживать множественные формы.
  • Qt ts/tm - требует использования Qt framework. Имеют модель, очень похожую на gettext . Неплохое решение, но ограничено Qt. Не так полезен в универсальных программах.
  • Каталоги POSIX - никто не использует их, нет поддержки множественных форм. Дерьмо.
  • OASIX XLIFF -- "стандартное" решение, зависит от XML, даже ICU требует компиляции к конкретным ресурсам ICU для использования. Ограниченные инструменты перевода, я не знаю библиотеки, которая поддерживает XLIFF. Формы множественного числа не так просты в использовании (ICU включал некоторую поддержку только в выпуске 4.x).

Что у нас теперь?

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

Так что решите, вы действительно считаете, что получить текст не так хорошо решение?

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

-121--1418286-

Очень хорошим способом является использование смарт-указателей, boost/tr1::shared_ptr. Память будет свободной, как только интеллектуальный указатель (выделенный стек) выйдет из области действия.

-121--3515216-

Java 2K

Примечание: Прежде чем перейти по ссылке и быть разочарованным: Это эзотерический язык и не имеет ничего общего с параллелизмом.

1
ответ дан 29 November 2019 в 02:16
поделиться

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

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

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

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

6
ответ дан 29 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: