Почему полиморфные сообщения на практике гораздо более эффективны, чем сочетание объединения и возврата? - PullRequest
14 голосов
/ 27 октября 2010

Один из способов взглянуть на историю проектирования языков программирования - это революция с введением подпрограммы. Двадцать или тридцать лет спустя были серьезно рассмотрены два уточнения вызова подпрограммы:

  • Полиморфные сообщения
  • Унификация и возврат

Я только что программировал на Прологе после 20-летнего перерыва и осознал, насколько невероятно мощны объединение и возврат. Однако полиморфизм победил. Почему?

Ответы [ 5 ]

3 голосов
/ 28 октября 2010

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

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

3 голосов
/ 14 ноября 2010

Я много программировал на Прологе, и хотя я люблю язык за его выразительную силу, я должен согласиться с svenningsson, что, как только вы попытаетесь сделать что-то не декларативное, использование головоломки становится загадкой!оператор (вырезать, отбрасывает опции возврата) в нужных местах, что чрезвычайно подвержено ошибкам.

Хотя и не идеально, один из языков, который элегантно умудряется комбинировать код возврата и не декларативный (обязательный / побочный эффект) код, - это Icon,Он в основном изолирует выражения, которые могут естественным образом откатываться от общей структуры программы (например, операторов), так что относительно легко увидеть, что откат назад не приведет к неожиданным результатам, как в Prolog.Я не уверен, почему не основано больше языков на этой модели выполнения, я полагаю, что большинство программистов действительно застряли в последовательном мышлении, а обратный путь вводит в заблуждение.

Я не уверен, если обратный анализ сравнивается с полиморфизмомнепосредственно.Для меня это больше альтернатива замыканиям, поскольку использование # 1 замыканий в большинстве языков - это пользовательская итерация (например, map / filter / fold и т. Д.).Например, в Icon я могу сказать:

every write 10<(1..10)*2

, который берет последовательность чисел, умножает их на два, отфильтровывает эти> 10 и печатает результат («каждый» бит похож на повторениеОшибка цикла в Прологе).На языке, основанном на списках / замыканиях, я должен написать:

for (filter (map [1..10] \x.x*2) \x.x>10) \x.(write x)

предоставлено, это немного условно, так как понимание списков и каррирование могут упростить это, и не весь код значка такой краткий, но вы получаетеидея.Версия Icon не только более выразительна, но и имеет то преимущество, что она не использует промежуточные списки и «ленива» в параллельном смысле, то есть она выпишет первое число, прежде чем выполнить * 2 навторой элемент.Это означает, что он позволяет вам писать код, который одинаково эффективен, даже если вы не используете все сгенерированные результаты.

1 голос
/ 28 октября 2010

Предположение: передача сообщений была легче привязана к тогдашним популярным практикам и постепенно поглощалась. Для постепенного принятия идей Пролога потребовалось бы средство наподобие Oz , изобретенное только в 90-х годах, что-то вроде 20 лет позади Smalltalk. Поскольку Оз заявляет, что поддерживает как процедурное, так и логическое программирование в одном чистом пакете, я не вижу причин в принципе, чтобы мир не пошел по этому пути, если бы знал, как именно в нужное время. Вместо этого парадигма была связана с отношением «прожиг дисков» и разочарованием 5-го поколения.

(До сих пор я не пробовал Моцарта / Оз. Я играл с Прологом.)

0 голосов
/ 25 марта 2014

Отладку очень сложно отладить, когда вся система скажет вам: « Нет »!Существуют более совершенные компиляторы Prolog, но большинству людей этого уже не хватало к тому времени, когда они были вынуждены использовать плохой компилятор в университете.

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

До того, как «Полиморфные сообщения» станут нормальными, люди, использующие указатели функций, чтобы получить то же самое, ожидают меньшего шага.

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

0 голосов
/ 12 августа 2011

Сразу же мне в голову пришёл оператор cut : Пролог красив и лаконичен настолько, насколько вы хотите, и может программировать декларативно. Как только вы начнете использовать оператор cut (то есть вырезать весь возврат в этой позиции), вам придется продумывать слишком сложные ситуации, чтобы найти хорошее решение или понять код от других / вашего старого кода.

Таким образом, проблемы с оптимизацией обратного отслеживания, похоже, являются консенсусом: 3 из 4 ответов (по состоянию на 12 августа 2011 г.) указывают на это (+1 к Aardappel и svenningsson).

...