Здравствуйте, Mamut, Вы писали:
M>Да. Неэффективный код может быть. Да, например у того же Erlang'а проблемы вообще с архитектурой современных машин, и Erlang VM — это, по сути, самостоятельная ОС, мало имеющая отношения к тому, что под ней.
Тут можно только ответить, что других архитектур и современных машин у меня для Вас пока нет

Кстати, возможно, что проблемы у него не столько с современными машинами, сколько с нашей физической реальностью. Чего именно ему не хватает в современных машинах, и как это можно было бы исправить, чтобы программы на Эрланге работали эффективно (не медленее, чем на существующем C++)? Не нарушая законы физики?
M>И? Дальше что? Это все равно — теоретические изыски. На практике надо смотреть реальные задачи и доатсточно ли нам этой скорости.
Конечно, всегда можно сказать, что того, что мы имеем, нам вполне достаточно, а то, чего мы не имеем, нам совершенно не нужно. Примерно так делала лисица в известной басне.
Однако, если мы с помощью примитивной императивщины имеем экспоненциально более быструю реализацию, чем с помощью функционального подхода, то возникает вопрос: ради чего мы должны отказаться от первой в пользу второго?
C>>И что с этим приходится бороться малоестественными приёмами типа переделки рекурсии в хвостовую?
M>Что в этом малоестественного?
Это малоестественно в плане предлагаемой Вами математичности: естественное описание задачи, если мы хотим, чтобы она решалась быстро, оказывается похоронено под грудой костылей. Причём гораздо более сложной, чем в императивном случае. В данном случае можно предположить, что так приходится делать из-за того, что современные функциональные языки находятся в младенческом состоянии, вот-вот они научатся сами выявлять возможности переделки рекурсии в хвостовую, а ещё через чуть-чуть — понимать, как линейное вычисление можно переделать в логарифмическое, заодно сами же станут определять в каждом конкретном случае, какой вариант быстрее. Но именно это мы уже давно слышали от лисперов: функция стала полноправным членом программы, теперь компилятор может анализировать её исходный код, и уж с помощью компьютера он найдёт гораздо лучший способ перевести её в машинный код, чем человек. Но только воз и ныне там. Хорошо хоть научились хвостовую рекурсию переделывать в цикл (императивщина!), и теперь можно ему подсказывать, не выходя за рамки функционального подхода. Но помогает это не всегда.
Ещё один хороший пример — так любимый функциональщиками квиксорт. Что ему приходится вытворять с памятью из-за ограничения немодифицируемости существующих данных — это отдельная песня. Или можно вспомнить ленивость в хаскеле, с которой умеют бороться только положившие на это жизнь гуру.