Здесь больше глубины того, что имел в виду I , хотя будет интересно посмотреть, согласны ли другие или что они скажут.
Посмотрите, как работают компьютеры сегодня. У вас есть оборудование, которое имеет целочисленные регистры и регистры с плавающей запятой, а также огромный массив оперативной памяти и инструкции, которые в основном имеют форму, основанную на чтении значения этого регистра / ячейки памяти, и вставьте это новое значение в этот регистр. / клетка. (Обновление ячеек памяти имеет всевозможные преимущества, когда речь идет о строках кэша, моделях когерентности, памяти и т. Д.). Целые числа - 32 или 64 бита, и почти все языки программирования отображают эти типы данных, которые точно соответствуют аппаратному обеспечению. Почти каждая среда выполнения работает с небольшим стеком вызовов, где объекты, выделенные для стека, дешевы, и более дорогой «кучей», где другие объекты могут создаваться и уничтожаться, когда необходимы времена жизни, не основанные на стеке.
Теперь рассмотрим большинство современных языков функционального программирования. Неизменность является нормой; вы редко будете «тыкать» в память новыми значениями. (Это означает, что вы создаете больше новых объектов, что означает, что вы выделяете больше.) Лямбды и продолжения являются нормой; у вас реже есть время жизни объекта, соответствующее стеку. (Действительно, некоторые среды выполнения FP не используют стек; в реализации CPS понятие стека и счетчик программы неуместны.) Рекурсия - это циклическая конструкция, поэтому вам, по крайней мере, нужны 'хвостовые' вызовы, чтобы не потреблять стек в любом случае. Практически все нужно выделить "кучу", и, конечно, вам нужен сборщик мусора. Алгебраические типы данных предоставляют помеченные данные; теоретически эти теги потребуют только 2 или 3 бита данных, но для соответствия времени выполнения им часто требуется дополнительное слово памяти или больше. ... Я немного извиваюсь, но то, что вы делаете чаще всего на языке FP, как правило, точно соответствует вещам, которые масштабируются хуже или самые дорогие о типичной архитектуре компьютерного оборудования и базовой языковой среде исполнения.
Так не должно быть. Можно представить себе мир, в котором среда выполнения избегает стека и ускоряет работу с кучей / распределением (а не узким местом для многопоточных приложений). Можно представить мир, в котором взаимодействующие целочисленные типы имеют 29 или 60 битов, а среда выполнения / аппаратное обеспечение используют дополнительные оставшиеся биты слова, например. GC, или теги алгебраического типа, или еще много чего. (Я думаю, что некоторые реализации / среды выполнения FP выполняют некоторые из этих трюков.) И т. Д. И т. Д. Дело в том, что если взять современный функциональный язык как данность, а затем спроектировать среду выполнения / оборудование вокруг него, он будет выглядеть совсем по-другому. от типичного аппаратного обеспечения / времени выполнения сегодня.
(Я не думаю, что я сообщил об этом ужасно, и я не очень точен в отношении многих деталей, которые я точно не знаю, но, надеюсь, вы понимаете суть моего тезиса здесь.)