Wie funktional ist C++11?



  • Das halte ich für eine zu enge Sichtweise.

    Und ich streube mich, wenn alles in einen Topf geworfen und umgeruehrt wird.

    ipsec schrieb:

    Das halte ich für eine zu enge Sichtweise. Das C++ keine funktionale Sprache ist, steht außer Frage, trotzdem kann man in C++ funktional programmieren.

    Ich kann in fast jeder Sprache durch Disziplin funktional Programmieren. Es geht hier aber nicht um eine Bibliothek oder den persoenlichen Programmierstil sondern um die Sprache C++. What's your point?

    #include <boost/range.hpp>
    

    Dan kann ich auch gleich http://www.cc.gatech.edu/~yannis/fc++/ benutzen. Aber das ist eine Bibliothek und eben nicht C++ als Sprache.

    Und dass intern Nebeneffekte auftreten, spielt keine Rolle, das ist bei funktionalen Sprachen nicht anders.

    In funktionalen Sprachen ist das eine Konsequenz der Computerarchitektur, es hat nichts mit der Sprache zu tun. Bei den gezeigten Beispielen in C++ werden die Seiteneffekte in der Bibliothek versteckt, sind in der Sprache immer noch vorhanden.

    Da hätte man dann einen funktionalen Subteil von C++ und man kann alles damit machen.

    Funktionen bei Template Programmierung erfuellen nicht alle Kriterien von http://en.wikipedia.org/wiki/First-class_object. Auch ist hier eine nette Uebersicht zu finden: http://en.wikipedia.org/wiki/First-class_function .



  • knivil schrieb:

    Es geht hier aber nicht um eine Bibliothek oder den persoenlichen Programmierstil sondern um die Sprache C++. What's your point?

    #include <boost/range.hpp>
    

    Dan kann ich auch gleich http://www.cc.gatech.edu/~yannis/fc++/ benutzen. Aber das ist eine Bibliothek und eben nicht C++ als Sprache.

    Und dass intern Nebeneffekte auftreten, spielt keine Rolle, das ist bei funktionalen Sprachen nicht anders.

    In funktionalen Sprachen ist das eine Konsequenz der Computerarchitektur, es hat nichts mit der Sprache zu tun. Bei den gezeigten Beispielen in C++ werden die Seiteneffekte in der Bibliothek versteckt, sind in der Sprache immer noch vorhanden.

    Hier geht es um das Paradigma der funktionalen Programmierung. C++ ist keine funktionale Programmiersprache, da sind wir uns einig. Trotzdem ist ein funktionales Programmieren möglich (keine Nebeneffekte, keine Schleifen, keine Variablen usw.). Ob dabei der nötige Unterbau in einer Bibliothek oder im Compiler ist, spielt keine Rolle. Man kann mit C++ funktional programmieren.

    knivil schrieb:

    Da hätte man dann einen funktionalen Subteil von C++ und man kann alles damit machen.

    Funktionen bei Template Programmierung erfuellen nicht alle Kriterien von http://en.wikipedia.org/wiki/First-class_object. Auch ist hier eine nette Uebersicht zu finden: http://en.wikipedia.org/wiki/First-class_function .

    Welche Kriterien erfüllen sie denn nicht?

    knivil schrieb:

    Das halte ich für eine zu enge Sichtweise.

    Und ich streube mich, wenn alles in einen Topf geworfen und umgeruehrt wird.

    Das lässt sich nunmal nicht vermeiden. Die Programmierparadigmen (imperativ, objektorientiert, funktional, logisch usw.) sind als Paradigmen nicht an Sprachen oder Spracheigenschaften gebunden, sondern an der Art und Weise der Programmierung. Die einzelnen Programmiersprachen unterstützen jetzt bestimmte Paradigmen mehr oder weniger gut. Mit C++ kann ich nicht so elegant funktional programmieren wie in Haskell und in Haskell nicht so elegant objektorientiert wie in C++. Beides ist aber möglich.



  • Trotzdem ist ein funktionales Programmieren möglich

    Das ist dein einziges Argument, und ein sehr schwaches obendrein, da es auf (fast) jede Sprache zutrifft. Und fuer micht spielt es eine Rolle, ob es die Sprache oder eine Bibliothek ist, ob es persoenlicher Programmierstil, Disziplin oder Spracheigenschaft ist.

    Welche Kriterien erfüllen sie denn nicht?

    can be constructed at run-time, was schwierig bei Templates ist.

    Haskell nicht so elegant objektorientiert wie in C++

    Haskell hat nur eine andere Auffassung von "objektorientiert" als C++ oder eben du. Diese Analogie hat nichts mit Funktionaler Programmierung zu tun. Bleib bitte beim Thema.

    Das lässt [..] ist aber möglich.

    Schwammig! Auf so etwas unkonkretes lasse ich mich nicht ein.



  • @irgendwer: Du hast offenbar keine Ahnung.

    Danke.

    Funktionale Sprachen haben meist das Lambda-Kalkuel als Ausgangspunkt. Damit haben lambda-Funktionen in C++ rein gar nichts zu tun.

    Es geht auch nicht darum, dass C++ eine funktionale Sprache ist. Es geht um die Frage "Wie funktional ist C++11". Darauf würde ich antworten: Kaum, aber es gibt Elemente, die funktional sind.

    Sehr eingeschraenkt.

    Sag mal, ließt du eigentlich auch das ganze Posting? Direkt danach habe ich doch geschrieben, dass die Möglichkeiten in C++ funktional zu programmieren weit weniger mächtig und elegant als in echten funktionalen Sprachen sind.

    Man sollte auch nicht vergessen, dass funktionales Programmieren ein Paradigma ist. Ich habe auch schon sehr (schlechten) "objektorientierten" Haskell-Code gesehen.

    ipsec schrieb:

    Mit C++ kann ich nicht so elegant funktional programmieren wie in Haskell und in Haskell nicht so elegant objektorientiert wie in C++. Beides ist aber möglich.

    👍



  • knivil schrieb:

    Welche Kriterien erfüllen sie denn nicht?

    can be constructed at run-time, was schwierig bei Templates ist.

    Ganz Falscher Denkweg. Wenn du Compiletime und Runtime trennst, dann landest du in einer engstirnigen Welt. (Es gibt beim Ausliefern von Code soviele unterschiedliche Stellen wo Sachen passieren koennen. Beim Kompilieren, beim Linken, beim Deployment, vor dem 1. Aufruf, die ganze Zeit im Background,...)

    Aber bitte: ich kontere mit einem c++ Interpreter. Templates werden zur Laufzeit erstellt (da wir ja keine Compiletime haben).



  • Irgendwer schrieb:

    Man sollte auch nicht vergessen, dass funktionales Programmieren ein Paradigma ist. Ich habe auch schon sehr (schlechten) "objektorientierten" Haskell-Code gesehen.

    Dabei ist der Support in Haskell doch al dente. Objektorientiertung ist keine Gegensatz zum funktionalen Paradigma.



  • Shade Of Mine schrieb:

    Aber bitte: ich kontere mit einem c++ Interpreter. Templates werden zur Laufzeit erstellt (da wir ja keine Compiletime haben).

    Du meinst die Compiletime gehört zu Laufzeit zu. Ohne Compiler will ich sehen wie sich Code zu eine Anwendung transformiert.



  • mächtig und elegant

    Darum geht es nicht.

    Beim Kompilieren, beim Linken, beim Deployment .. c++ Interpreter

    Das sind alles Spracheigenschaften?

    es gibt Elemente, die funktional sind

    Super Erkenntnis. Gleichzusetzen mit, dass einige natuerliche Zahlen ungerade sind.



  • knivil schrieb:

    Irgendwer schrieb:

    Natürlich sind C++11 Lambdas funktional

    Nein! Sie sind nur anonyme Funktionen. Reine Bequemelichkeit, damit nicht extra eine Funktion oder Klasse deklariert werden muss. Funktionale Sprachen haben meist das Lambda-Kalkuel als Ausgangspunkt. Damit haben lambda-Funktionen in C++ rein gar nichts zu tun.

    Wie lahm ist denn das Argument? Der theoretische Hintergrund ist doch völlig egal, es geht um das wie und was im hier und jetzt.

    Schon klar, dass du vom ideologischen Standpunkt heraus argumentierst, aber wenigstens etwas Substanz darfst du trotzdem in deine Beiträge packen, sonst machst du dich einfach nur lächerlich.



  • knivil schrieb:

    Trotzdem ist ein funktionales Programmieren möglich

    Das ist dein einziges Argument, und ein sehr schwaches obendrein, da es auf (fast) jede Sprache zutrifft.

    Man kann auch mit fast jeder Sprache funktional programmieren. Genauso wie man mit fast jeder Sprache objektorientiert programmieren kann, auch mit Sprachen wie C oder Haskell, die eigentlich nicht dafür vorgesehen sind.

    knivil schrieb:

    Und fuer micht spielt es eine Rolle, ob es die Sprache oder eine Bibliothek ist, ob es persoenlicher Programmierstil, Disziplin oder Spracheigenschaft ist.

    Dann hast du den Begriff "Paradigma" missverstanden.

    knivil schrieb:

    Welche Kriterien erfüllen sie denn nicht?

    can be constructed at run-time, was schwierig bei Templates ist.

    Bei TMP entspricht die Runtime gleich der Compiletime des eigentlichen Programms, und da geht das sehr wohl. Beispiel: Mit folgender Anweisung konstruiere ich zur TMP-Runtime eine Funktion, die ihr Argument um 1 erhöht (mit boost.mpl, weil einfacher): mpl::plus<mpl::_1, mpl::int_<1>> . Und so rufe ich sie auf: mpl::apply<mpl::plus<mpl::_1, mpl::int_<1>>, mpl::int<2>> .

    knivil schrieb:

    Haskell nicht so elegant objektorientiert wie in C++

    Haskell hat nur eine andere Auffassung von "objektorientiert" als C++ oder eben du. Diese Analogie hat nichts mit Funktionaler Programmierung zu tun. Bleib bitte beim Thema.

    Du hast den Begriff "Paradigma" missverstanden. Objektorientiert heißt (vereinfacht), es gibt Objekte von Klassen, die untereinander abgeleitet sein können, wobei die Objekte Botschaften austauschen. C++ ist eine Sprache, mit der man dieses Paradigma sehr gut umsetzen kann. Mit Haskell kann man es auch, aber weniger direkt. Es ist Blödsinn, diese Methoden der Umsetzung als "Auffassungen" der jeweiligen Sprachen zur Objektorientiertheit aufzufassen, weil das Paradigma als Konzept unabhängig von irgendwelchen Sprachen ist.
    Was hat das ganze mit funktionaler Programmierung zu tun? Funktionale Programmierung ist genauso ein Paradigma, also ein abstraktes Konzept. In diesem Fall etwas vereinfacht: es gibt Funktionen, die einen Rückgabewert haben und beliebig viele Parameter haben können, wobei diese Parameter möglicherweise selbst wieder Funktionen oder Funktionsaufrufe sind. Haskell setzt funktionale Programmierung sehr gut um, C++ weniger gut. Trotzdem kann man in C++ funktional programmieren.
    Weil übrigens die Sprachen jeweils verschiedene Paradigmen sehr gut umsetzen, nennt man C++ objektorientiert und Haskell funktional.

    knivil schrieb:

    Das lässt [..] ist aber möglich.

    Schwammig! Auf so etwas unkonkretes lasse ich mich nicht ein.

    Es ist aber nunmal unkonkret. Man hat funktionale Programmierung nicht an Haskell definiert.



  • Du hast den Begriff "Paradigma" missverstanden.

    Und du verstehst nicht, dass du nur Scheinargumente anfuehrst. Jeder muesste diesen inhaltslosen Aussagen zustimmen. Erkenntnisgewinn gleich Null. "Man kann in C++ funktional programmieren" ist deine einziges Argument. Ziemlich inhaltsleer, denn in welcher Sprache kann man das nicht? Funktionale Programmierung ist mehr als "frei von Seiteneffekten".

    Objektorientiert heißt (vereinfacht), es gibt Objekte von Klassen

    Ich brauche keine Nachhilfe in "objektorientiert". Es gibt sehr viele verschiedene Auffassungen von "objektorientiert". CLOS mit generischen Funktionen, basierend auf Prototypen wie in Javascript, Nachrichten/Methoden wie in C++ oder Smalltalk, Type classes wie in Haskell, ... Vieles kann davon nachgebaut werden, aber darum geht es nicht, genauso wenig wie es um objektorientiert geht.

    Objektorientiert .. Was hat das ganze mit funktionaler Programmierung zu tun?

    Das erinnert mich immer an sowas wie: Zwiebeln verhalten sich zu Porree wie Krokus zu ... . Als Schlussfolgerung bietest du auch nur wieder "Man kann in C++ funktional programmieren" an.

    Es ist aber nunmal unkonkret. Man hat funktionale Programmierung nicht an Haskell definiert.

    Ich habe Haskell nur einmal als Beispiel gleichzeitig mit Scheme, Lisp und ML. Was haben diese Sprachen wohl gemeinsam? Das Lambda-Kalkuel. Wo ist es in C++.

    Und es ist nicht unkonkret! Also mal Butter bei die Fische:

    Grundlage Lambda-Kalkül

    Nein.

    Funktionen als first class values

    Nein.

    Funktionen höherer Ordnung

    Sehr beschraenkt.

    Typsystem

    Hindley-Milner Type System? Nein.

    Typinferenz

    Sehr beschraenkt.

    Referentielle Transparenz

    Ja, moeglich. Wird aber nicht erzwungen oder kenntlich gemacht.

    Diese Liste kann gern erweitert oder kommentiert werden. Da beide Sprachen turingmaechtig sind, kann vieles nachgebaut werden. Aber das ist genauso ein Totschlagargument mit wenig Inhalt.

    Oder: Wie wörtlich kann man ein Common Lisp-Programm in C++11 übersetzen?

    Hier mein Lieblingsbeispiel inklusive meiner Loesung: http://stackoverflow.com/questions/5058219/generating-list-of-2-lists-in-scheme/5060091#5060091 . Ich bin gespannt.



  • Zeus schrieb:

    Du meinst die Compiletime gehört zu Laufzeit zu. Ohne Compiler will ich sehen wie sich Code zu eine Anwendung transformiert.

    Indem du zB jittest. Sobald du aktzeptierst dass es Just In Time Compiling gibt, wirst du erkennen dass Code in jedem Stadium transformiert werden kann.

    @knivil:
    Es sind eben keine Spracheigenschaften. Genau wie Laufzeit/Compiletime keine Spracheigenschaft ist. Jede Sprache kann zu jedem Zeitpunkt Kompiliert werden. Deshalb ist deine Argumentation eben so engstirnig. Weil Laufzeit irrlevant ist. Es wirkt aber nicht so als wuerdest du eine Diskussion fuehren wollen 😕



  • Shade Of Mine schrieb:

    Zeus schrieb:

    Du meinst die Compiletime gehört zu Laufzeit zu. Ohne Compiler will ich sehen wie sich Code zu eine Anwendung transformiert.

    Indem du zB jittest. Sobald du aktzeptierst dass es Just In Time Compiling gibt, wirst du erkennen dass Code in jedem Stadium transformiert werden kann.

    Sind wir bisschen blind, noch mal lesen und bitte verstehen!



  • Jede Sprache kann zu jedem Zeitpunkt Kompiliert werden. Deshalb ist deine Argumentation eben so engstirnig.

    Da gebe ich dir recht, aber ich wuerde gern Kompilieren,Linken, Deployment, c++ Interpreter, Jit herauslassen. Dann muss man ueber alles reden. Ueber alles kann man aber nicht reden, also muss man schweigen. Deswegen kann ich auch nicht auf diese Punkte eingehen.



  • knivil schrieb:

    Objektorientiert heißt (vereinfacht), es gibt Objekte von Klassen

    Bullshit! In C++ vielleicht. Es gibt sehr viele verschiedene Auffassungen von "objektorientiert". CLOS mit generischen Funktionen, basierend auf Prototypen wie in Javascript, Nachrichten/Methoden wie in C++ oder Smalltalk, Type classes wie in Haskell, ... aber das ist nicht Thema.

    Genau das ist dein Problem! Das sind alles keine Auffassungen, sondern Umsetzungen. Der Begriff "Klasse" hat auch erstmal wenig mit dem Schlüssenwort "class" in C++ zu tun. class in C++ bietet eine einfache Möglichkeit, eine "Klasse" aus der objektorientierten Programmierung abzubilden. In C kann ich auch Klassen abbilden, aber etwas umständlicher über Strukturen und Funktionspointer. In Haskell kann ich Typklassen erstellen und damit etwas umsetzen, was dem Klassen- und Vererbungskonzept aus der OOP sehr nahe kommt.
    Entsprechend weiter wird der Begriff "Objekt" in C++, C und Haskell mit Variablen abgedeckt. Das hat aber alles nichts mit Auffassungen zu OOP zu tun, sondern nur mit Umsetzungen.

    Ebenso gibt es diese Begriffe in der funktionalen Programmierung. Z.B. den Begriff "Funktion". Die C++-Funktionen eignen sich dafür nur bedingt, weil sie keine FCCs sind. Funktoren und Lambdas eignen sich aber. Ich muss also Kompromisse bei der Umsetzung eingehen (genauso wie ich nicht kompromisslos OOP in C umsetzen kann), aber ich kann es umsetzen.

    Ich zitiere nochmal aus dem Wikipedia-Artikel zu "Programmierparadigma": "Ein Programmierparadigma ist ein fundamentaler Programmierstil". Also ein Stil. Es geht nicht darum, ob die Sprache auf die Turingmaschiene oder das Lambda-Kalkül zurück ging, oder ob sie das "class"-Schlüsselwort besitzt oder nicht beseitzt, es geht nur darum, wie man einen bestimmten Stil in einer bestimmten Sprache umsetzen kann. Und das geht in vielen Sprachen mehr oder weniger gut. Es tut mir sehr leid, wenn dir das zu weit gefasst ist, aber so ist nunmal die Definition. Wäre die Frage "ist C++ eine funktionale Programmiersprache", wäre die Antwort ganz klar nein.

    knivil schrieb:

    Also mal Butter bei die Fische:

    Grundlage Lambda-Kalkül

    Nein.

    Egal.

    knivil schrieb:

    Funktionen als first class values

    Nein.

    Doch durch Funktoren und Lambdas.

    knivil schrieb:

    Funktionen höherer Ordnung

    Sehr beschraenkt.

    Doch mit Funktoren und Lamdas.

    knivil schrieb:

    Typsystem

    Hindley-Milner Type System? Nein.

    Ich wüsste ja nicht, dass ein Typsystem Voraussetzung wäre (z.B. LISP oder das Lambda-Kalkül haben beide keins), aber C++ hat ein Typsystem. Das es nicht so strikt wie Haskell ist, spielt keine Rolle.

    knivil schrieb:

    Typinferenz

    Sehr beschraenkt.

    Auch hier wüsste ich nicht, das das Voraussetzung ist

    knivil schrieb:

    Referentielle Transparenz

    Ja, moeglich. Wird aber nicht erzwungen oder kenntlich gemacht.

    Natürlich wird es nicht erzwungen, C++ ist eine Mehrparadigmensprache. Aber wie schon erwähnt ist funktionale Programmierung ein Stil, dem ich entweder folgen kann oder auch nicht.



  • @ipsec
    Es gibt zwei unterschiedliche konzeptuelle Modelle zur Objektorientierung. Klassenbasiert und Protypebasierend.

    Verstandnisfrage!
    Mit Hindley-Milner ist Typinferenz gemeint?



  • Es heißt übrigens der Lambda-Kalkül.
    Und noch was: Lisp basiert nicht wirklich auf dem Lambda-Kalkül, der gute John McCarthy hatte das damals nicht so richtig verstanden, als er seine anonymen Funktionen LAMBDA nannte. Im Lambda-Kalkül haben Variablen lexikalische Bindung, das war im Ur-LISP nicht so.



  • a) Scheme und Common Lisp haben lexical scoping. Ich sehe kein Problem. Aber schauen wir uns das Original an: http://www-formal.stanford.edu/jmc/recursive.html .

    we need a distinction between functions and forms and a notation for expressing this distinction. This distinction and a notation for describing it, from which we deviate trivially, is given by Church [3]

    3. A. CHURCH, The Calculi of Lambda-Conversion (Princeton University Press, Princeton, N. J., 1941).

    D.h. auch wenn das Ur-Lisp nicht lexical scoping umgesetzt hat, ist es doch stark im Lambda-Kalkuel verwurzelt.

    b) Ich bevorzuge Wikipedia-Artikel auf Englisch, da vieles in den deutschen Seiten "anfechtbar" ist:

    functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data

    Waehrend ich Programmzustand in C++ durchaus verstecken kann, so ist es in C++ nicht moeglich (oder nur in trivialen Faellen), Berechnungen nicht als Evaluation von mathematischen Funktionen behandeln. Denn genau das macht das Lambda-Kalkuel. Es ist deshalb nicht egal. Selbst in der deutschen Version stosse ich auf:

    Die funktionale Programmierung entspringt der akademischen Forschung. In den 1930er Jahren arbeiteten verschiedene Personen am Lambda-Kalkül. Hierbei geht es um Funktionen und deren Auswertung.

    c)

    Doch durch Funktoren und Lambdas.

    Ja, Closures koennen mit Objekten nachgebaut werden, indem der Klammeroperator ueberladen wird. Aber: "Objects are a poor man's closures".

    d) Zum Artikel von Kalkuel: Ich bevorzuge das. http://www.duden.de/rechtschreibung/Kalkuel_Taktik_Strategie .



  • knivil schrieb:

    b) Ich bevorzuge Wikipedia-Artikel auf Englisch, da vieles in den deutschen Seiten "anfechtbar" ist:

    functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data

    Waehrend ich Programmzustand in C++ durchaus verstecken kann, so ist es in C++ nicht moeglich (oder nur in trivialen Faellen), Berechnungen nicht als Evaluation von mathematischen Funktionen behandeln. Denn genau das macht das Lambda-Kalkuel. Es ist deshalb nicht egal.

    Ich bestreite nicht, dass funktionale Programmierung und allgemein funktionale Programmierpsrachen auf das Lambda-Kalkül zurückgehen. Du musst aber mal den Artikel zu Programmierparadigma lesen, diesmal auf Englisch: "A programming paradigm is a fundamental style of computer programming". Da haben wir wieder den Stil. Und diesen kann ich in C++ nachbauen. Ich muss mehr Arbeit leisten (nötiger Unterbau, der bei funktionalen Sprachen schon im Compiler steckt), ich muss teilweise Kompromisse eingehen ("Objects are a poor man's closures" ist schon richtig), der Compiler optimiert nicht in der Form, wie er es bei einer funktionalen Sprache machen würde, aber ich kann den funktionalen Stil umsetzen.
    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.



  • knivil schrieb:

    D.h. auch wenn das Ur-Lisp nicht lexical scoping umgesetzt hat, ist es doch stark im Lambda-Kalkuel verwurzelt.

    Es basiert nur oberflächlich darauf. Er hat sich inspirieren lassen, es aber nicht richtig umgesetzt.

    d) Zum Artikel von Kalkuel: Ich bevorzuge das. http://www.duden.de/rechtschreibung/Kalkuel_Taktik_Strategie .

    Es gibt da nichts zu bevorzugen, das eine Wort ist sächlich ("ins Kalkül ziehen"), das andere männlich ("der Lambda-Kalkül"). So ähnlich wie bei der/das Modul. Oder sogar der/das Teil, der/das Schild.


Anmelden zum Antworten