Hier ist mehr Tiefe von was I gemeint ist, obwohl es interessant sein wird zu sehen, ob andere zustimmen oder was sie zu sagen haben.
Überlegen Sie, wie Computer heute arbeiten. Sie verfügen über Hardware mit Integer- und Gleitkommaregistern sowie eine große Auswahl an Arbeitsspeicher und Anweisungen, die meist die Form 'basierend auf dem Lesen des Wertes dieses Registers/Speicherzelle haben, diesen neuen Wert in dieses Register eingeben /Zelle'. (Das Aktualisieren von Speicherzellen hat alle Arten von Auswirkungen, wenn es um Cache-Zeilen, Kohärenz- und Speichermodelle und so weiter geht.) Ganzzahlen sind 32 oder 64 Bits, und fast alle Programmiersprachen tauchen diese Datentypen auf, die genau zur Hardware passen. Nahezu jede Laufzeit arbeitet mit einem kleinen Aufruf-Stack, bei dem Objekte mit Stack-Zuweisung billig sind, und einem teureren "Heap", bei dem andere Objekte erstellt und zerstört werden können, wenn nicht-Stack-basierte Lebensdauern benötigt werden.
Betrachten Sie jetzt die meisten modernen funktionalen Programmiersprachen. Unveränderlichkeit ist die Norm; Sie werden die Erinnerung nur selten mit neuen Werten "durchbohren". (Dies bedeutet, dass Sie mehr neue Objekte erstellen, was bedeutet, dass Sie mehr zuweisen.) Lambdas und Fortsetzungen sind die Norm; Sie haben seltener Objektlebensdauern, die dem Stapel entsprechen. (In der Tat verwenden einige FP-Laufzeiten keinen Stack; in einer CPS-Implementierung sind Stapel- und Programmzähler nicht am richtigen Platz.) Rekursion ist ein Schleifenkonstrukt, so dass Sie mindestens "Tail" -Aufrufe benötigen, um nicht zu konsumieren der Stapel sowieso. Praktisch muss alles "haufen" zuweisen, und natürlich brauchen Sie einen Müllsammler. Algebraische Datentypen liefern markierte Daten; Theoretisch würden diese Tags nur zusätzliche 2 oder 3 Datenbits benötigen, aber um die Laufzeit anzupassen, benötigen sie oft ein zusätzliches Speicherwort oder mehr. ... Ich bin Art von mäandernden, aber die Dinge, die Sie tun am häufigsten in einer FP Sprache neigen dazu, die Dinge genau zu entsprechen, dass Skala schlimmste oder sind teuerste auf der typischen Computer-Hardware-Architektur und grundlegenden Sprechen Laufzeit.
Es muss nicht so sein. Man kann sich eine Welt vorstellen, in der die Laufzeit einen Stack vermeidet und Heap/Allokation schnell macht (und keinen Engpass für Multithread-Anwendungen). Man kann sich eine Welt vorstellen, in der die interoperablen ganzzahligen Typen 29 oder 60 Bits haben und die Laufzeit/Hardware die zusätzlichen übrig gebliebenen Bits des Wortes z. die GC oder algebraische Tags oder was auch immer. (Ich denke, einige FP-Implementierungen/Laufzeiten machen einige dieser Tricks.) Etc. etc ... Der Punkt ist, wenn man eine moderne funktionale Sprache als gegeben ansieht und dann Runtime/Hardware um sie herum entwirft, würde sie ganz anders aussehen von den typischen Hardware/Laufzeiten von heute.
(Ich glaube nicht, mitgeteilt, dass ich terrifically, und ich bin ungenau über viele Details, weiß ich nicht genau, aber hoffentlich grok Sie den Kern meiner Arbeit hier.)
Warum verwenden Sie das Wort 'begrenzt'? Beziehen Sie sich auf Produktivität mit dem Wort? Ich verstehe, dass es sehr schwer ist, die meisten Dinge in funktionalen Sprachen zu tun und daher weniger produktiv. Ich denke jedoch, dass das größte Problem die Innovationshärte ist. Sie können den natürlichen Versuch und Irrtum Ansatz nicht nehmen. Es ist besser, Dinge mit anderen Sprachen zu testen und dann schrittweise mit funktionalen Sprachen zu implementieren. Die "funktionale" Hardware ist eine interessante Idee. –
Ich meine "begrenzt" im reinsten Sinne des Wortes. Dass unsere Computer auf Nebenwirkungen angewiesen sind. Nebeneffekte erlauben es Ihrer CPU, aussagekräftige Daten in die Register zu lesen, in denen sie arbeiten kann. Nebeneffekte sind, wie diese Daten als Teil des Anwendungsstatus gespeichert werden können. Ich spreche nicht über Sprachen, sondern darüber, wie unsere Hardware funktioniert. – jalf
klar, ich weiß nicht, wie unser Computer funktioniert. Ich muss mir etwas lesen. Danke für Ihre Antwort! –